본문 바로가기

이론

동적으로 섬 생성하기 - 3 (노이즈를 사용한 지형 생성)

지난 시간에는 바이옴을 다각형으로 나눠봤습니다.

궁극적인 목표는 결국 섬을 생성하는 것이기 때문에, 이번 시간에는 지형을 생성해 볼 것입니다.

 

 

출처 : https://ko.wikipedia.org/wiki/%EC%A7%80%ED%98%95

 

우리가 사는 지구의 지형은 불규칙적입니다.

섬의 형태도 불규칙적이고, 대륙의 형태도, 해류의 형태도 불규칙적입니다.

그렇기 때문에 지형 생성은 특별한 규칙으로 생성하기보단, 무작위성을 이용하는 편이 간단합니다.

 

저희는 노이즈를 무작위로 생성함으로써 섬을 만들어보려고 합니다.

그러나 모든 픽셀이 다른 픽셀에 영향을 끼치지 않고 무작위성을 띈다면 기대한 결과가 나오긴 힘들 것입니다.

 

랜덤하게 생성한 노이즈. 어우... 보기만 해도 어지럽다

좋은 난수 생성기는 생성된 수 사이에 관계가 없고 어떠한 패턴도 보이지 않습니다. 약간의 무작위성은 유기적이고 살아있는 듯한 행동을 프로그래밍 하는 데 좋습니다. 하지만 무작위성을 유일한 원칙으로 사용하는 것이 무조건 자연스러운 것은 아닙니다.

(출처 : ko.khanacademy.org/computing/computer-programming/programming-natural-simulations/programming-noise/a/perlin-noise)

모든 픽셀이 무작위로 생성된 노이즈입니다. 이 인용구로 저 노이즈의 감상을 대신하겠습니다.

보통 섬의 육지는 서로 붙어있는 경향이 있는데, 이런 방식은 경향성이 없기 때문에 영 어울리지가 않습니다.

 

 

무작위로 생성된 펄린 노이즈.

그렇기 때문에 저희는 펄린 노이즈를 사용할 것입니다.

이 노이즈는 절차적으로 생성되며, 난수가 이전 결과의 영향을 받습니다. 

사진에서 보시다시피 꽤나 부드러운 노이즈가 생성됩니다. (적어도 전에 올린 사진보단요)

 

기본적으로 섬 생성에 필요한 펄린 노이즈에 들어갈 중요 파라미터는 3가지가 있습니다.

 

  • 시드 (seed)
  • 주파수 (frequency)
  • 옥타브 (octave)

먼저 시드(seed)는 다들 아실거라 믿습니다.

한마디로 정리하면 노이즈의 무작위 생성을 위한 값입니다.

 

주파수(frequency)는 노이즈의 간격과 관련된 값입니다.

주파수가 클수록 노이즈가 세밀해집니다.

 

좌 : 고주파 노이즈, 우 : 저주파 노이즈

 

옥타브(octave)는 여러 주파수의 노이즈를 중첩시킬 때 쓰는 값입니다.

옥타브는 노이즈를 생성할 진동의 진폭(색상의 범위)과 주파수와 연관되어 있습니다.

옥타브가 커질수록 높은 주파수와 낮은 진폭의 노이즈가 새로 중첩됩니다.

이런 방식으로 여러 노이즈를 중첩해 만든 노이즈를 프랙탈 노이즈(fractal noise)라고 합니다.

 

이미지 출처 : https://www.slideshare.net/sunwungjin/ss-35289909

사진에서 보시다시피, 저주파로 만든 펄린 노이즈는 색상이 서로 붙어있는 경향성이 크지만 외곽이 부드럽고,

고주파로 만든 펄린 노이즈는 경향성이 옅어지지만 외곽이 세밀해 거칩니다.

그렇기 때문에 저주파 노이즈와 고주파 노이즈끼리 합친다면

지형이 서로 붙어있으면서도 외곽이 적당히 거칠게 만들 수 있을 것입니다.

 

요약 : 지형의 형태는 펄린 노이즈를 이용해 만들 것인데,

펄린 노이즈의 옥타브를 적당히 높여 여러 주파수의 노이즈를 합친 프렉탈 노이즈를 만드는 것이 좋다.