
복습
robber toy를 구름처럼 보이도록 꾸며보자.



Volume container를 만들어주고, 볼륨의 이름을 container로 지정했다.
그리고, rubber toy를 만들어서 isooffset을 적용해서 볼륨으로 만들고 이름은 toy로 지정했다.
Volume VOP의 첫번째 인풋은 container 볼륨을, 두번째 인풋은 toy 볼륨을 연결하고, volume sample을 활용해서 toy 볼륨의 밀도값을 container 볼륨에 가져왔다.
container 볼륨의 모든 voxel의 위치정보를 활용한 turbulent noise를 만들고, voxel의 위치값에 noise를 빼준 뒤, 이 vector 정보를 volume sample의 sample position에 연결했다.
이렇게 해줌으로써 container 볼륨에 묘사되었던 toy 볼륨의 모양에 왜곡이 발생했다.
fog 스타일의 볼륨 / SDF 스타일의 볼륨


SDF volume을 볼 수 있다는 점은 좋지만, 0을 기준으로 바깥의 정보와 안의 정보가 어떻게 있는지 확인이 어렵기 때문에, primitive 노드를 활용해서 volume이 표현되는 스타일을 교체해준다.(SDF > Smoke)

각각의 볼륨을 확인해보기 위한 volume visualization 노드를 만들어주자.
- fog volume visualization - 0보다 큰 부분에 대해서 주목하도록 제작
- 볼륨끼리의 사칙연산이 발생하면 밀도값이 1보다 커질수도 있기 때문에, diffuse range를 0~2로 바꿔준다.
- SDF volume visualization - 0을 기준으로 음수와 양수 모두 확인할 수 있도록 제작


가장자리 구간은 밀도가 0에 가까웠다가, 점점 커지다가 어느순간 밀도가 1이 되었다는 것을 뜻한다. 안쪽의 대부분의 밀도는 1이라는 값을 가지고 있을 것이고 테두리쪽은 약간 그라데이션이 되면서 밀도가 작아지면서 사라진다는 것을 뜻한다.


각각의 voxel의 위치정보를 기준으로 표면까지의 거리를 구했는데, 그 중에서 표면과 가까운 voxel, 즉 거리값이 0 언저리에 있는 voxel들을 주목해서 보고 있는 것이다.
SDF 0에 해당하는 표면에는 노란색을, 0보다 큰 양수의 구간(바깥쪽)은 빨간색을, 0보다 작은 음수의 구간(안쪽)은 파란색으로 묘사되도록 diffuse ramp 그래프를 조정했다.
복습 끝!
volume 작업시 유용한 노드들
Name Node
- 볼륨의 이름을 바꿔준다.
- 볼륨이 굉장히 다양하게 존재하는 경우, 볼륨의 이름을 매번 바꿔주거나 하는 것이 귀찮은 일이 아닐 수 없다.(volume visualization 노드만 하더라도, field의 볼륨 이름이 잘못 들어가면 눈으로 확인할 수가 없다.)
규칙을 만들자.
fog volume visualization 노드의 density / diffuse field의 이름을 fog로 고정한다.
이렇게 되면, volume visualization 노드로 보기 위한 볼륨의 이름은 항상 fog여야 한다.

먼저 parameter의 항목 중, group에 어떠한 것을 이용하고 싶은지 선택해줄 수 있다.
그리고 그 아래의 name 항목에는 바꾸기를 원하는 볼륨 이름을 적어준다.


name 노드를 활용하는 또 다른 방법이다.


Number of Renames를 활용할수도 있다.

from에는 바꾸기 원하는 원본 볼륨 이름을, to에는 바꾸고 싶은 새로운 볼륨의 이름을 적어준다.

이름을 변경하는 것은 attribute wrangle을 활용해서도 가능하다.(volume wrangle 아니다.)

