웜 스타일 지형을 생성하려면 어떻게해야합니까?


48

나는 웜 스타일의 게임을 만들고 있는데 절차 적으로 지형을 생성하고 싶습니다. 이전에는 펄린 노이즈를 사용하여 많은 지형 생성을 수행했으며이 게임에 사용하기 시작했습니다. 그것의 유일한 문제는 그것이 너무 단순하고 지루해서 나에게 언덕을 주지만 내가 원하는 복잡성은 없다는 것입니다. 나는 동굴과 교수형 산과 같은 특징을 갖고 싶습니다. 나는 떠 다니는 섬과 같은 것을 신경 쓰지 않습니다. 이와 같은 것이지만 더 미쳐도 괜찮습니다.

여기에 이미지 설명을 입력하십시오

먼저 클래식 펄린 노이즈를 사용하여 지형을 생성 한 다음 부품을 제거하여 동굴을 만들거나 그렇지 않은 것을 생각했지만 해당 부품의 제거를 안내하는 데 어려움을 겪고 있습니다. 그러한 지형을 생성하는 대안이 있습니까?


빨간색은 동굴을 나타내거나 지형의 일부입니까?
Richard Marskell-Drackir

지형의 일부입니다. 나는 단지 그 이미지를 구글로, 내가 성취하고 싶은 것에 가장 가깝습니다. "동굴"부분은 왼쪽의 지형 내부에서 더 계속 진행된 경우 오른쪽에있는 작은 구멍 일 수 있습니다.
Xeon06

@Drackir는 이미지를 편집했습니다.
Xeon06

관련 : gamedev.stackexchange.com/questions/6721/… (하지만 구현 알고리즘과 생성 알고리즘에 중점을 두는 것처럼 중복되지는 않습니다).
Josh

@JoshPetrie 참으로. 나는 파괴에 능숙하다. 내가 곤경에 처한 세대입니다.
Xeon06

답변:


51

2D Perlin-noise로 시작하는 것이 좋습니다. 이 같은:

펄린 소음

그런 다음 이미지에 임계 값을 적용하여 다음과 같이 여러 개의 고립 된 섬을 얻습니다.

임계 값이있는 펄린 노이즈

0.04의 임계 값을 선택했습니다. 임계 값 위의 모든 항목은 파란색으로 표시됩니다. 나머지는 검은 색입니다. 그런 다음, 어떤 "섬"을 유지하고 어느 것을 버릴지를 결정해야합니다.

가능한 접근 방법은 이미지를 왼쪽에서 오른쪽으로 다양한 높이에서 실행하고 일정한 확률로 교차 "섬"을 선택하는 것입니다. 예제 그림에서 가장 낮은 선의 확률은 100 %이므로 교차하는 모든 섬이 선택됩니다 (흰색으로 채워짐). 두 번째 줄의 확률은 50 %이고 맨 위 줄의 확률은 10 %입니다.

일단 섬이 그렇게 표시되면, 형태 학적 연산 을 적용하여 사이의 간격을 좁힐 수 있습니다 ( 확장 )

확장 된 섬

그리고 가능한 풍경이 있습니다.

소음의 "과립도"는 세상의 세부 사항이 얼마나 작아 질지를 결정합니다. 따라서 이러한 값을 실험 해 보는 것이 가장 좋습니다.

또한 "선택 라인"의 위치와 위치에 따라 결과가 크게 달라집니다. 이미지 상단 근처에 섬을 "선택"할 가능성이 높은 선이 있으면 일종의 동굴 조경 등을 만들 수 있습니다.


훌륭하고 자세한 답변을 주셔서 감사합니다! 이것이 바로 내가 할 일입니다.
Xeon06

이러한 수준의 세부 사항과 같은 펄린 노이즈 생성에 대한 팁이 있습니까? 나는 저녁 내내 노력했지만 아무데도 가지 않습니다.
Xeon06

@ Xeon06 방금 플래시에서 제공 하는 Perlin 노이즈 기능을 사용하고있었습니다 . 매개 변수는 및 1 옥타브에 24대한 baseX것이며 baseY그레이 스케일 노이즈를 출력하고 "프랙탈"을 비활성화했습니다. 이것을 어떤 언어로 구현하고 있습니까?
bummzack

JavaScript로 구현하고 있습니다. 나는 일주일 동안 비슷한 결과를 제공하지만 아무것도 찾을 수없는 훌륭한 구현을 위해 웹을 닦고있다.
Xeon06


6

펄린 노이즈로 시작해서 조심스럽게 필터링했습니다. 떠 다니는 섬으로 질문에 첨부 된 그림과 같은 것으로 끝날 것입니다. 여기서 논의 된 것과 같은 계산 알고리즘을 사용하여 플로팅 아일랜드를 제거 하십시오.


아, 이제 알겠다 1D가 아닌 2D 펄린 노이즈를 사용해야합니다. 상기 필터링에 대해 자세히 설명해 주시겠습니까?
Xeon06

2
지금은 그림을 게시 할 수 없지만 간단한 임계 값 필터에 대해 이야기하고 있습니다. a-la if (0.3> pixelValue> 0.5) KeepIt () ;. '주의 깊게'비트는 0.3과 0.5를 얻는 것입니다. 상단에서 높은 알파로 시작하여 하단에서 점차적으로 0에 도달하는 선형 (또는 그렇지 않은) 그라디언트를 가질 수 있으므로 하늘을위한 공간이 있으며 땅이 대부분 채워집니다. 희망이 도움이됩니다.
Ravachol

@Ravachol 사진에 대한 링크를 게시하면 더 많은 담당자가 귀하의 게시물에 추가 할 수 있습니다.
Richard Marskell-Drackir

"if (0.3> pixelValue> 0.5)", 이건 오타 일 것 같지만 게시물에 모순되는 내용이 혼동 될 수 있습니다 ... 편집 해 주시겠습니까?
jcora

댓글을 편집 할 수 없습니다. 분명히 "if (0.3 <pixelValue <0.5)"를 읽으십시오.
Ravachol

4

나는 실제로 bummzack 우수 답변에서 시작하여 이것을 구현했습니다.

내가 끝내었던 단계는 다음과 같습니다.

  1. 펄린 노이즈로 이미지 생성
  2. 지형을 원하는 플러드 필
  3. 너무 작은 중공을 제거하기위한 팽창 + 침식
  4. 터 레인 내부의 나머지 배경 영역 제거
  5. 안티 앨리어싱

그리고 이것은 결과의 예입니다. 생성 된 지형의 예

여기에 전체 프로세스에 대한 자세한 기사를 작성 했으며 코드 (JavaScript)는 오픈 소스입니다 . 사용할 준비가 되었으면 확인하십시오 .)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.