TWA Houdini1/Volumes

TWA 후디니 1 Volume_08 : 연기 모양에 영향을 미치는 것들 ; 횃불 만들기

yiss09 2023. 2. 28. 20:46

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

 

HOUDINI1_ VOLUMES

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

www.twahoudini.com

 

twa Houdini1 volume 08 강의에서 캡쳐

Volume 08에서는 이와 같은 효과를 만들어 볼 예정이다.

횃불처럼 불이 나오는 것을 볼 수 있고, 작은 불씨들이 열기에 의해 올라가는 것도 확인할 수 있다.

오늘은 단일한 Solver만으로  결과물을 만드는 것이 아니라, Volume과 Particle을 모두 다루어야 한다.

이러한 효과를 쌓아 나가는 과정을 통해 기본기를 다져보려 한다.

 

1. 이론 설명

2. 예제 Small fire

 


1. 이론 설명

 

먼저 기본 셋팅을 잡아주었다.

Sphere를 생성하여 Fog VDB의 density 정보를 생성해준 뒤 Name node로 이름을 변경해 temperature와 vel의 정보를 만들어주었다.

각각의 정보를 쉽게 다룰 수 있도록 Volume Vop을 달아준 뒤 Null node를 달아 Naming 해준 다음 Merge node를 사용해 하나의 Source로서 합쳐주었다.

 

Source를 준비하는 방법에는 방금의 방법과는 다른 더 간단한 방법도 존재한다. 그럼에도 불구하고 좀 더 까다로운 위의  방식을 사용하는 이유는 Solver에서 이용하고 싶은 것이 Volume이라는 것을 명확하게 인지하기 위해서이다.

 

Pyro Source를 간단하게 나마 짚고 넘어가겠다. Pyro Source를 생성함으로써 Source들을 쉽게 불러올 수 있다. 그러나 Pyro Source 하나만으로 모든 Setting이 끝나는 것은 아니다.

Pyro Source는 우리가 어떤 Volume 정보를 만들고 싶은지 그 정보가 될 Point를 만들어줄 것이고, Volume Rasterize Attributes node로 Point를 Volume으로 바꾸는 과정이 따로 필요하다.

자세한 내용은 다음 기회에 알아보도록 하겠다.

 

다시 본론으로 들어왔다.

Dop Network를 생성하여, Dop Network 안에서도 기본적인 Setting을 해준다.

Smoke Object의 Bound Size를 정해주고 무엇에 대해 Visualization할지를 정해둔다.

Volume Source에서는 SOP Path를 source로 지정해준 뒤, Geometry 단계에서 만들어둔 Field에 넣어줄 Source Volume들을 불러와준다.

Gas Resize Fluid Dynamic에서 Clamp to Maximum을 꺼준 뒤, Tracking Object의 SOP Path를 지정해준다. Smoke의 움직임에 따라 Boundary가 조정된다.

이제 density, temperature, vel에 따라 움직이는 Smoke를 확인할 수 있다.

 

Smoke가 대각선을 향해 움직이고 있다. 이를 수정하기 위해서 velocity에 {0,0,0}의 위치 정보를 주어 어떠한 값도 존재하지 않도록 해주었다.

오로지 Buoyancy에 의해서 위쪽으로만 올라가는 Smoke가 만들어졌다.

 

Dop Import Fields를 생성해 Geometry 단계에서도 Density, Temperature, Velocity의 값들을 시각적으로 볼 수 있게 하였다.

Geometry 단계에서 Volume을 볼 때에는 Lights를 생성해 Smoke가 더욱 입체적으로 보이게 해줄 수 있다.

 

앞으로의 작업을 위해 연기가 어느정도 나오다가 증발하는 것과 같이 묘사하고 싶다. 새로운 node를 사용하겠다.

Gas Dissipate는 주어진 Field의 정보가 얼마나 빠르게 소멸될지를 정해준다. 비슷한 내용으로 Smoke Solver의 Temperature Diffusion와 Cooling rate의 내용과 거의 똑같다(다만 이 경우 Temperature에 관한 내용임).

1. Diffusion은 blur에 관여하는 파라미터이다.

2. Evaporation Rate는 증발율로 값이 커지면 커질수록 Field 값이 빠르게 줄어든다. 값이 1이 되면 생기자마자 증발하여 상승하지 않고 가만히 있는 듯한 모습을 보인다.

 

만약 중간에 밀도의 제공이 멈춰진다면, 미리 만들어진 상승하는 Smoke만이 모습을 보일 것이다. 밀도가 10 Frame만 제공될 수 있도록 만들어보겠다.