run over를 primitives로 하고, @name을 "fog"로 변경해주면 된다. 이 방법은, 볼륨이 어떠한 이름을 가지고 있었다 하더라도 위의 wrangle을 통해 볼륨 이름을 fog로 변환시킨다.

이런 식으로 묶어놓으면, attribute wrangle에 어떠한 볼륨이 들어오더라도 이름을 fog로 변환시키고, volume visualization으로 보도록 할 수 있다.
name 노드가 유용하게 사용되는 예)
하나의 볼륨을 가지고 여러 개의 서로 다른 볼륨으로 사용할 수 있도록 할 수 있다.

Volume SDF Node
무언가의 결과로서 얻은 fog volume은 SDF로 보기 위해서는 따로 전환하는 과정이 필요하다.

fog volume에 연결해주면 바로 작동한다.
한가지 신경써야할 부분이 있다면, Iso Surface 항목이다.
Iso Surface
- 0일 경우, 보여줄 정보가 없다.
- 정말 작은 값(0,0001)이라도 커져야 우리의 눈에 시각화된다.


SDF로 잘 작동하는지 확인해보자.

SDF는 실행이 잘 되는 것 같은데, 색이 뒤집혀있다.
이 부분의 조절을 위해 Volume SDF의 Invert를 체크한다.


Convert VDB Node
- 볼륨간의 타입을 변경해주는 노드이다.
- 작업 상황에 따라 일본 볼륨과 VDB를 오고가야 할 수 있다.
- 최종적으로는 SDF와 fog volume도 왔다 갔다 할 수 있어야 한다.





convert to 를 VDB로 맞추고 일반 볼륨을 연결해주면, node info에서 일반볼륨의 색(초록색)이 아닌, vdb의 색(파란색)으로 볼륨 이름이 바뀐 것을 볼 수 있다.
불필요한 부분에 대해 제거해줌으로써 해상도도 바뀌었다.

fog volume visualization을 연결해보자.


일반 볼륨과 VDB로써 둘의 포멧은 다르지만, container라는 볼륨의 내용 자체는 같기 때문에 volume visualization의 결과가 동일한 것이다.
SDF에 Conver VDB를 연결해줘도 결과는 같다.


convert VDB에는 정말 소중한 기능이 하나 더 있다.
- 일반 fog volume을 SDF로 변환하기 위해 volume SDF 노드를 활용했었다.
- convert VDB를 사용한다면, 일반 볼륨을 SDF 스타일의 VDB로 바로 변환이 가능하다.
- VDB Class에서 설정이 가능하다.


우리가 알고 있던 Iso Surface의 결과가 나오는 것을 볼 수 있다.

SDF volume visualization을 적용했더니 바깥은 빨간색이 보이고 있고, 0에 관심이 있는 구간은 노란색, 그 안쪽은 파란색이 있는 것을 확인할 수 있다.

하지만 위의 결과와는 결이 다르다.
그 이유는, VDB는 SDF가 0인 곳을 기준으로 바운딩 박스 안의 모든 voxel의 값을 구한 것이 아니다. 일정 voxel을 넘어간다면 더이상 구할 필요가 없다는, 정보의 효율 때문에 이런 결과가 나오는 것이다.
비슷한 결과를 보기 원한다면, volume visualization의 density ramp의 구간을 좁혀줄 필요가 있다.



SDF volume과 SDF VDB의 결이 같아졌지만, 빨간색 구간의 차이가 난다. 그 이유는 현재 voxel의 사이즈가 작기 때문에 몇칸의 voxel을 나가고 더이상은 정보의 효율을 택하겠다고 제거하기 때문에 VDB는 아주 얇은 빨간색 테두리가 있는 것이다.
주목하고 싶은 구간이 늘어난다면, 정보가 없었던 모든 구역에 대해서 값이 튀어버린다.(그래서 빨간색이 가득)
이번에는 그냥 SDF의 결과를 VDB 형태의 fog volume으로 바꿔보자.


