Programming/Houdini

[Houdini] Terrain Basic

와들S 2023. 7. 3. 21:06

※ 해당 모델링은 SideFX의 인강을 참고하여 만들었습니다.

 

output

 

1. Shaping Heightfield

Shaping nodes

모양을 잡는 방법에는 여러 방법이 있겠으나 인강에서 한 방법을 설명하겠다. 

인강에선 Noise노드의 Noise setting을 Worley Cellular F1으로 설정해 대강 산 및 계곡의 모양을 잡었다. 이 때 move축을 이용해 offset을 바꿔 모양을 바꿀 수 있다. 이후 blur와 distort를 얹고, 마지막으로 noise를 한 번 더 입혀 마무리한다. (아래 사진)

 

2. Creating Masks - Flow, Slope, Peak

각 마스크의 전체적인 노드 흐름은 다음과 같다. 

흐름을 보면, 먼저 mask by feature로 구간을 정해 마스크를 얹고, slump나 remap같은 작업을 한 후, copy layer 등을 하고, 마지막에 mask clear로 지운다. 

먼저 flow의 경우 make by feature로 대강 27~62 정도 구간을 마스크로 잡은 후, slump를 얹는다. 그럼 마치 풍화 작용한 듯이 지형이 형성된다. 

가운데 평평한 건 이 위에 remap을 했기 때문

리맵을 할 때는 먼저 compute range를 한 후 output 범위를 0~1로 맞춘다. 위에 flow라고 레이어 이름도 정해야 한다. 물 등의 액체가 흐를 지역을 정해주는 레이어이다. 

다음으로 slope 레이어에 대한 설명이다. mask by feature할 때는 아래처럼 설정한다. slope에서도 설정하고 direction도 켜서 angle 및 angle spread도 설정한다. 이후에 remap으로 평평한 지역을 만든 후 이 부분이 엉망이 되어 저 평평한 부분의 마스크가 제대로 안잡히는 오류가 생긴다. 추후에 한 번더 고쳐주든 다시 설정해주든 해야 한다. 나는 저 direction ramp graph를 건드려줬다. 

다했으면 copy layer로 slope란 이름을 destination에 넣은 후, 레이어를 복사하고 clear mask로 마스크를 삭제한다. 

마지막으로 peak 레이어다. mask by feature를 아래처럼 설정한다. 

이번에는 peaks and Valleys를 설정한다. 아래 graph도 설정해줘서 세세하게 마스크를 씌운다. 

이후 아까처럼 동일하게 copy layer 및 clear layer를 한다. 

 

3. HeightField Remap - Flat Field

해당 노드의 위치는 맨 위에서 모양 잡은 후의 바로 직후이다. 먼저 Compute Range를 한 후 0~300으로 높이 값을 재설정한다. 그 이유는 엔진에 가져갔을 때 바닥(=0)부터 시작하도록 하기 위함이다. 아래 그래프에서는 + 버튼을 눌러 두 점을 추가하고 Position으로 위치, Value로 높이를 설정한다. 그럼 해당 위치들에 해당 값을 가진 부분들이 저 두 개의 점으로 인해 평평한 평지가 생긴다. 마치 산에 길을 만드는 느낌이다. 하지만 이대로만 두면 너무 평지라 인위적인 느낌이 드므로 heightfield erode 노드를 추가한다. 

이 노드를 얹고, compute range를 해 범위를 계산한다. 아래에서 애니메이션 바 중 재생버튼을 클릭 해 재생시키면 시간에 따른 풍화 작용이 만들어진다. 또한 옆에서 볼 수 있듯이 water와 debris 레이어가 새로 생겼다. 

이 부분은 무척이나 재미있으나 이후 아래에 생기는 마스크들에 오류가 생길 수 있다. 나의 경우 100이면 100 확률로 생겼다. 그 오류란, 이후에 scatter 작업 시 레이어가 평지에 제대로 입혀지지 않아 나무 등을 심을 수 없다는 마스크 오류이다. 이 오류는 두번째 slope 마스크를 고쳐주면 보통 해결된다. 안될 경우 모든 마스크를 한 번씩 건드려보자. 인강에서는 그런 오류가 발생하지 않았다...

 

4. HeightField Visualize

여태껏 쌓아올린 레이어들을 Visualize(시각화) 하는 작업이다. 먼저 compute Range를 해 높이값을 계산한다. 다른 색들을 다 지우고 오직 검은색과 흰색만 남긴다. 다만 water의 경우 푸른 색으로 해두는게 보기 좋다. 

 

5. Scatter

높이 값에 따른 마스크를 입히므로 mask by feature 에서 height을 켜주고 평지부분만 마스크가 입혀지도록 값을 조절한다. 이 때, 위에서 서술한 오류를 해결하지 않으면 마스크가 제대로 입혀지지 않는다.

다음으로 할 작업은 scatter와 copy to points를 이용해 마스크를 씌운 평지 부분에 나무를 심는 작업이다. 

tube로 원뿔 형태를 만든 후 색을 잘 보이게 얹고, scatter와 copy to points를 이용해 심는다. mask를 scatter에 적용할 때는 3가지 input 노드 중 첫 번째 및 두 번째 노드를 두 개다 마스크로 연결한다. 이 때, scatter 설정은 아래처럼 한다.

keep incoming terrain, match normals with terrain, match direction with slope를 다 끈다. 특히 match normals 및 direction을 키면 나무가 위로 곱게 자라는게 아닌 terrain의 방향과 노멀(노멀벡터) 탓에 다른 방향으로 엉망으로 자라게 된다. 그 이후에도 여러 값을 잘 조절한다. 

다 끝냈다면 마스크를 지우고 scatter로 만든 것과 마스크 지운 terrain을 merge로 연결한다. 

마지막으로 이 모두를 subnet에 넣어 Digital Asset으로 만드면 끝난다. 언리얼이든 유니티든 export 해본다.

언리얼의 경우 먼저 파일을 export 해 화면에 드래그 한 후, 위치값을 전부 (0, 0, 0) 으로 초기화하면 바로 화면에 뜬다. material을 설정해 주고, 원뿔인 형태의 나무를 언리얼 에셋으로 바꿔준다. 

 

정말 기초고, 더 세부적인 내용을 공부 후 다른 게시물로 더 공부해야겠다. 

'Programming > Houdini' 카테고리의 다른 글

[Houdini] Terrain Handbook 3 (Dusty Biome - shaping)  (0) 2023.09.19
[Houdini] Terrain Handbook 1~2 (Basic)  (0) 2023.08.31
[Houdini] Organic Shapes  (0) 2023.07.17
[Houdini] Modular Building 1  (0) 2023.07.01