본문 바로가기
유니티/절차적 생성

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

by 개발자 박근영 2021. 11. 15.

목표

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/

 

VoiceroidRPG – DEV.ANZ

마인크래프트(Minecraft), 테라리아(Terraria), 그리고 아이작의 번제(The binding of Isaac) 등, 어떤 게임들은 그때 그때 다른 모습의 레벨들을 자동으로 생성한다. 이렇게 정해진 규칙으로 게임 내의 컨텐

devanzblog.wordpress.com

 

댓글