사실, 우리의 눈에 보이지 않는 것일 뿐, 정보가 없는 것은 아니다.
density ramp 그래프를 바꿔보자.


보여야 할 부분들이 주목되지 않았던 것 뿐이라는 것이다.

빨간색과 노란색으로 묘사되는 이유는, convert VDB로 변환하는 과정 속에서 밀도값의 내용이 줄어들었음을 의미한다.

convert VDB 노드의 결과를 보고 정보가 사라졌다고 착각할 수 있다. 밀도값을 증폭시켜주면 이용할 수 있다.
converting이 발생하면, 구체적인 수치는 살짝 바뀔 수 있다. 그래서 우리가 가지고 있는 정보들이 올바르게 살아있는지, volume visualization의 density ramp 그래프를 조절해준 것과 같은 방법으로 확인해볼 필요가 있다.
밀도값을 올려주고 싶다면, volume wrangle을 활용해서 값을 조절해줄 수도 있을 것이다.
@toy *= chf("mult");
mult라는 이름의 channel float 데이터를 받아서 @toy의 밀도값을 증폭시킬 수 있다.


정리.

fog VDB에서 SDF volume으로 변환을 한다면, 먼저 fog volume으로 변환을 진행한 뒤, fog volume을 SDF volume으로 변환하는 과정을 거쳐야 한다.
VDB에서 Volume으로 가는 과정은 완벽할 수 없다.
그 이유는,
- 일반 볼륨에 대해서는 압축되지 않은 정보이기 때문에 해상도 안에 있는 모든 내용에 대해 자료가 굉장히 잘 준비되어 있다.
- 하지만, 일반 볼륨에서 VDB로 넘어갈 때 압축이 된다. 그와 동시에 손실이 된다.
- 그렇기 때문에 손실된 VDB를 가지고 원래 상태의 일반 볼륨으로 되돌릴 수 없을 수 있고, 이 볼륨을 SDF 볼륨으로 변환했을 때, 우리가 기대했던 SDF volume의 결과가 올바르게 나오지 않을수도 있다.
이런 부분은 염두에 두고 작업을 해야 한다.
convert VDB의 기능 중 polygon을 선택해보자.
- SDF의 결과로써 0인 곳들을 모아서 면으로 만들어준다.
- volume을 가지고 모델링을 하는 것에도 도움이 될 것이다.
전제조건은 입력으로 들어오는 데이터가 VDB여야 한다는 점이다.



SDF의 값이 0인 곳들이 연결되면서 위의 이미지와 같이 면으로 표현되었다.

Isovalue
- SDF의 값이 Isovalue 값인 부분을 면으로 만들어준다.
- Isovalue 가 0.05라면, SDF의 값이 0.05인 voxel들을 모아서 면으로 만들어준다는 것이다.
현재는 isooffset의 결과를 단순하게 VDB로 변환한 것이기 때문에, 별 다른 문제가 없다.
vdb from polygons를 활용해서 만들어준 VDB에 대해서는 convert VDB를 이용할 때 문제가 발생할 수 있다.
vdb from polygons의 exterior / interior band voxel에 의해서 제공해주는 voxel의 정보가 부족해지는 순간에 결과가 사라지게 된다.
Isovalue가 일정 수치 이상(혹은 일정 수치 이하)이 되면 값이 사라져버린다. 제공되고 있는 exterior / interior band voxel의 값이 작기 때문에 생기는 현상이다.
Adaptivity
값을 키우면 키울수록, 형태를 유지한 상태에서 효율을 위해 면을 줄여나간다.



정리.
convert VDB를 가지고 volume의 타입을 변환해줄 수 있다.
또한 convert VDB를 가지고 SDF VDB를 면으로 표현이 가능했다.
이 때, Isovalue에 따라 어떠한 SDF의 값을 기준으로 면을 만들것인지 정해줄 수 있었다.
볼륨의 사칙연산
Volume Merge Node