Density의 Volume Vop을 수정해주겠다. Parameter로 Geometry 단계에서 Density의 값을 조절할 수 있도록 해주겠다.

density_mult의 11~21 Frame 까지는 1의 값을 주어 Density 값이 생성되도록 해주었고, 24가 되면 0의 값을 가지도록 Animation을 주었다.

아랫 부분이 사라지고 Smoke의 윗 부분만 남아서 상승하는 것을 볼 수 있다.

 

Gas Turbulence는 noise를 가진 Velocity Field를 생성해준다. 

Gas Turbulence를 보면 조작할 수 있는 많은 파라미터가 존재한다. 이때 하나하나 값들을 수정해가며 결과를 확인하는 것은 불필요하게 시간이 오래 걸리게 된다. 새롭게 배우는 단계에서는 큰 시스템을 이해하는게 훨씬 중요하다.

Smoke Solver에서 Gas Dispate란 node로 어떤 정보를 없애기 위해서 활용하려한다. 밀도에 영향을 줄 것인지 온도에 영향을 줄 것인지를 아는 것이 훨씬 중요하다. 구체적인 값들을 넣어서 하나하나 알아보는 것은 node의 작동방식을 이해한 뒤에 하여도 늦지 않는다.

node를 필요로 하는 이유, 해당 node를 써서 얻을 이점이 머리 속에 있어야 한다. 

 

Visualize Turbulenece를 체크해주면, Velocity에 관한 어떠한 흐름을 확인할 수 있다. 

이러한 Velocity가 어디에 적용되는지는 Control Field에 적혀 있다. Gas Turbulence가 density에 의해 적용되고 있는 것이다. 밀도에 없던 정보가 Gas Turbulence에 의해 생겨났다.

이때 Control Field에 적힌 내용은 변경이 가능한데, 만약 temperature로 변경하게 된다면, Noise를 가진 Velocity Field가 Temperature에 적용되게 된다.

Density와 Temperature의 모양이 아주 미세하게 다른 것을 볼 수 있다.

 

Gas Turbulence에서의 Size와 Swerl Size 값을 변경해보았다.

값이 커질수록 Noise의 변화가 큰 느낌이 든다.

 

Gas Shred는 Scalar 값이 높은 쪽을 향하는 Velocity Field이다. Scalar 값이 커지는 방향이라면 그 내용으로 Gradient 값이 떠오른다.

온도에 의해 Gas Shred가 적용된다면, 온도가 높은 곳에선 쎈 힘이 발생하고 온도가 낮은 바깥쪽에서는 낮은 힘이 발생한다.

Temporary Field 카테고리에서 임시 Field를 만드는 부분이 존재한다. 임시 Field에 관한 설명은 복잡하기 때문에 아래에서 이어서하겠다.

 

Gas Shred가 어떻게 쓰이게 되는지는 나중에 이야기하겠다. 지금은 이 시스템이 어떻게 세팅이 되어 있는지를 보겠다.

앞선 과정에서 Source로서 Gradient 정보는 만들어지지 않았다. 그런데 Gas Shred는 Gradient 정보를 기반으로 값이 높은 쪽(뜨거운 쪽)에서 열이 더 많이 돌기를 바라는 node이다.

Gas Shred는 한 사이클이 도는 과정에서 임시로 Gradient 정보를 만들어서 쓰게 된다. 그리고 한 사이클이 끝날 때 다시 Gradient 정보를 지워줄 것이다. 다시 지워줌으로써 Solver가 다시 시작될 때 시작과 끝의 정보가 동일해진다.

 

만약 Gradient의 정보가 남아 있다면 앞 뒤로 Gradient가 남아 사이클은 계속 돌겠지만, 결과에 불필요한 영향을 끼칠 우려가 있다. 때문에 Gas Shred는 자신의 영역 안에서 Velocity 값에 Gradient를 더했다가 Gradient의 그릇(Field)을 없애버린다. 잠시 필요한 Field를 만들어서 계산에만 이용하고 다시 없애는 것이다.

 

Allow Editing of Contents를 해줌으로써 Gas Shred 안으로 들어가보겠다.

Gas Shred가 실제로 작동하는 한 사이클이다. 현재 Dop Network에서는 Gas Shred 전에 Gas Dissipate까지 계산된 상태이다. Gas Dissipate의 계산이 된 상태로 Gas Shred를 작동하게 된다. 

Merge node로 들어오는 Input의 순서와 같은 순서로 계산이 되는 것을 예측할 수 있다.

