Minecraft와 유사한 동굴을 만드는 방법은 무엇입니까?


34

나는 지금 3D 절차 세계에서 일하고 있었고 동굴 시스템을 추가하기를 원합니다. 현재 지형을 생성하기 위해 2D / 3D Perlin Noise를 사용하여 더 부드러운 지형을 위해 Marching Cubes와 함께 사용하고 있습니다. 긴 상호 연결 동굴과 관련하여 나는 단지 혼란에 빠졌습니다.

나는 Minecraft의 동굴 시스템과 같은 것을 얻고 싶습니다. 그것들은 매우 밀접하게 연결되어 있고 거의 모든 방향으로 무작위로 분기되어 있으며 동굴의 거의 모든 지점이 전체적으로 상당히 동일한 반경으로 상당히 원형으로 보입니다 (최상의 표현은 아니지만 다른 방법을 잘 모르겠습니다) .

내가 원하는 동굴을 생성하기위한 가장 큰 도전은 세상을 즉시 생성하고 싶다는 것입니다. 월드는 현재 청크에 의해 청크에 의해 생성되며, 플레이어가있는 곳부터 시작하여 바깥 쪽에서 생성됩니다. 나는 세상을 만들고 싶지 않다. 그리고 방황하는 패턴, 셀룰러 오토마타 등을 사용하여 동굴을 파헤 치고 싶다.

이를 위해 사용할 수있는 잘 알려진 알고리즘이 있습니까? 그렇다면 누구나 비슷한 작업을 공유하고 싶습니까? 도움을 주시면 감사하겠습니다.

좋은 예 : 여기에 이미지 설명을 입력하십시오


5
여기를 살펴보고 아래로 스크롤 하십시오 .
William Mariager

지난 24 개월 동안 수행하려는 작업을 수행하는 방법에 대해 심도있게 논의한 게임 개발자 잡지 문제가 있습니다. 나는 그들의 사이트를 쳤다.
Joey Green

@JoeyGreen 잡지의 이름은 무엇입니까? 아니면 그들의 사이트에 대한 링크가 있습니까?
jumpnett

1
이것을 게임 개발자 잡지라고합니다. gdmag.com . 지난 10 년 동안 구독을하고 pdf 버전의 잡지를 얻을 수 있습니다. 가입하면 이전 문제를 검색하고 원하는 문제를 찾을 수 있습니다.
Joey Green

답변:


30

마인 크래프트의 동굴은 "펄린 웜"방식으로 생성됩니다. 발전기는 지형을 뚫고 터널을 뚫습니다. Minecraft 지형에 연결되지 않은 포켓을 남기는 경향이 있기 때문에 동굴 생성에 3D 펄린 노이즈를 사용 하지 않습니다 . 초기 알파 버전부터 3d Perlin 노이즈를 통해 Minecraft 동굴이 생성되지 않았습니다.

다음은 " perlin worm"방법으로 생성 된 Gnomescroll의 동굴입니다 .

Gnomescroll 동굴 시스템 1 인칭 시점 1

Gnomescroll 동굴 시스템 1 인칭 시점 2

Gnomescroll 동굴 시스템 3 인칭 시점 2

이들은 libnoise 튜토리얼의 libnoise "Perlin Worms"입니다. 이 기술은 Minecraft에서 생성 된 동굴을 면밀히 재현합니다.

리노 즈 튜토리얼 펄린 웜

스 네이 킹 매개 변수는 동굴 시스템의 품질에 영향을 미치며 동굴의 수직 및 방향 변경 속도를 결정합니다. 마인 크래프트 지점의 동굴과 동굴 터널의 반경은 동굴 길이에 따라 다릅니다.

마인 크래프트는 덩어리 단위로 동굴을 생성합니다. 필요한 접근 방식은 복잡하며 서버 모더의 관심에도 불구하고 아직 Minecraft의 동굴 생성기를 완벽하게 리버스 엔지니어링 한 사람은 없습니다.

가장 가능성이 높은 방법은 무한 맵이 생성되고 바깥쪽으로 확장 될 때 스 네이 킹 동굴을 덩어리로 생성합니다. 현재 청크의 동굴은 일부 N에 대해 가장 가까운 N 청크에있는 동굴 종자의 기능입니다. 청크 좌표의 함수 인 난수 생성기를 사용하여 동굴을 시딩하면 현재 청크의 동굴을 계산할 수 있습니다. 유한 청크 반경 내 청크 만 평가하면서 무한 맵.


3
이 "펄린 웜"에 대해 배울 수있는 정보 나 자료를 추가 할 수 있습니까?
David Gouveia