Merge Method를 보면 여러가지 계산 방식이 보인다.

volume merge를 사용할 경우, 기준이 되는 볼륨의 해상도(바운딩박스)가 자동으로 늘어난다.




이번에는 rubber toy 모양에서 쉐이더볼 모양을 빼보자.
- merge method를 Add로 해주고, source pre-mult를 -1로 바꿔준다.
- merge method에 subtract가 없다. 그래서 source pre-mult로 -1을 곱해준 값을 더해줌으로써 빼기를 표현한다.



수식을 적어보자.

fog_a에서 volume merge로 들어오는 정보를 A, fog_b에서 volume merge로 들어오는 정보를 B라고 하고, volume merge의 각각의 항목에 대해 a ~ f 라고 한다면, volume visualization으로 보게 될 결과는
volume visualization = [{(A x b) + a} + {(B x d) + c}] x f + e
a~d의 값이 무엇이라 하더라도 post-mult(f)가 0이면 결과는 없는 것 처럼 나오게 된다. 이 때, post-add(e)가 0.1이라면, 모든 값이 0.1인것처럼 출력이 된다.
순서를 표현한다면...
1) A에 b를 곱하고
2) 1)의 결과에 a를 더하고
3) B에 d를 곱하고
4) 3)의 결과에 c를 더하고
5) Merge Method의 연산을 수행하고
6) 5)의 결과에 f를 곱하고
7) 6)의 결과에 e를 더한다.

SDF를 volume merge로 계산해보자.
생각이 필요하다.
SDF는 밀도값으로써 더해주면 더해줄수록 커진다의 개념이 아니다.
관심영역이 0이고, 서로 다른 표면의 정보가 섞여야 하는 것이다.
volume merge의 merge method가 add일 경우, 우리가 원하는 결과를 얻기 어려울 것이다.
우리가 원하는 결과를 얻기 위해서는(서로 다른 표면의 정보가 섞이기 위해서는) merge method 방식이 multiply여야 한다.
이것 또한 완전한 것은 아니다. 겹치는 구간에 대해 SDF가 +로 변하기 때문이다.


두개의 표면이 연결된 것을 확인할 수 있다.
좀 더 명확한 SDF의 merge를 하려면, 겹쳐지는 구간에 대해 +로 처리되는 곳을 -로 변환해주는 것을 고려해야한다.
이번에는 VDB의 사칙연산을 진행해보자.
VDB Combine Node

Operation에 다양한 사칙연산이 있다.

현재는 operation이 Copy A로 되어있어서 A만 묘사될 뿐이다.

operation Add의 결과이다.

operation Subtract의 결과이다.

operation Multiply의 결과이다.

operation Divide의 결과이다.
- 이 결과는 현재 예측이 좀 어려운 부분이고 일단은 큰 의미가 없다고 보자.

operation (1 - A) * B의 결과이다.
- 집합으로 본다면, A와 B의 교집합을 제외한 B의 결과이다.


operation A + (1 - A) * B의 결과이다.

volume merge의 maximum과 같은 결과를 보여준다.
- 구체적인 밀도값은 다를 수 있다. 현재 a와 b 모두 안쪽의 밀도가 1로 설정되어있기 때문에 같게 보이는 것이다.

이번에는 SDF VDB에 대한 연산을 해보자.
VDB Combine의 operation 하단을 보면 SDF에 대한 옵션이 있다.
- 이 세가지는 굉장히 유용하다.

SDF Union의 결과이다.
- 아까의 SDF Volume을 Volume Merge의 Multiply를 해준 결과보다 훨씬 명확하다.

SDF Intersection의 결과이다.
- 겹쳐져있는 구간에 대해서만 결과를 보여주고 있다.

SDF Difference의 결과이다.
- A에서 B의 경계를 빼준 결과를 보여준다.

이 결과를 convert VDB를 가지고 면으로 바꿔보자.
- shader ball에 대한 영역만큼 rubber toy에서 빠진 것을 확인할 수 있다.

