[유니티] 절차적 지형 생성 4 - 3D Noise

박근영·2021년 6월 8일
0

PCG

목록 보기
9/10
post-thumbnail

목표

3D 노이즈를 사용하여 지형의 깊이와 동굴을 생성한다.


3D 노이즈

우리가 흔히 노이즈라 하면 2차원 평면상의 형태를 떠올리기 쉽지만 3차원 노이즈 또한 제작하는 것이 가능하다.

float perlinValue = Mathf.PerlinNoise(xCoord, yCoord) * 2 - 1;

위 코드는 기존의 평면 노이즈를 제작하는 코드이다. 이 코드를 아래의 코드로 바꿔준다.

float xy = Mathf.PerlinNoise(xCoord, yCoord);
float yz = Mathf.PerlinNoise(yCoord, zCoord);
float xz = Mathf.PerlinNoise(xCoord, zCoord);
float yx = Mathf.PerlinNoise(yCoord, xCoord);
float zy = Mathf.PerlinNoise(zCoord, yCoord);
float zx = Mathf.PerlinNoise(zCoord, xCoord);
float perlinValue = (xy + yz + xz + yx + zy + zx) / 6f * 2 - 1;

그러면 아래 사진과 같은 결과를 얻을 수 있다.

그러나 현재 지형 상태는 노이즈 값이 특정 값 이상인지 아닌지를 기준으로 판단해서 블록을 채웠기 때문에 기존 2D 노이즈와는 달리 지형의 높낮이가 표현되지 않는다.

지형의 굴곡을 표현하기 전에 생각해야할 것이 있다. 지형의 특성을 생각해보면 y값이 작아질수록 지형이 존재해야하고 y값이 커질수록 지형이 없어져야한다. 왜냐하면 y값이 작아지면 블록을 채워서 땅을 만들어야하고 y값이 커지면 블록을 없애서 지형의 굴곡을 만들어야하기 때문이다.

그래서 아래와 같은 코드로 y값에 따라 노이즈의 값을 변화시켜주었다.

perlinValue * scaleHeight + minHeight - y;

여기서 scaleHeight값은 지형 굴곡도에 해당하고 값이 커질수록 노이즈 값의 격차가 커져서 지형의 굴곡 변화가 더욱 분명하게 드러난다. minHeight값은 지형의 최소 높이로써 지형 굴곡 변화의 기준 좌표가 된다.

이렇게 변화된 노이즈 값이 0보다 크면 블록을 채우고 0보다 작으면 블록을 채우지 않는다.

아래 사진을 보면 이전 평면 노이즈와는 달리 지형의 굴곡도가 추가되고 동굴과 같은 모습이 생긴 것을 확인할 수 있다.


문제점

이전 포스팅 까지는 최적화에 신경을 많이 써서 청크가 로딩될 때도 프레임 드랍 없이 로드되었는데, 3D 노이즈를 추가하고 나서는 최적화로도 감당이 안 되어서 동적으로 맵을 생성하기보다는 정적으로 맵을 생성하는 방향으로 목표를 전환했다.


참고한 사이트

https://www.youtube.com/watch?v=Aga0TBJkchM
https://devanzblog.wordpress.com/category/voiceroidrpg/

profile
게임 개발자를 지망하는 학생입니다. 블로그 이전했습니다. https://1217pgy.tistory.com/

0개의 댓글