1. 임시로 사용할 Gradient Field를 만들기위해 기존에 가지고 있던 Field를 복사해주기 위해 Gas Match Field를 사용해준다. Reference로 velocity Field를 복사한다. 그 이유는 Gradient가 vector 정보이기 때문에 같은 vector 정보인 velocity를 이용하는 것이다.

현재 실질적으로 가지고 있는 Gradient Field에는 vel에 대한 정보가 들어있다. Gas Match Field 과정에서 Velocity Field에 있는 vel까지 함께 복사해준 뒤 Field의 이름만 Gradient로 바꾼 것이다. 

2. Temperature Field에 있는 내용으로 Shred temp(temptemp)라는 새로운 Field를 생성해주었다. 

3. Gas Analysis를 이용해 밀도 정보(temptemp)를 gradient 정보로 바꿔줄 수 있다. 이때 Dest Field에 적힌 Field의 내용물이 Gas Analysis에서 분석한 내용으로 대체되게 된다. gradient 값이 Gradient Field로 들어가게 된다.

4. 이제 Gradient Field에 담긴 gradient 정보가 꾸며질 예정이다. Noise가 추가될 수도 있고, 밖에 추가된 Parameter 값에 반응할 수 있도록 꾸며지는 과정이 있을 것이다.

5. 꾸며진 Gradient 정보는 Gas Linear Combination에서 Vel에 더해지게 된다. Gas Linear Combination은 VDB Combine과 유사하게 생겼다. 파라미터를 확인해보면 vel에 gradient를 더해주도록 설정되어있다. Destination에 적힌 내용에 따라 더해진 정보들은 Vel Field로 들어가게된다. 

6. 마지막 공정에서는 Gas Caculate를 써서 Gradient의 정보를 제거해주려 한다. Source Pre-Mult의 값에 0을 줌으로써 Dest Field에 적힌 Field 정보를 제거해주게 된다.

 

Gas Shred를 사용함으로써 뜨거운 쪽에서 소용돌이가 더 많이 치게 할 수 있다.

현재 결과물을 보면 Gas Shred가 너무 쎄게 적용되어 있다. Scale 값을 낮춰준다.

Gradient에 따른 추가적인 Velocity를 생성해준다.

 

Gas Disturb는 Advect의 조건이 되는 Velocity Field에 Random하게 영향을 준다.

어떠한 흐름에 따라 바람같은 효과를 주는 것이 아니라, Velocity에 마구잡이로 방향을 바꾸기 때문에 결과적으로 연기가 부러지는 것처럼 묘사가 된다. 이러한 효과를 멀리서 볼때는 Smoke의 흐름과 같은 묘사는 뭉개져 보일 수 있지만, 더욱 리얼하게 보여 그 장점이 두드러진다. 

Gas Disturb는 따로 Temporary Field를 가지고 있지 않는 것을 보아 앞의 node들에 비해 상대적으로 간단하게 만들어진 node인 것을 알 수 있다.

 

현재 그냥 Smoke Solver만 가지고 해결할 수 없었던 내용들을 Gas 관련 node들로 해결해주었다. 지금까지 사용했던 Gas node들은 전부 Velocity에 영향을 주었다. Density Field가 움직이는 이류 조건이 Velocity Field이다.

Gas 관련 node들의 대표적인 파라미터들을 만져봄으로써 복습에 큰 도움이 될 수 있다.

 

node 내부로 들어갔을 때 알게된 Gas node들이다.

Gas Match Field는 Field를 복제한다. Gas Linear Combination와 Gas Calculate는 Field를 계산해준다. Gas Analysis는 Field를 분석해준다.

이러한 node들은 이후에 따로 다룰 예정이다.

 


2. 예제 Small fire

 

 

이론 설명 파트에서 사용하였던 Source를 복사해왔다.

Sphere를 Copy to Points를 통해 원운동하도록 만들어 주었다.

불덩이처럼 일렁이게 만들기 위해서 Sphere에 Attribute Noise를 달아 Animation을 주었다.

 

Dop Network 안에서 Smoke Solver에 대한 기본 세팅을 해주었다.

 

Dop import Fields로 Dop Network에서의 정보를 불러와 Geometry 단계에서 시각적으로 볼 수 있게 해주었다.

Blast로 density만을 떼어내어, Volume Visualization을 달아주었다.

BlackBody 색상을 이용하였다. Emission Scale의 세기와 Emission Color Ramp의 값이 바뀜에 따라 색깔에 대해 조명되는 느낌이 달라지게 된다. 

 

