노이즈 알고리즘을 활용하여 건축하기
노이즈 알고리즘을 활용하여 보다 자연스러운 구조물을 만들어 봅니다.
- #정보
- #WorldEdit
- #FAWE
*해당 문서는 독자가 WorldEdit에 대한 기본적인 지식과 경험을 가지고 있다는 전제 하에 작성되었습니다.
마인크래프트에서 자연스럽게 블록을 배치하고자 하는 경우는 꽤 많습니다. 단일 블록으로 구성된 도로가 심심해보일 때나, 녹지의 식생을 꾸밀 때처럼 말이죠. 하지만 의식적으로 자연스러움을 재현하는 것은 힘든 일입니다.
사람마다 패턴을 인식하고 이해하는 능력이 다르기에, 보편적인 시각에서의 자연스러운 구조물을 만드는 것은 어려울 수 있으며, 작은 부분으로부터 전체의 느낌이 크게 좌우되는 때가 많으므로 특정한 기법 없이는 높은 집중력과 신중함을 요구합니다. 작업 규모가 커질 수록, 이에 소요되는 시간과 노력은 더욱 크게 늘어납니다.
패턴?
WorldEdit에는 패턴이라는 체계가 있습니다.
패턴은 선택된 영역이 어떤 블록들로 변경될지 결정합니다.
이미 알고 계셨을 수도 있지만, 흔히 사용하는 //set
, //fill
명령어의 첫번째 매개변수와 //replace
명령어의 두번째 매개변수는 블록 또는 블록 집합이 아닌 패턴입니다.
예를 들어, //set grass_block
명령어에서는 grass_block
이 패턴입니다. 정확히는 단일 블록 패턴(Single Block Pattern)이라고 부릅니다. grass_block,stone
과 같이 쉼표로 구분된 형식의 인수를 입력한 경험이 있다면 무작위 패턴(Random Pattern)을 사용한 것입니다.
이러한 내용을 굳이 왜 엄밀하게 정리하는지 의아하실 수 있습니다.
하지만 WorldEdit의 블록을 교체하는 어떤 명령어가 받는 매개변수가 단순히 블록이라고 생각한다면, 뒷 내용들이 낯설 수 있기 때문입니다.
자연스러움에 대하여
WorldEdit에서 흔히 블록을 무작위적으로 배치하고자 할 때 다음과 같은 명령어를 사용합니다.//set stone,deepslate
, //set 50%stone,50%deepslate
어떠한 경향도 없이 무작위적으로 배치된 블록들이 자연스러워 보이시나요?
자연에서 발견되는 많은 구조와 현상들은 일정한 규칙을 갖습니다. 그러한 것들은 대개 연속적인 변화와 점진적인 이동으로 형성됩니다. 자연스럽다는 것은 다소 상대적인 개념이지만, 무작위적인 것이 꼭 자연스럽지는 않다고 할 수 있습니다.
위와 같이 배치된 블록들은 각 블록이 독립적으로 선택되기 때문에 인접하는 블록 간 연관성이 없습니다.
완전히 무작위로 선택된 블록들은 인접한 블록 사이에 어떠한 패턴과 연속성을 가지지 않기 때문에, 이는 시각적으로 혼란스러워 보일 수 있습니다.
해결책
그렇다면 어떤 해결책이 있을까요?
많은 경우에 WorldEdit 또는 VoxelSniper의 브러시(Brush)를 사용합니다. 이는 수작업이지만 좀 더 넓은 범위에서 여러 블록들을 동시에 수정할 수 있습니다. 하지만 여전히 사용자의 경향이 반영될 수 있으며, 누군가에게는 번거롭거나 어려운 일일지 모릅니다.
WorldEdit의 CraftScripts를 이용하면 JavaScript를 활용해 요구사항에 부합하는 노이즈 알고리즘 또는 기타 솔루션을 직접 제작할 수 있습니다. 하지만 프로그래밍과 알고리즘에 대한 지식이 필요합니다.
프로그래밍 지식을 가진 건축가는 흔하지 않을텐데, 좀 더 쉬운 방법은 없을까요?
FAWE의 노이즈 패턴
WorldEdit의 포크인 FAWE(FastAsyncWorldEdit)에는 성능적인 향상과 함께 기능적인 확장도 포함되어 있는데, 그 중 하나가 여러 노이즈 패턴입니다.
노이즈 알고리즘은 절차적 텍스처 생성, 지형 생성, 유체 VFX 등에 사용됩니다.
인접한 값들 사이 연속성이 존재하므로 보다 자연스러운 변화를 만들 수 있습니다.
앞서 이야기한대로 자연은 완전히 혼란스럽지 않기 때문에, 노이즈 알고리즘을 활용하면 이와 비슷한 규칙적인 무작위성을 재현할 수 있습니다.
FAWE의 일부 패턴은 명령어 체계와 비슷하게 필수 또는 선택적으로 입력해야 하는 매개변수가 존재합니다.
해당 경우, 패턴과 함께 각 자리를 대괄호로 구분하여 값을 입력해야 합니다.
(e.g. //replace grass_block #linear2d[white_wool,black_wool][2][2]
)
FAWE에서 입력할 수 있는 모든 노이즈 패턴들의 매개변수는 스케일과 패턴으로 한정되어 있어 지형 생성과 같은 일은 어려울 수 있습니다. 따라서 본문에서는 칠(Paint)과 같은 보다 단순한 용례를 다루도록 하겠습니다.
Simplex
#simplex <스케일=10> <패턴>
주로 표면의 세밀한 질감을 표현하는 데 사용됩니다.
WorldEdit에서는 마스크(Mask)로 하여금 사용할 수 있습니다.
Perlin
#perlin <스케일=10> <패턴>
유기적인 모양의 노이즈를 생성합니다.
Voronoi
#voronoi <스케일=10> <패턴>
점들로 하여금 공간을 분할하여 다각형 형태의 패턴을 생성합니다.
도시 구획을 나누거나 농장 건축 등에 사용할 수 있습니다.
Ridged Multifractal
#rmf <스케일=10> <패턴>
세부적인 지형 생성에 유용합니다.
Ridged(등이 있는)에서 알 수 있듯 능선이 있는 산맥을 생성하는 데 적합합니다.