TWA Houdini1/Volumes

TWA 후디니 1 Volume_02 : Volume Node 다루기 & 시각화

yiss09 2023. 2. 14. 11:43

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

 

HOUDINI1_ VOLUMES

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

www.twahoudini.com

 

Volume02에서는 직접 node를 다루어보며 지난 이론 강의에서의 붕뜨는 느낌을 눌러보도록 하자!

 


 

1. Volume node에서 어떤 타입으로 정보를 다룰지 정해줄 수 있다. Scalar(float), Vector, Matrix가 있다.

2. Name을 정하여 이후의 Volume 관련 node에서 해당 Volume을 끌어와 사용할 수 있다. Volume node의 Node info를 보면 변경된 이름을 확인할 수 있다.

3. Initial Value가 존재하여야 Volume이 작동된다. 이때 x,y,z의 값 중에 0이 들어가 있다면, 해당 값은 다른 node에서의 활용이 불가능하다.

4. Volume의 사이즈를 변경할 수 있다. 이 때 변경된 사이즈의 Min,Max 값을 Node info에서 확인이 가능하다.

5. Volume이 위치할 곳을 정해줄 수 있다. 변경된 Center 값은 Node info에서 확인이 가능하다. 이때 Center 값의 변형은 Min, Max 값에도 영향을 끼치게 되는데, Center에서 변형된 값만큼 Min,Max 값에 더해지게 된다.

6. Uniform Sampling은 무엇을 기준으로 voxel을 나눌지를 정해주는 기준이다. Max Axis는 만든 사이즈 중 가장 큰 값을 기준으로 voxel을 나눠준다. 예를 들어 Min,Max이 4,3,2일 때 x값이 제일 크기 때문에 x 값을 uniform  sampling divs값으로 나누어주어 voxel size를 얻게 된다. 사진에서는 size가 1로 동일해 1을 uniform sampling divs값인 10으로 나누어주게 되어 voxel size 0.1을 얻게 된다.

Uniform Sampling을 By size로 둔다면 직접적으로 voxel size를 조절해줄 수 있다.

 

이제 의도를 가지고 volume을 만들어보겠다. 만약 지금 만들고 싶은 volume이 scalar 값이라면 어디에 만들지, 얼마나 크게 만들지 정해야 한다.

Tommy를 만들어 Volume으로 Tommy를 덮어줄 온도장을 만들어준다. Volume의 Size와 Center 값을 조정해 Tommy를 Volume 중앙에 둔다.

Uniform Sampling을 By size로 설정해줬을 때 설정된 voxel size에 맞게 size를 나누어 필요한 voxel의 양을 만들게 된다.

 

이제 그냥 Volume과 VDB를 비교해보려한다. 이때 VDB node만 꺼낸다고 해서 Volume node만큼의 작업수행이 되지는 않는다.  

1. VDB에서의 Name은 Volume Node에서의 Name과 같다. Node Info를 확인해보면 구름모양 옆에 이름이 새겨진 것을 확인할 수 있는데 이때의 색깔이 Volume의 경우엔 초록색으로 보이지만, VDB는 파랑색으로 표시되는 것을 볼 수 있다. 또한 Vertices 아래에 VDBs가 생성된 것을 볼 수 있다.

2. VDB의 Type을 정해준다. 이때 설정된 Type 값은 Node Info에서 확인 가능하다.

3. VDB에서는 Voxel Size를 먼저 정할 수 있는 형태로 되어 있다.

 

1. Value 값을 조절함으로써 투명도를 조절해줄 수 있다.

2. VDB를 사용할 때 VDB Activate node를 같이 사용해줌으로써 Size값과 Center 값을 조절해줄 수있다.

 

둘을 Merge하여 Node Info를 확인해보았다.

1. Volumes와 VDBs가 따로 입력된 것을 볼 수 있다. 이때 Volume의 값은 3이 되는데 그 이유는 Volume에서는 Type을 Vector로 설정해두었음에도 전부 float 값으로 나뉘어 받아들여지기 때문이다. 그에 비해 VDB는 하나의 정보로 입력되며 뒤에 type에 대한 설명이 붙는다.

2. VDB는 Volume에서의 불필요한 정보를 제거하여 Voxel을 만들기 때문에 그 수가 적다.

 

Volume을 결과로서 출력하는 것이 목표이기 때문에 눈으로 보고 싶은 Volume을 쉽게 특정할 수 있어야 한다.

