https://www.twahoudini.com/course/volumes1
HOUDINI1_ VOLUMES
2️⃣ 볼륨의 기초이론과 응용 그리고 SIMULATION까지 경험해보세요.
www.twahoudini.com
돌아가는 시스템이 눈에 안들어오면 문제가 생길 때 그 의문이 해소가 되지 않는다. Tool을 다룰 때 직접 Build할 줄 알아야 그 다음 Step들이 이해가 가능해진다.
기본적인 연기, 불의 움직임을 묘사하려한다.
불이나 연기에 대한 묘사에 필요한 것에는 어떤 것들이 있을까?
1. 연기(density)
2. 속도(v or vel) ; 이류를 발생시키기 위해서 어떤 방식으로든 Vector Field가 필요할 것이다.
3. 온도(temperature) ; 우리가 연기의 움직임을 보면서 리얼하다고 느끼게 해주는 요소가 바로 온도이다. 만약 연기의 온도가 뜨겁다면, 뜨거운쪽에서 차가운쪽으로 이동하면서 속도가 생길 것이다. 반대로 연기는 존재하지만 온도가 없다면 바람의 영향만을 받게될 것이다.
연기의 움직임에 필요한 이 세가지 요소들이 Solver에 들어갈 Source가 될 예정이다.
Solver를 이용함에 있어 이러한 Source들은 필요에 따라 그 조건이 달라질수도 있다.
Particle에서의 Dop Network 구성과 Smoke에서의 Dop Network 구성이 닮은 것을 볼 수 있다.
Smoke Solver 세팅에서 각각의 node가 가지는 역할에 대해 얘기해보겠다.
Smoke Object는 우리가 얻고 싶은 Volume 결과가 어떤 해상도를 가지고 싶은지, 어떤 이름을 가지고 싶은지 정해주는 node이다. 주로 Container와 Visualize의 역할을 한다.
1. Bounding Box의 사이즈와 위치를 기반으로 Division Size 간격으로 나누어서 해상도를 만들 수 있다.
2. Visualize를 해줄 가이드가 디테일하게 존재한다. Volume은 Particle보다 Scene view 상에서 확인하는 과정이 복잡했다. 그러한 Visualize Tool들이 Smoke Object에 존재한다. 각각의 내용들은 Guide안의 다른 카테고리에서 조절이 가능하다.
Volume Source에서는 Source로 쓰고 싶은 자료를 불러오는 역할을 한다.
Dop network 밖의 자료 density, temperature, v or vel, wind와 같은 Source들을 주로 불러오게 될 예정이다.
1. SOP Path를 통해 Source를 어디에서 불러올지를 정해줄 수 있다.
2. Source Volume에서는 Source에서 사용하고자 하는 정보를 불러올 수 있다.
3. Target Field에서 쓰이는 내용은 Smoke Solver가 Source Volume으로 불러오고 있는 정보를 Target Field로 다루겠다는 의미를 가지고 있다.
Smoke Solver는 어떻게 계산을 하게 될지를 정해준다.
1. Temperature Diffusion에서는 매 Frame마다 temperature의 모양을 얼마나 blur하면서 진행 시킬 것인지를 조절해줄 수 있다.
2. Cooling Rate에서는 Volume이 가진 온도가 얼마나 빨리 식을지를 조절해줄 수 있다.
3. Viscosity는 점도라는 뜻을 가진다. 이번 강의에서는 배우지 않는다.
4. Buoyancy Lift는 온도에 따라 떠오르는 힘(부력)을 뜻한다.
5. Buoyancy Direction에서는 부력이 작용하는 방향을 정해줄 수 있다.
Smoke Source에서 불러들인 Volume을 어떻게 계산하는지 그 뉘앙스를 알아야한다.
Smoke Solver나 Pyro Solver가 정상적으로 작동하려면 Source Volume → Target Field → Solver의 과정을 반드시 거쳐야한다.
Solver는 어떠한 공식이 존재하여 주어진 Field의 내용들을 가지고 알맞게 계산할 것이다.
density, vel, temperature, fuel와 같은 Field에 놓여진 정보가 존재하는지 보고 Solver의 계산과정에 넣게 된다.
Solver는 전적으로 Target Field를 통해 올려진 Field 자체를 신뢰하기 때문에 의도를 재차 확인하지 않고, 주어진 정보를 그대로 계산한다.
예를 들자면 소금이나 설탕, 미원에 라벨을 붙이는 과정이 Target Field를 쓰는 과정과 같다. Target Field라는 병에, Source Volume인 내용물을 넣어둔다고 보면 된다. 우리는 병에 쓰여진 Label을 보고 그 내용물을 신뢰하기 때문에, 소금인지 설탕인지 재차 확인할 필요가 없다. Label을 믿기에 바로 요리에 사용한다.
마찬가지로 Solver의 공식은 어느정도 정해져있고, Density Field를 계산하는 법, Velocity Field에 따른 Density의 움직임, Temperature가 Velocity에 주는 영향, Divirsions에 따른 팽창과 같은 계산 공식은 정해져 있으며, Solver에 의해서 계산되게 된다.
Dop Network 밖에서 재료로 준비해온 Source가 어느 Target Field에 들어가야 하는지 정확한 Labeling 과정이 필요하다. 빨강색이라고 전부 케찹이 아닌 것과 같이 말이다. 케찹인줄 알고 핫소스를 쓰면 곤란한 상황이 발생하는 만큼, Source로 들여온 정보들을 올바르게 Field 위에 올려놓아야 제대로 계산이 될 것이다.
원운동을 하는 이름이 fog인 Fog VDB를 생성해주었다.
맨 아래의 Null node에 source 이름을 달아주었다.
Dop Network를 생성해 그 안에 Smoke Solver에 관한 기본 세팅을 해주었다.
Volume Source의 SOP Path에서 방금 만든 Source를 불러들였다.
Source Volume에는 fog를 넣고 fog가 density로서 계산되게 Target Field에 density를 써넣었다.
Fog VDB가 원운동하며 도너츠 모양을 만들어내었다.
fog와 조건이 똑같은 cloud를 생성해준 뒤 cos과 sin의 위치를 바꿔 움직이는 방향을 변경해준다.
Merge로 fog와 cloud를 합쳐준다.
source의 Node info를 확인해보면 fog와 cloud가 생성된 것을 볼 수 있다.
+ Volume의 해상도가 낮은 것 같아 전체적으로 voxel size를 0.04로 맞춰주었다.
Geometry 단계에서 새로운 Volume을 생성하였다. Smoke Solver에 해당 내용을 적용하기 위해서 Volume Source에서 Source Volume을 추가해 cloud를 density로서 계산해준다.
두 개의 Volume이 다른 방향으로 회전하며 도너츠를 만들고 있다.
VDB node로 wind의 정보를 생성해준다. Vector Field의 정보가 될 Bound node를 Box로부터 생성해준다.
VDB activate에서 Reference를 선택해 Input 2의 Vector Field를 VDB의 영역으로 활용하였다.
Volume Vop에서 wind에 {0,1,0}의 vector 정보를 만들어내었다.
wind의 정보를 merge하여 density와 source로 묶어주었다.
왼쪽은 wind의 Volume Vop에서의 constant의 값을 1을 준 경우고, 오른쪽은 위로 향하는 느낌을 좀 더 줄여주기 위해 constant 값을 0.05로 낮춰주었다.
새롭게 noise란 이름의 vel Field를 생성해 Curl Noise를 주었다.
위치 정보에 따라 3D Noise가 만들어질 것이며, Amplitude 값을 고정하고 constant를 multiply하여 noise의 세기를 조정해주겠다.
wind와 합쳐 velocity에 영향을 줄 것이다. 위로 올라가는 방향도 존재하고, Curl Noise도 존재하는 것을 볼 수 있다.
애매하게 혹은 건너뛰고 이용하다보면 확신이 안선다. 나중에는 애매한 부분들이 무언가를 만드는데 있어 발목을 잡게 될 것이다. 확실하게 알고 Smoke Solver를 이용하도록 하자.
다시 Volume Source을 꺼내 후디니가 제공해준 편의사항에 대해 이야기해보겠다.
경로 지정은 하지 않고 설명을 해보겠다. 만약 우리가 Smoke Solver에서 사용할 내용들이 미리 Geometry 단계에서 만들어졌다면, 어떤 정보를 쓸지, 어떤 Field를 배치할지를 골라주어야 한다. 이러한 과정은 Operation에서 +버튼을 눌러 하게 될 과정이다.
하지만 이 과정 이전에 마치 템플릿처럼 준비되어 있는 내용들이 있다. 그 내용들은 Initialize에서 선택이 가능하다.
만약 Initialize를 골라주었다면, 해당 Source Volume에 관한 내용을 Dop network 바깥에서도 만들주어야 한다. 이때 Source Volume의 내용과 같은 Geometry 단계에서 만들어두었던 Volume의 이름이 다르다면, 그에 맞게 Source Volume의 이름을 변경해 줄 수 있어야한다.
1. Dop Import Fields는 Particle에서의 Dop Import 같이 Dop network를 따로 불러다 사용할 수 있다.
2. Geometry 단계에서 시각화 하기를 원하는 Field의 정보를 Dop Network로부터 가져올 수 있다. 가져올 수 있는 정보는 Volume Source에서 확인하거나, Dop Network의 ROP Output node의 Node Info를 확인함으로써 알 수 있다.
blast node를 통해 불러들인 Field 정보를 분리해서 보았다.
Volume Visualization의 Density Field가 이제 무엇을 뜻하는지 이해하게 되었다.
Pressure는 처음에 그냥 Visualization을 해주면 Scene view에서 형태가 보이지 않는다.
Density Scale을 40까지 올려주고 Diffuse Ramp에서 밀도가 0인 부분을 흰색으로 변경해주어야 확인이 가능하다.
그 이유를 확인하기 위해 Density Ramp에서 밀도가 0인 부분을 조금 오른쪽으로 움직여 주면, 바로 Scene view에서의 패턴이 사라지게 된다. 이것으로보아 Pressure의 값은 0과 가까운 아주 작은 값인 것을 알 수 있다.
vel은 Convert VDB를 활용해 그 값을 VDB로 변경한 뒤 Volume Slice와 Volume Trail을 통해 확인하였다.
이때 VDB Vector from Scalar를 활용해 나누어져 있던 float vel.x,y,z를 하나의 vector vel로 합쳐주었다.
이번엔 Density Field, Velocity Field 뿐만 아니라 Temperature Field에도 Source를 넣어볼 예정이다.
VDB from Polygons로 density 이름의 Fog Volume을 생성해주었다.
name node를 이용해 temperature와 vel을 생성해준 뒤 하나의 Source로 만들어주었다.
이때 density와 temperature, vel이 같은 내용임에도 다르게 계산될 수 있는 이유는 이름에 따라 각각 다른 Target Field에 넣어짐으로써 Smoke Solver에서 계산되는 부분이 달라지기 때문이다.
Temperature Field를 사용해줌으로써 vel의 방향으로 이동하는 smoke가 자연스럽게 꺽이는 부분이 생성되었다.
하지만 이와 같은 Smoke가 아닌 지금은 직선으로 올라가는 Smoke를 보기 원한다.
vel의 정보에 Volume Vop을 달아 {0,1,0}의 vector 정보를 가지게 한다.
이제 velocity에 따라 위로 향하는 Smoke가 생성될 것이다.
temperature 또한 그 세기를 조절하기 위해서 parameter node를 생성해 곱해주었다.
이때 Constant가 아닌 Parameter node를 이용함으로써 Volume Vop 바깥에서 파라미터를 조절해줄 수 있다.
Smoke Object에서 원하는 Field에 대해 Visualization을 할 수 있다.
위로 올라가는 Smoke를 확인할 수 있다.
이때 temp_mult를 조절해주면 위로 상승하는 속도가 달라지게 된다. 이러한 영향을 보아 Temperature가 Density보다는 Velocity에 영향을 주는 것을 알 수 있다.
Dop Import를 생성해 Dop Network 외부에서도 Smoke Object와 같은 Visualization 효과를 낼 수 있다.
Merge로 Temperature와 Density를 함께 보았다. 둘의 겹친 부분을 보고 온도에 따라 density의 효과가 어떻게 나타나는지를 확인할 수 있다.
만약 Smoke의 변화를 알아보기 힘들다면, Distant 타입의 Light를 생성해 Smoke의 입체감을 높여줄 수 있다.
이제 부력에 대해 다루어보겠다.
Buoyancy Lift로 부력의 세기를 정해주고, Buoyancy Direction으로 부력이 작용하는 방향을 정해주었다.
{1,0,0}의 방향으로 5의 세기만큼 부력이 작동되게 하였다.
오른쪽으로 이동하는 Smoke를 확인할 수 있다.
이때, 부력 외에는 어떠한 영향도 받지 않게 하기 위해서 velocity의 vector 정보를 {0,0,0}으로 해주었다.
Smoke가 오른쪽으로 가면서 Boundary를 벗어나 그 영역만큼 보이지 않게 되었다. Tweak을 할 때마다 Bound를 변경해주는 것은 매우 번거롭다. 이에 Smoke의 움직이에 맞춰 Boundary를 조절해주는 Gas Resize Fluid Dynamics를 생성해준다.
처음으로 Smoke Solver의 큰 세팅에 변화가 생기게 되었다. Gas Resize Fluid Dynamics는 이제 앞으로의 대부분의 상황에 달고 다닐 예정이다.
Smoke Solver의 2번째 Input에 넣어준다.
Max Bounds에서 Clamp to Maximum을 꺼준 뒤, Bounds에서 Tracking Object를 체크해준다. SOP Path를 Source로 지정해준다.
앞서 만들어두었던 Smoke Object의 영역을 무시하고 Source를 Tracking하며 영역을 늘려주는 것을 볼 수 있다.
{1,0,0}의 velocity로 움직이는 Smoke에 {0,1,0} 방향으로 5만큼의 부력을 주었다. 이때 이 셋의 차이점은 가장 왼쪽부터 temp_mult가 0, 0.1, 1이다.
temperature 값이 바뀌면서 부력과 velocity에 영향을 끼치는 것을 볼 수 있다.
temperature에 따른 buoyancy는 직관적이고 쉬운 부분이다. 앞으로 temperature Field가 어떻게 다루어지는 계속 관찰하고 알 필요가 있다. 왜냐하면 temperature Field는 velocity Field에 직접적인 영향을 주는 몇 안되는 Field이기 때문에 생각보다 결과물의 형태에 많은 영향을 준다. temperature 값이 0일 때 부력이 작동하지 않는 것 또한 확인하였다.
velocity Field만을 써서 만드는 연기 모양에는 자연스러움의 한계가 있다. temperature Field가 velocity Field와 결합해 안쪽으로 휘어들어가는 추가적인 움직임을 만들어주기도 한다. 그렇기 때문에 temperature Field가 있는게 없는 것보다 더 그럴듯하다고 느끼게 된다.
모든 Field에 직접 관여하겠다는 마음으로 Smoke를 배우도록 하자.
Cooling rate 값이 0.5로 고정된 상태에서의 Temperature_Diffuse 값에 따른 변화이다. Temperature_Diffuse의 값이 증가함에 따라 Blur가 더 많이 들어간 것을 볼 수 있다.
Temperature_Diffuse 값이 0일 때 Noise의 형태가 자세하게 보이는 것을 알 수 있다.
Geometry 단계에서 Temperature와 Density를 merge하여 함께 보았다.
Temperature 아래에 Volume Visualization을 달아주었다. 이때 Visualization Range를 늘려줌으로써 온도에 대한 색에 변화를 주었다.
Temperature가 좀 더 연기와 하나가 된 모습을 볼 수 있다.
우리는 온도가 Velocity에 영향을 주어서 그 영향에 따라 연기가 움직이고 있는 것을 보고 있다.
Smoke : temp → vel → density
Particle : force(중력) → V(속도) → P(위치)
이와 같이 Smoke가 작동되는 방식을 이해한다면 좀 더 받아들이기 쉬워질 것이다.
마지막으로 연기가 불규칙하게 뿜어나오게 하기 위해 Temperature 값에 Noise를 준 뒤 Amplitude 값에 의해 높아진 음수값을 줄이기 위해서 Clamp 해주었다.
Temperature_Diffuse 0, Cooling rate 0, Buoyancy Lift 5의 값을 준 결과이다.
왼쪽은 Noise를 주지 않았고, 오른쪽엔 Temperature에 Noise를 주었다. Smoke의 형태가 좀 더 다양해진 것을 볼 수 있다.
'TWA Houdini1 > Volumes' 카테고리의 다른 글
TWA 후디니 1 Volume_09 : 충돌 세팅 2가지, VDB from Particles (0) | 2023.03.01 |
---|---|
TWA 후디니 1 Volume_08 : 연기 모양에 영향을 미치는 것들 ; 횃불 만들기 (0) | 2023.02.28 |
TWA 후디니 1 Volume_06 : Solver와 함께 Volume 다루기 (0) | 2023.02.25 |
TWA 후디니 1 Volume_05 : 볼륨의 확산? 이류? Volume advect (0) | 2023.02.23 |
TWA 후디니 1 Volume_04 : 벡터 볼륨 Vol Trail, Gradient, Curvature (1) | 2023.02.22 |