Advect
이류, 확산과는 뉘앙스가 다르다.
확산
- 주어진 공간 안에서 무언가의 값이 큰 부분에서 값을 떼어내어 값이 낮은 쪽으로 퍼지는 것
- 엔트로피가 높은 상태에서 엔트로피가 낮은 상태로 변화하는 것
검은색 구간을 밀도 0, 가운데 하얀색 구간을 밀도 1이라 가정했을 때, 확산이 일어나는 방향은 밀도가 높은곳에서 낮은곳으로 퍼지는 방향인 다음과 같을 것이다.
확산의 방향은 gradient의 방향과 반대이다.
이류와 확산의 차이
이류
- 이류는 확산보다 개념이 작다.
- 확산의 개념에 이류가 포함되어있다.
- 이류는 유체가 이동하게 되는 원인이다.
- 방향이 존재하고 그에 따른 이동이 있다.
- 마치 어떠한 값이 그 상태로 고스란히 움직이게 하는 것이 이류의 작동이다.
확산
- 이류의 모든 개념을 포함하면서 값의 평형이라는 개념이 존재한다.
- 방향이 존재하고 그에 따른 이동이 있고, 이 때 값의 평형이 일어난다.
VDB Advect Node
첫번째 인풋에는 원본 volume이 연결되고, 두번째 인풋에는 방향을 설정해줄 수 있는 Vector Field가 연결된다.
Velocity parameter : 어떤 vector field를 사용해서 속도를 적용할 것인지에 대해 정해줄 수 있다.(사용자가 직접 정해주는 것이 좋다.)
Timestep parameter : VF의 속도에 곱해져서 원본 volume이 움직이는 양을 조절해줄 수 있다.
- 주어진 vector field를 얼만큼 반영할지에 대한 값
Volume VOP으로 표현할 때 Bind를 하지 않은 이유
원본 볼륨의 원래의 위치에 불러와서 노드를 활용해 변화를 주고 VF만큼 이동을 시켜주는 개념이 아니라,
원본 볼륨을 vector field만큼 다른 위치에 불러온다는 개념이다.
그래서 bind export로 출력만 해주고, 초기에 bind로 원본볼륨을 불러오는 것이 아닌, volume sample node를 활용해서 원본 볼륨의 위치를 reference로 활용하는 것이다.
vector field를 불러올 때는 volume sample vector node를 사용한다.
volume sample node / volume sample vector node 의 차이
- volume sample 노드는 float 값을 가져오고,
- volume sample vector 노드는 vector 값을 가져온다.
정리
VDB Advect를 활용한다면, 원본볼륨을 vector field에 의해 이동시킬 수 있다.
이 때, vector field의 영향을 얼만큼 받아서 이동할지에 대해서는 vdb advect의 timestep parameter에서 정해줄 수 있다.
Vector Field에 Noise를 추가해주고 VDB Advect를 적용해보자.
왜 VDB Advect의 Timestep의 초기값이 0.03333 등의 작은 값(1/$FPS)일까?
Crag에 대해 튀어나온 쪽은 더 튀어나오고, 들어간 쪽은 더 들어가게 하고 싶으면 어떻게 해야할까?
일단 튀어나온 부분과 들어간 부분의 구분이 필요하다(Curvature)
이제 각 부분에 대해 더욱 더 튀어나오거나 들어가도록 해보자(면과 수직인 방향_@N 활용)
일반적으로 @P의 값에 @N과 @curvature를 곱해준 값을 더해주면 scene view가 난리난다.(위 사진도 curvatur 값에 0.09를 곱해준 상황이다.) 그 이유는 @curvature가 현재 음수값으로 많이 포진된 상태이기에 면이 뒤집히게 된다.
@curvature를 clamp를 활용해서 음수에 대한 부분에 제한을 준다.
위의 내용을 volume에 적용시켜보자.
필요한 정보는 다음과 같다.
- fog volume이 필요하다.
- gradient 정보가 필요하다.
- curvature 정보가 필요하다.
- gradient와 curvature 정보를 위해서는 SDF volume이 필요하다.
- SDF Volume을 gradient로 분석한 정보는 볼륨에서의 normal처럼 활용이 가능하다.
- VDB Advect를 활용하기 위해서는 일반 볼륨을 VDB로 바꿔줘야한다.
convert VDB를 활용해서 Polygon으로 변경할 때는 일반적으로 SDF를 이용해서 변경한다.
그렇기 때문에, fog 볼륨으로 VDB Advect를 적용해서 convert VDB(Polygon)를 적용하는 것이 아닌, SDF 볼륨을 VDB Advect에 연결해서 Convert VDB(Polygon)를 적용한다.
vector field를 확인해보기 위한 시각화 작업을 해주자.
뭉게뭉게 보다는 들쭉날쭉한 느낌인 이유는
- 첫번째로, curvature의 값 때문일 것이다. curvature 값이 너무 들쭉날쭉해서 유독 빠르게 이류하는 부분이 생길 수 있다.
- 두번째로(이 이유가 더 치명적이다) VDB Advect가 가지는 한계 때문이다.
- 우리가 활용한 vector field는 어느 시점의 상황을 분석한 것인가?
- 원본 볼륨 상태의 gradient와 curvature를 사용한 것이다.(TimeStep의 값과 상관없이)
- 그래서 모양이 업데이트 되었을 때 형태가 바뀐 볼륨의 상태에 대한 gradient와 curvature가 고려되지 않는다.
- timestep의 값이 커진다는 것은 유기적으로 계속 변화하는 값을 활용하는 것이 아니라, 초기에 이미 정해진 방향으로만 볼륨이 뻗어나간다는 것을 의미한다.
- 이것이 단일 VDB Advect의 한계이다.
- 우리가 활용한 vector field는 어느 시점의 상황을 분석한 것인가?
들쭉날쭉을 완화시킬 수 있는 방법
- 첫번째 이유(통제되지 않은 curvature value)에 대한 해결책으로는
- gradient에 curvature를 곱해준 값에 대해 normalize해주는 방법도 하나의 방법이 될 수 있을 것이다.
- curvature에 대해 blur를 적용해줄 수 있을 것이다.
- 두번째 이유(처음 구해진 gradient, curvature 정보만을 이용하는 VDB Advect)에 대한 해결책으로는
- 조금 움직이면 분석하고, 또 조금 움직이면 다시 분석하고, 이 과정을 반복하는 것이다.
- VDB Advect를 solver와 함께 사용하는 것이다.
- 한 프레임을 기준으로 잡고, 한 프레임마다 분석을 해주는 것이다.(그래서 timestep 값이 1/$FPS 이다.)
- 이전 frame의 결과를 분석해서 일정 timestep만큼 이류시키고, 다음 frame에 이 결과를 또 분석해서 이류시킨다.
오늘도 유익하고 치명적인 강의였다.
값의 평형을 만들어내려면 어떻게 해줘야할까...? 하는 생각을 잠시 해봤다. 확산의 값의 평형 개념까지 적용이 된다면, 임의의 범위에 대해서는 마치 연기가 한군데에서 뿜어져나왔다가 옅게 시야가 가려지는 것처럼 묘사가 가능하지 않을까 싶다.
아직 꼬물꼬물 기는것도 제대로 못하는 뽀시라기가 자꾸 뛰고 날려고만 하는거 같다.
최소한 걷는것 정도는 되어야 후디니 유저라고 일시켜달라고 해보기라도 할꺼같은데 말이다.
열심히 공부하자!
'Houdini > Houdini1_Volumes' 카테고리의 다른 글
07_SMOKE SOLVER 기본기 (0) | 2023.02.27 |
---|---|
06_SOLVER와 함께 VOLUME 다루기 (1) | 2023.02.25 |
04_Vector Volume / VOL TRAIL, GRADIENT, CURVATURE 🔥완전중요🔥 (1) | 2023.02.21 |
03_VOLUME_part2. Volume 계산능력 향상 필수 (0) | 2023.02.17 |
03_VOLUME_part1. Volume 계산 Wrangle, Vop & Volume Sample, 구름 (0) | 2023.02.16 |