지금까지의 Scene view 상의 Volume은 후디니가 작업자들의 편의를 위해 띄워준 화면이다. 하지만 실제로 출력을 하게 된다면 구체적으로 밀도 이름을 골라주어야 한다. 어떤 Volume을 출력하고 싶은지, 출력을 위해 밀도에 어떠한 영향을 주고 싶은지를 알아보는 훈련을 하기위해 Volume Visualization이 도움이 된다고 할 수 있다.

이제 Volume Visualization을 사용해보겠다. 그리고 Light을 설치해보겠다. 여기서 Light를 설치하는 이유는 밀도로 표현되는 Volume은 Light에 따라 그 결과의 느낌이 상당히 많이 바뀐다.

 

Light를 설치해 빛을 준다면 Volume에 빛이 반사되어 그 느낌이 바뀌게 된다.

이때 Light의 효과를 끄고 싶다면 Display를 끄는 것으로 해결되지 않는다.

Volume에  적용되는 Light의 효과는 Light node에서의 Enable을 꺼줌으로써 빛의 효과를 없앨 수 있다.

 

가장 먼저 우리가 어떤 Volume을 보고 싶은지 그 이름을 Density Field에 써주어야 한다.

Diffuse Field에 이름을 쓴다면 Volume의 색을 조절해줄 수 있다.

 

이때 temperature.x가 아닌 temperature.y를 넣게 된다면, Volume이 사라지게 된다.

그 이유는 Volume node에서의 Initial Value의 y 값이 0이기 때문에 작동하지 않은 것이다.

 

1. Minimum ~ Maximum 범위의 값이 고정된 Ramp 값에 맞춰 Fit 된다.

Max 값을 늘리거나 Min 값을 낮추어 준다면 더 넓은 범위의 값을 활용할 수 있게 된다.

Max가 1일때 Initial Value 값이 1인 것과 4인 것의 차이가 없다. 그 이유는 Max값이 1로 제한되어 그 이상의  값은 1로 Clamp 되었기 때문이다.

Max가 4일때 Initial Value 값이 1인 것과 4인 것에 차이가 발생했다. 하지만 Max값이 다시 1로 Fit되면서 1과 0.5 value 값이 Max가 1일때보다 더 어두워졌다.

2. Density Scale을 높여주면 밀도가 올라가면서 Volume의 색이 진해진다.

 

Volume의 Rank를 Scalar로, Name을 twa로 변경해주었다. 이때의 Initial Value 값은 x 값인 1이다.

1. Diffuse Ramp에 색을 주었다.

2. Maximum 값을 조절하여 결과적으로 나올 색을 조정하였다. Diffuse Ramp에서의 0.5의 값은 초록색으로 설정되어 있다. 이때 Maximum 값을 2로 설정하게 된다면, Initial Value 값인 1이 Fit에 의해 0.5로 줄어들게 되어 초록색이 결과로 출력되는 것이다.

3. 이때의 Denstiy Ramp의 0.5 위치의 값을 1로 올려주면 초록색이 더 밝아지게 된다.

4. Diffuse Range를 키게 되면, Diffuse Ramp만의 독립적인 Min, Max 값을 가지게 된다. 따라서 0~1로 설정되어 그대로 붉은색이 나오게 되는 것이다.

 

IsoOffset은 Polygon의 안과밖을 구분하여 밀도나 SDF의 결과를 보여준다. 이때의 결과는 그냥 Volume의 결과이다. 

VDB from Polygons는 IsoOffset과 거의 동일한 효과를 한다. 차이가 있다면 이때의 결과는 VDB의 결과이다. 

IsoOffset은 BoundingBox를 기준으로 모든 voxel의 정보가 존재한다. VDB from Polygons는 불필요하다고 판단되는 정보들을 지우게 된다. 이에 이 둘은 정보량에서 차이가 나게 된다.

IsoOffset의 Div Size와 VDB from Polygons의 Voxel Size를 변경해 둘의 해상도를 비슷하게 맞춰준다.

 

왼쪽의 결과(isooffset)는 밀도로써 표현된 것을 볼 수 있다. 오른쪽 결과(VDB from Polygons)는 밀도가 아니라 원래 표면이 면과 같은 다른 재질로 대체되어 있는 것을 볼 수 있다. 오른쪽 결과는 SDF로 표현된 것이라 볼 수 있다.

둘의 셋팅을 같게 하기 위해 VDB from Polygons를 Distance VDB에서 Fog VDB로 변경해준다.

