TWA Houdini1/Volumes

TWA 후디니 1 Volume_03_02 : Volume 계산능력 향상 필수

yiss09 2023. 2. 16. 14:49

https://www.twahoudini.com/course/volumes1

 

HOUDINI1_ VOLUMES

2️⃣ 볼륨의 기초이론과 응용 그리고 SIMULATION까지 경험해보세요.

www.twahoudini.com

 

Volume03_part2에서는 Volume에서의 계산능력 향상을 위한 node들을 배워보겠다.

 

1. Name, Volume SDF

2. Convert VDB

3. Volume Merge, VDB Combine

4. Volume Blur, VDB Smooth

 


1. Name, Volume SDF

 

새로운 node를 활용해보기 위해 기본셋팅을 해주겠다.

Container의 역할을 할 Volume을 하나 생성해준다. Div size를 0.02까지 낮춰준다.

 

Volume Vop에서 방금 생성한 Container에 Turbulent Noise가 더해진 Rubber Toy 형태의 Volume을 더해준다.

이때 Turbulent Noise를 voxel의 vector 정보를 받기 때문에 3D Noise, 구름과 같은 느낌을 주기 위해 Zero Centered Perlin Noise로 설정해준다. 적당히 Frequency와 Roughness값을 올려 원하는 느낌을 찾아준다(구름 같은 느낌).

 

새로운 Rubbertoy를 생성해 Volume으로 만들어준다. 이름은 "toy"로 설정해주었다.

Volume Visualization을 통해 toy Volume의 density 값을 색깔로써 볼 수 있게 만들어주었다.

 

바로 옆에서는 IsoOffset을 이용해  SDF Volume을 만들어주었다.

SDF Volume은 안개의 형태가 아닌 SDF가 0인 값들 위를 면으로 덮어 형태를 갖춘 느낌이기에, Primitive Properties node를 달아 Smoke의 형태로 변환해준다.

이후 Box 같은 Fog의 형태로 변환된 Fog Volume을 Volume SDF를 활용해 SDF Volume으로 변환시켜 준다. 다시 Rubber Toy의 형태를 갖추었다.

Volume Visualization에서 색깔로써 원하는 범위를 확인할 수 있게 해주었다.

이제 기본셋팅이 마무리되었다.

 

새롭게 배워볼 node는 Name node로 Volume의 이름을 바꿔준다.

이때 node에서 2가지 방법을 활용해 이름을 바꿔줄 수 있는데, 반드시 둘 다 Class는 Primitive로 설정해주어야 한다.

1. Number of Namings를 통해 이름을 바꿔주게 된다면 변경하게 될 이름을 Group의 형태로 불러오게 된다. 그 뒤 아래에 새로운 이름을 작성해준다. Node Info에서 변경된 이름을 확인할 수 있다.

2. Number of Renames에서는 Group의 형태가 아닌 직접 변경할 Volume의 이름을 작성하게 된다. 새로운 이름을 작성해주는 방식은 같다.

 

Name node가 아닌 Attribute를 활용해서 Volume의 이름을 변경할 수도 있다.

Geometry Spreadsheet의 Primitives를 확인해보면 변경 전의 name은 초기에 설정해둔 container로 되어있다.

Geometry Spreadsheet의 Primitives으로 확인 가능하기 때문에 Attribute Wrangle로 변경이 가능하는 것을 알 수 있다.

Attribute Wrangle의 Runover를 Primitives로 설정해준다. @name에 container라는 내용이 존재하기 때문에 그 내용을 직접적으로 변경해준다. Geometry Spreadsheet에서 이름이 "fog"로 변경된 것을 볼 수 있다.

 

이렇게 Attribute Wrangle이나 Name node를 활용해 이름을 변경해준 다음에 Volume Visualization에서의 불러올 Volume의 이름도 변경해준다.

Attribute Wrangle을 활용한 방식은 들어오는 @name에 대한 정보를 모두 일관되게 새롭게 지정해둔 이름으로  변경시켜준다. 이에 Volume Visualization과 하나로 연결지어 사용해주게 된다면, 편리하게 여러 Volume을 갈아 끼워 확인할 수 있게 된다.

Name node를 활용한 방식은 하나하나 이름을 지정해주어야 해서 불편한 감이 없지 않아 있다. 하지만 하나의 Volume을 두 가지 다른 이름의 Name으로 만들어 Merge하여 사용해야하는 특수한 경우에서는 유용하다.

어느 하나의 방식만을 굳이 사용하기보다는 상황에 맞게 적절한 방식을 택하도록 하자.

 

추가적으로 Volume SDF에 대한 설명이다. Volume SDF는 Fog Volume을 SDF Volume으로 변환시켜주는 node이다.