1
이것은 " perlin
HaltingState

꼭 필요한 것은 아니지만 마지막 단락을 자세히 설명해 주시면 대단히 감사하겠습니다. 웜을 생성하려면 웜당 시작점이 필요하다고 가정합니다. N은 웜의 최대 길이 인 모든 플레이어의 N 청크 내에 있어야합니다.
신화

3
정확하게. 각 웜은 시작점이 있으며 특정 청크 반경을 벗어나면 종료됩니다. 청크 좌표의 함수 인 의사 난수 시퀀스를 결정적으로 생성하는 난수 생성기가있다. 이 난수는 해당 노드에서 발생하는 웜의 위치와 수를 결정합니다. 웜도 분기 할 수 있습니다. 웜이 더 "로컬"하고 작은 청크 반경 이상으로 모험 할 수없는 경우 계산 부담이 줄어 듭니다.
HaltingState

어쩌면 내가 듣고 싶은 것이 아니라 내가 기대했던 것입니다. 다시 HaltingState 감사합니다. :)
신화

7

지형이 견고한 영역 내에 점 구름을 생성하여 다른 밀도로 실험 할 수 있습니다. 그런 다음 최소 스패닝 트리와 같은 알고리즘을 사용하여 모든 지점을 연결합니다. 이렇게하면 모든 영역에 도달 할 수 있습니다. 그런 다음 노드에서 노드까지 (즉, 두꺼운 복셀 라인) 큰 빈 공간 (공기로 구성됨)을 그립니다.


나는 이것이 당신이 의미하는 바를 정확히 이해하지 못할 수도 있지만, 세계가 생성함에 따라 덩어리별로 어떻게 이것을 할 것입니까?
신화

가능한 한 가지 방법은 각 청크 내에서 최소 스패닝 트리를 별도로 생성 한 다음 두 청크 사이에서 가장 가까운 두 노드를 찾아 각 청크를 연결하는 것입니다. 청크가 기본 터 레인 알고리즘으로 채워진 후 최소 스패닝 트리 주위로 속을 비울 수 있습니다.
Gavan Woolery

1
또 다른 (쉬운) 해결책은 덜 효율적이고 아마도 "잡음"이지만 경로를 개척하기 위해 브라운 운동을 사용하는 것입니다 (개미가 무작위로 파는 개미와 같은 종류).
Gavan Woolery


1

노이즈 기능을 사용하여 모든 청크에 대한 값을 할당하여 터널이 있는지 여부를 결정한 다음이를 사용하여 동굴을 배치 할 위치를 결정하십시오. 터널을 원한다면 더 많은 노이즈 기능 (시드가 다른)을 사용하고 값을 사용하여 터널이 있는지 확인하십시오. 그런 다음 일반적인 "그리기"기능을 사용하여 터널을 만듭니다. 모든 것을보다 사실적으로 만들려면 더 많은 노이즈를 사용하여 상기 동굴 / 터널의 원점에 대해 임의의 변위를 수행하십시오.

여러 노이즈 함수를 사용하지 않으려면 예를 들어 (2,2,2) 청크에 대해 noise3d (2,2,2)를 수행하는 것보다 더 먼 거리에서 프로브 할 수 있습니다 .Noise3d (2,2, 16) 한 값에는 (2,2,16), 두 번째 값에는 (2,2,17) 등을 사용하십시오. 그러면 모든 값을 독립적으로 또는 짧은 스케일로 상관 시키도록 주파수를 조정하십시오.

전 세계에서 동굴 밀도를 변화 시키려면, 상기 값에 영향을 줄 저주파수 기능을 사용하십시오.

이로 인해 복잡한 동굴이 생길 경우, 단순히 상호 연결된 지점의 거리를 늘리거나 알고리즘을 조정하십시오.

Minecraft가 이와 같은 동굴을하는지 확실하지 않지만 (그렇지만 그렇게 생각하면)이 솔루션은 만족스러운 결과를 산출해야합니다.


-5

여기 있습니다

위의 동굴과 같은 대부분의 동굴은 Perlin 웜을 사용하지만 일부 사람들은 수동으로 처리합니다. 이런 식으로 그들은 블록을 정확하게 차단하는 방식으로 만들 수 있습니다. Perlin 웜 을 사용하여 만든 동굴은 정확하지 않을 수 있으며 5 피트 높이와 6 피트 너비의 동굴 만 만들 수 있습니다. 10 피트 높이와 15 피트 너비의 동굴을 원한다면 정확하지 않을 수 있습니다.

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