VDB는 SDF에 의해 두꺼운 테두리를 만드는 방식으로 정보를 만들기 때문에 깔끔하지 못한 line이 생겨난다. 그에 반해 Volume은 정보가 내부 전체에 고르게 생기기 때문에 line이 생기지 않아 더 깔끔한 작업물이 나타난다. 하지만 Volume의 경우 VDB에 비해 무겁운 단점이 있다. 이에 VDB와 Volume을 적절하게 판단하여 때에 맞게 사용해주자.

 

VDB from Polygons의 Exterior Band Voxels와 Interior Band Voxels를 조절해 VDB에서의 SDF로부터 생성되는 정보의 두께를 조절해줄 수 있다.

+ Fill Interior를 사용하면 VDB의 내부를 전부 채워준다. 또한 Interior Band Voxels를 높게 올린 것과 비슷한 효과를 낸다. 

 

 

Diffuse Ramp의 검정색 부분을 흰색으로 바꿔줌으로써 Diffuse Field를 켰을 때 어둡게 표현되는 부분을 제거해줄 수 있다.

 

먼저 IsoOffset의 Type을 SDF Volume으로 설정해준다. Max Axis로 Division을 100까지 올려 퀄리티를 높여준다.

그 다음 IsoOffset의 결과를 순수한 밀도로 변경시키기 위해 Primitive Properties node를 달아준다.

IsoOffset에서는 SDF의 결과를 IsoSurface라는 방식으로 보여주고 있다.

Primitive에서 Smoke로 바꿔준다면 IsoOffset이 가지고 있는 SDF의 값을 밀도로써 보여준다.

 

만약 IsoOffset에서의 결과를 바로 Volume Visualization에 넣어주게 된다면 Primitive와 같이 밀도로 된 결과를 얻을 수 있다.

SDF의 결과로 표면에 가까운 voxel들은 0에 가까운 값을 가진다. 표면 안으로 들어가면 갈수록 voxel들이 가지고 있는 SDF의 값은 작아진다.

 

앞서 SDF로 값을 구했기 때문에 표면이 0이 된다.

이때 Min을 -1로 둔다면, 0의 값은 0.5가 되게 된다. 이 말은 즉슨, 밀도가 없던 정보가 밀도가 있는 것처럼 표현이 된다는 뜻이다. 이에 안쪽 면이 채워져 경계가 흐릿해진 것을 볼 수 있다.

 

Density Ramp의 모양을 꼬깔과 같은 모양으로 바꾸게 된다면 경계부분의 밀도가 뚜렷한 결과가 나온다.

 

중심으로부터 0의 값에 다가가면 Volume 내부의 밀도를 보게 됨으로써 사이즈가 작아진다.

반대로 1의 값에 다가가면 Volume 외부의 밀도에 가까워짐으로써 사이즈가 커지게 된다.

 

Denstiy Ramp를 다룰때와 같이 Minimum 값을 -1로 둔 상태에서 Diffuse Ramp를 조절하면 색이 들어간 경계를 확인할 수 있다.

0과 가까운 쪽으로 파란색을 준다면 Volume 내부에 파랑색이 입혀지게 된다.

0.55보다 큰 부분은 Density Ramp를 조절해 밀도를 낮추고 Diffuse Ramp에서 검정색을 입혀 흐릿하게 만들어준다.

 

Emission을 활용하면 Volume이 빛을 내게 만들 수 있다.

Emission에서의 Ramp 사용법은 Smoke와 별반 다를게 없다.

Emission Ramp를 조절해 밝기가 작용할 범위를 지정해준다. 이때 Emission Scale을 활용해 빛의 세기를 조절할 수 있다.

Emission Color Ramp로 빛에 색을 입혀준다. 

 

VDB의 경우 Band Voxels의 범위를 초과한 경우 Volume이 터지게 되어 Scene view 상에서 사라지게 된다. 그 이유는 VDB의 특징 때문인데, Band Voxels의 범위 밖의 정보들은 필요없는 정보로 판단하여 제거해버리기 때문에 경계를 볼 수 없게 되는 것이다.

 

이때 Band Voxels의 범위를 늘려주게 된다면, VDB가 제거하지 않는 정보의 범위가 커져 Scene view 상에서 확인이 가능해지는 것이다.

이때 Voxel size가 변하게 된다면 Density Ramp의 범위도 변하게 된다. 반드시 인지하고 수정을 하도록 하자.