이제 Dop Network 안에서 증발할 수 있는 세팅을 만들어주려 한다. 만들어둔 Smoke가 불처럼 묘사되길 바란다.

Blur가 과하다고 느껴져 Temperature Diffusion과 Cooling Rate에 0의 값을 주었다. 디테일이 조금 살아난 것을 볼 수 있다.

 

Subtraction Rate는 값을 빼는 방식으로 사용된다. 즉, 0.95의 0.95인 상태이다. 

Subtraction Rate를 켜줌으로써 디테일하게 증발률을 조절할 수 있게 된다.

 

Gas 관련 node들을 달아줄 때 먼저 떠오르는 것부터 쌓아올려도 상관이 없다. 순서는 결과에 남는게 아니기 때문에 의도에 맞고 결과만 예쁘면 된다.

그럼에도 불구하고 Dissipate은 제일 먼저 정해두고 진행하면 좋은데, 그 이유는 Dissipate가 뒤로 가게 되면 Shred나 Disturb와 같은 Shape이 바뀌는 효과들을 먼저 쓰게 된다. 이것들은 적용하자마자 시각적으로 화려하게 보이기 때문에 집착이 생기게 된다.

불처럼 묘사하려면 적당히 증발하여 사라져 주어야하는데, 위쪽에서 발생하는 현란한 Turbulence들을 포기하기 어려워질 수가 있다. 그래서 기왕이면 Dissipate으로 만들려는 결과물에 알맞게 증발하는 양을 맞춰주는 것이 시간 절약에 많은 도움이 된다.

 

Gas Shred와 Gas Turbulence를 연결해줌으로써 Smoke로서의 디테일을 늘려주었다.

그 다음 세부적인 파라미터를 Tweak 해주었다.

만약 불을 더 뜨겁게 보이게 만들어주려면  Temperature 값의 크기를 높여줌으로써 해결해줄 수 있다.

Smoke solver 세팅은 마무리가 되었다.

 

완성된 Smoke Solver의 결과를 저장해주려한다. 

출력에 필요한 정보는 Density 밖에 없으니 blast에 File Cache를 연결해도 될 것이다.

하지만 POP Solver에서 이용할 위치정보로 Velocity의 정보가 필요하다. 때문에 vel의 정보를 포함하고 있는 Dop Import Fields에 File Cache를 연결해주겠다.

 

Gas Resize Fluid Dynamic은 Density의 크기에 맞춰 Volume의 Bound를 정해준다.

그 때문에 Velocity에 대한 정보가 필요한 경우에도 Gas Resize Fluid Dynamic가 움직이면서 범위 밖의 정보를 제거하기 때문에 density 이외의 정보 사용에 번거로움이 생긴다.

이를 해결하기 위해서  Gas Resize Fluid Dynamic을 제거한 다음 Smoke Object의 Bound의 영역을 직접 조절하여 Velocity 정보를 이용함에 필요한 만큼의 영역을 정해주겠다.

 

File Cache node를 하나 더 생성해 Smoke Object에서 설정한 Bound를 영역으로 사용하는 Smoke를 저장해준다.

이제 Particle을 만들어줄 차례이다.

Blast로 분리한 Density의 정보에 Scatter를 달아 Particle의 Source로, vel의 정보는 Particle의 위치 정보로서 사용해주었다.

 

 

Scatter node에서 Force Total Count로 Particle의 수를 조절해주었다. Global Seed를 Frame마다 다르게 설정되게 하여 불규칙하게 Points가 위치하도록 해주었다. 또한 POP Source에서 Life Varience를 0.5로 맞춰 Particle이 일찍 사라지게 해주었다.

POP Advect by Volumes는 particle에 아주 자연스러운 vel의 정보를 입힐 수 있다. 

Update Force는 처음 시작할 때 주어진 Velocity가 힘으로써 작동한다. 이 말은 Velocity가 0인 상태에서 점점 커진다는 것을 뜻한다. 이 때문에 시작이 느린 것이다.

Advection Type을 Update Velocity로 변경하면 해당 문제가 해결된다.

 

왼쪽부터 POP Advect by Volumes를 사용하지 않은 경우, Advection Type이 Update Force인 경우, 마지막으로 Advection Type이 Update Velocity인 경우이다.

Update Velocity가 증발하는 느낌을 제일 잘 표현해주고 있다.

 

완성된 Particle에 Trail-Add-Carve를 달아 Point를 line으로 표현해주었다.

Color node로 불똥 같은 느낌의 색상을 주었다.

마지막으로 완성된 Particle과 Smoke를 Merge하여 함께 보았다.