Iso Surface의 값이 0일 때는 Volume이 시각화되지 않는다. Volume을 시각화시키기 위해선 아주 작은 값이라도 넣어 주어야된다.

Invert를 사용해 SDF 0를 기준으로 density를 반전시킬 수 있다.

 


2. Convert VDB

 

지금까지의 Geometry에서 앞으로 필요한 부분을 제외한 나머지는 모두 제거해주었다.

1. Fog Volume과 SDF Volume을 확인 할 수 있는 Volume Visualization을 살려주었다. 이때 각각의 Volume Visualization 위에는 Attribute Wrangle을 달아 해당 용도에 맞게 이름이 변경되도록 해주었다. Network Box로 각각 묶음 처리해주었다.

2. Null node로 어떤 node가 어떠한 결과를 내는지 확인하게 쉽게 Labeling 해주었다.

 

Convert VDB는 Volume간의 Type을 변경해주는 node이다.

fog_cloud는 원래 Volume이었으나, Convert VDB node를 달아 VDB로 전환해준 뒤에는 VDB로서 확인이 가능해진다.

Node Info를 확인해보면 VDB로 변경된 것이 확인이 가능하며, 해상도가 변경된 것을 확인할 수 있다.

 

Scene view에서의 Volume과 VDB는 같은 모습을 같는다.

 

SDF Volume을 SDF VDB로 변경해준다면 SDF 값에 의해 Rubber Toy 내부는 음의 값을 가져 텅 비게 되고, 외부는 양의 값을 가지게 되어 꽉 차게 된다.

이때 Volume Visualization을 달아 -1 ~ 1 사이의 값의 밀도를 fit 해준다면 내부의 밀도값 또한 색깔로서 확인 가능해진다.

이때 Scene view 상에서의 SDF Volume과 SDF VDB의 Volume Visualization 결과는 동일하게 보인다.

 

VDB Class를 변경해준다면 Volume Fog에서 VDB SDF로 변경해줄 수 있다. IsoSurface의 결과가 나온 것을 볼 수 있다.

SDF VDB에 Volume Visualization을 달아준다. 예상했던 결과가 아니라 주황색 배경으로 가득찬 모습을 볼 수 있다.

 

이러한 현상이 발생하는 이유는 SDF의 값이 0인 곳을 기준으로 일정값이 넘어간다면 효율에 의해 정보를 구할 필요가 없어진다. 그렇기에 색이 붉은색과 가깝게 변하게 되는 것이다.

원하는 모습으로 수정해주기 위해 Density Ramp에서 0.5보다 큰 값 즉 -1 ~ 1 사이의 실제 0보다 큰 값의 범위를 줄여준다. 필요없는 부분을 보이지 않게 두었다.

만약 붉은색의 느낌이 덜하다면 Diffuse Ramp에서 붉은색을 노랑색에 좀 더 가깝게 배치해주자.

 

SDF Volume를 Fog VDB로 변경해주었다. SDF가 아니게 됨으로써 SDF 0을 기준으로 음수와 양수의 값이 반전되었다.

 

Fog Volume과 Fog VDB를 나란히두어 비교해보았다.

Fog Volume에 비해 Fog VDB의 사이즈가 약간 작은 느낌이 든다.

 

이는 실제로 존재하지만 보이지 않는 것일 뿐이기에 Density Ramp에서 낮은 밀도 구간의 값을 올려줌으로써 해결하였다.

 

만약 그럼에도 부족하다는 느낌이 든다면, Volume Wrangle을 활용해 전체 밀도값을 높여주면 해결된다.

 

Volume SDF node와 Convert VDB node를 활용한 Volume과 VDB간의 변환 방법이다. 

VDB는 Volume보다 정보가 적다. Volume을 VDB로 압축하는 과정에서 효율을 위해 정보가 어느정도 손실되기 때문이다. 이 때문인지 Volume의 정보가 VDB로 변환될 때에는 아무 문제가 없지만, 반대의 상황에서는 예상했던 결과가 나오지 않을 수도 있다. 이를 항상 염두에 두고 작업하자.

 

IsoOffset으로부터 SDF Volume으로 설정된 Volume을 Convert VDB로 SDF VDB로 변경한 뒤, 다시 Convert VDB를 활용해 Polygons로 만들어주었다.

SDF의 값이 0인 곳들이 연결됨으로써 면으로 표현된 것을 볼 수 있다.

1. Isovalue 값이 0이라는 것은 SDF의 결과로 0인 것들을 면으로 만들어준다는 것이다. 그 뜻은 Isovalue 값이 증가하면 폴리곤이 커지게 되고 줄어들면 작아지게 된다는 것을 뜻한다.

