Perlin 웜으로 동굴 생성


12

현재 3D Simplex Noise로 복셀 지형과 같은 Minecraft를 생성하려고하며 동굴을 구현하려고합니다.

스레드 에서 Perlin Worms의 방법을 찾았습니다 . 그러나 나는 덩어리 단위로 덩어리를 생성하는 방법에 대한 단서가 없습니다. 이것이 가능합니까 아니면 덩어리 단위로 동굴과 비슷한 벌레를 만드는 대안이 있습니까?

편집 : 이것은 해결 방법을 모르는 문제입니다.

EDIT2은 : 단방향 노이즈 하이트로 2D Multifractal 래치의 노이즈를 조합의 결과이다. 여전히 약간의 조정이 필요하지만 이것은 내가 원하는 결과와 거의 같습니다. Byte56 덕분에.


가능한 경우 지형 생성에 직접 수식을 사용해야합니다. 좌표를 기준으로 인접 좌표에 대한 정보없이 복셀을 계산할 수 있다면 청크는 더 이상 문제가되지 않습니다. 각 복셀에 대해 개별적으로 계산할 수없는 펄린 웜을 사용하려면 링크 된 질문에 대한 대답의 마지막 단락을 살펴보십시오.
danijar

1
기본적으로 그것은 저의 질문입니다. 기본 지형은 주어진 좌표로 계산하기 쉽지만 동굴이 있는지 여부에 관계없이 계산 방법을 모르겠습니다.
user000user

답변:


5

대부분의 펄린 노이즈 알고리즘을 사용하면 다음과 같이 특정 위치에서 노이즈 값을 검색 할 수 있습니다 noise(x,y,z). 이것은 청크 단위로 청크를 생성하는 것이 매우 사소한 일입니다. 청크 위치 대신 전역 위치를 전달하기 만하면됩니다.

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

보시다시피, 청크 경계를 반복하고 해당 글로벌 위치가 견고한 지 여부를 확인하여 청크에 대한 지형을 생성하고 있습니다. 이것은 일반적으로 지형을 생성하는 데 사용하는 방법과 동일합니다.

perlinNoise.get전역 위치를 취하고 밀도를 반환합니다. isSolid복셀이 "충분히 밀도가 높은"지 여부를 확인하기위한 간단한 테스트가 필요한 곳 은 어디 입니까?

perlinNoise.get단순한 노이즈 알고리즘보다 더 복잡 할 수 있습니다. 당신은 당신의 세계에서 복셀의 깊이에 따라 검사를 할 수 있습니다. 예를 들어 복셀이 "절대베이스 그라운드 레벨"이라고 결정한 것보다 낮 으면 펄린 웜 알고리즘을 사용하여 밀도를 반환 할 수 있습니다. 절대베이스보다 높으면 일반 밀도 함수를 사용하여 더 다양한 지형. 그러나 둘 사이의 혼합을 권장합니다.

다른 Perlin 노이즈 기능을 결합하는 것은 당신이 가지고 노는 것과 작동하는 것을 보는 것입니다. 게임을 다시로드하지 않고도 일부 값을 변경하고 지형을 핫 스왑 할 수 있도록 환경을 설정하는 것이 가장 좋습니다. 행복한 실험.


2
답변 해주셔서 감사합니다. 그러나 "일반적인"Perlin 또는 Simplex Noise를 사용하여 웜과 같은 동굴을 만드는 방법을 모르겠습니다. 그들은 구형이거나 한 방향으로 확장되거나 그리 길지 않습니다. Perlin Worms 알고리즘의 경우 헤드 위치를 모르고 현재 위치가 웜 안에 있는지 여부를 확인하는 방법을 모르겠습니다.
user000user

1
웜 알고리즘은 "헤드 위치"를 아는 것에 의존하지 않습니다. 당신이 말하는 것에서, 문제는 덩어리 단위로 잡음을 생성하는 것이 아니라는 것 같습니다. 펄린 웜을 구현하기 위해 링크 한 질문에 대한 자습서가 있습니다. "일반적인"지형을 생성하는 방법은 여기에서 찾을 수 있습니다 .
MichaelHouse

3D Simplex Noise를 사용한 기본 지형 생성은 잘 작동하지만 청크 내부의 웜 위치 / 세그먼트를 결정하는 방법을 모르겠습니다. 내가 이해 한 바에 따르면, 웜에 헤드 위치와 n 개의 세그먼트를 제공하고 노이즈 함수를 사용하여 세그먼트 사이의 각도를 계산합니다. 여기에 더 나은 내 문제가 무엇인지, 설명 할 수있는 이미지입니다 : 링크 .
user000user

2
다른 유형의 소음이 있습니다. 헤드 위치를 사용하고 다음과 같은 방법이 있습니다. 이 페이지 하단 근처를 살펴보면 먼저 머리 위치가 필요하지 않고 원하는 종류의 노이즈를 생성하는 노이즈가 있습니다.
MichaelHouse

힌트를 주셔서 감사합니다. 3D Ridged Multifractal Noise를 구현했지만 그 결과는 다소 불만족 스러웠습니다. 2D 하이트 맵과 2D를 결합한 다음 다시보고하려고합니다. 이것은 더 벌레 같은 동굴을 만들 수 있습니다.
user000user

3

이것이 Minecraft에서 작동하는 방식이라고 생각합니다. 각 웜은 최대 길이를 갖습니다 (이것을 호출하겠습니다 M). 각 웜의 헤드는 청크 위치에 따라 계산됩니다. 각 청크를 렌더링 할 때는 M반경 내의 모든 청크를 확인하고 모든 웜을 따라야합니다. 성능면에서 이상적이지는 않지만 작동합니다.

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