다른 SDF 연산결과도 면으로 확인해보자.


정리
- volume merge
- 일반 볼륨의 사칙연산에 사용되는 노드
- VDB에 대한 내용을 넣어준다거나 하는 것은 맞지 않다.
- VDB Combine
- VDB의 사칙연산에 사용되는 노드
- 일반 볼륨의 결과를 인풋으로 넣어준다는 것은 맞지 않다.
- Volume merge와 VDB Combine은 서로 섞어가면서 쓸 수 있는 노드가 아니다.
Blur 관련 노드
Volume Blur Node
- 일반 볼륨의 결과에 blur를 주는 노드
- VDB의 결과에는 영향을 주지 않는다.




VDB Smooth Node
- VDB의 결과에 Blur를 주는 노드이다.


일반적인 volume blur는 radius가 길이값으로 적용된다.
vdb smooth는 radius가 voxel 단위로 되어있다. 그래서 radius가 정수 단위로 값이 변화한다.

iteration
- filter voxel radius의 값으로 몇번 blur를 실행해줄 것인지에 대한 항목이다
- filter voxel radius 1 / iteration 10 의 결과와 filter voxel radius 2 / iteration 5 의 결과는 비슷하다.
- voxel 1칸씩 10번 blur / voxel 2칸씩 5번 blur
오늘 배운 노드 정리
- Name
- 볼륨의 이름을 바꿔주는 노드
- Volume SDF
- Fog 볼륨을 SDF 볼륨으로 바꿔주는 노드
- Convert VDB
- 일반 볼륨과 VDB간의 포멧을 쉽게 바꿔주는 노드
- SDF로 되어있는 VDB를 면으로 바꿔줄 수도 있는 노드
- SDF로 모델링이 가능하다.(구멍뚫린 치즈, 고드름 등)
- Volume Merge
- 일반 볼륨의 사칙연산을 수행해주는 노드
- VDB Combine
- VDB의 사칙연산을 수행해주는 노드
- Volume Blur
- 일반 볼륨의 결과에 Blur를 적용해주는 노드
- VDB Smooth
- VDB의 결과에 Blur를 적용해주는 노드
다음 시간에는 Vector Volume을 다루게 된다.
볼륨 정보를 밀도와 색이 아닌, 또 다른 방식으로 분석해주는 도구들이 있다.
바람을 볼륨으로 묘사할 수 있지만 밀도를 가지고는 묘사가 눈에 보이지 않는다.
강의를 듣고 있는 상황에서는 크게 어렵게 느껴지는 부분은 없었던 것 같다.
하지만, 노드의 활용에 대해서는 반복적으로 사용을 해보고 익숙해지는 시간이 필요할 것 같다.
이전의 어떠한 튜토리얼을 보면서 Volume에서 VDB로, 혹은 VDB에서 Volume으로 넘어가고 하는 것에 막연한 어려움을 느꼈던 기억이 있었는데 오늘 강의를 접하면서 어렵게 느낄만한 부분은 아니구나 하는 생각을 해보았다.
앞으로의 수업들이 매우 기대된다.
그리고 이것들을 활용해서 무언가 작업을 해나갈 것들이 기대된다.
'Houdini > Houdini1_Volumes' 카테고리의 다른 글
05_볼륨의 확산? 이류? VOLUME ADVECT (0) | 2023.02.22 |
---|---|
04_Vector Volume / VOL TRAIL, GRADIENT, CURVATURE 🔥완전중요🔥 (1) | 2023.02.21 |
03_VOLUME_part1. Volume 계산 Wrangle, Vop & Volume Sample, 구름 (0) | 2023.02.16 |
02_VOLUME NODE 다루기 & 시각화 (0) | 2023.02.15 |
01_VOLUME 기초 이론, DENSITY와 SDF(Signed Distance Field) (0) | 2023.02.14 |