이는 이전 강의 때 하였던 Volume Visualization에서 density 값에 따른 범위 조절 방식과 같다.

2. Adaptivity를 높일수록, 가능한 형태를 유지하면서 최대한 면을 줄여주게 된다.

 

만약 폴리곤을 VDB from Polygons를 통해 VDB로 만들어준다면, Convert VDB를 이용함에 있어 문제가 생길 수 있다.

VDB from Polygons에서 Band Voxels가 제공해줄 정보가 부족해지는 순간에 정보가 사라지게 된다. Isovalue를 너무 높이거나 낮추게 된다면 Scene view 상에서의 Volume이 사라지는 것을 볼 수 있다.

이는 Band Voxels의 값을 올려 정보가 존재하는 범위를 늘려주거나, Voxel Size를 키워 범위의 크기를 늘려주면 어느정도 해결이 된다.

반면 Iso Offset을 통해 미리 Volume으로 만든 뒤 Polygon으로 옮겨 간다면 이러한 오류가 덜 하다.

Iso Offset을 통해 만든 결과와 Polygon에서 한번에 만드는 결과는 차이가 있다. 잘 판단해서 적절하게 사용하도록 하자.

 


3. Volume Merge, VDB Combine

 

Rubbertoy가 있던 위치에 새롭게 Shaderball을 설치해준다. 이때 각 Object의 SDF Volume에 달린 Volume Vop에는 Noise를 주지 않았다.

 

Volume Merge node를 활용하면 두 가지의 Volume을 계산해줄 수 있다.

Merge Method에서 Volume들을 합쳐줄 방법을 정해줄 수 있다. 현재 Add로 설정되어 있으며, Scene view 상에서 Add가 되었을 때의 모습을 확인할 수 있다. 두 개의 Volume이 겹쳐진 부분이 밀도가 진해진 것을 볼 수 있다.

오른쪽 아래의 식은 Volume Merge에서의 내용을 계산하는 방식이다. 전체적인 느낌을 보면 먼저 곱해지고 그 다음 값들이 더해지는 느낌이다.

 

Source Pre-mult에 1이 아닌 -1을 주게된다면, 1번째로 들어오는 Volume에서 2번째 input으로 들어오는 Volume이 빼지게 된다.

 

SDF Volume 끼리 곱해주게 된다면 Shaderball의 영역만큼 Rubbertoy의 영역이 추가된 것을 볼 수 있다.

Multiply를 통해 두 영역이 합쳐졌다고 볼 수 있다.

이때 두 구간이 곱해지면서 겹치는 부분이 비게 된다. 이 부분을 해결하기 위해 VDB와 SDF의 사칙연산에 대해 알아보자.

 

 

VDB Combine에서는 VDB들을 Operation에 따라 계산해줄 수 있다. Volume Merge와 비슷하다.

 

여러 Operation으로부터의 결과이다.

이때 A + (1-A) * B 와 Maximum은 모두 안쪽의 영역이 1로 설정되어 같게 보인다. 하지만 이 둘의 구체적인 밀도 값에서 차이가 날 수 있다.

 

SDF VDB들을 계산해준 결과이다.

SDF Union과 Volume Merge에서의 Multiply를 비교해본 결과 SDF Union이 조금 더 선명하게 결과를 얻을 수 있었다.

 

Volume에서는 반드시 Volume Merge를 사용하고 VDB에서는 VDB Combine을 사용해주어야 한다는 것을 잊지 말자.

 


4. Volume Blur, VDB Smooth

 

Volume Blur node를 사용해 Volume에 Blur 효과를 줄 수 있다.

이때 Radius로 Blur의 세기를 조절해줄 수 있는데, 1보다 큰 값으로 넘어가게 되면 Blur가 심하게 되어 Volume이 Scene view에서 사라지게 된다.

 

VDB Smooth에서는 Volume Radius가 voxel 단위로 되어 정수로 값을 조절해주게 된다.

Iteration은 Filter Voxel Radius로써 몇번이나 반복을 수행해 줄 것인지를 뜻한다.

이때 Radius 2, Iteration 5의 결과와 Radius 5, Iteration 2의 결과가 비슷하다. 그 이유는 둘을 곱한 결과로 Blur 효과가 적용되게 되는데, 둘의 결과 값이 같기 때문이다.

 

새로운 것을 많이 배우게 되는 강의는 공부 시간에 비해 복습하는 시간이 엄청 긴 것 같다.

Volume 첫 강의는 정말 어색한 부분이 많았지만, 4번째 강의에 들어서니 어느정도 Volume이란 녀석에 대해 적응된 것 같다. 그렇다고해서 방심하지 말고 꾸준히 나아가도록하자!