본문 바로가기

Houdini/Houdini1_Volumes

08_연기 모양에 영향을 미치는 것들, POP ADVECT BY VOLUME 적용


오늘의 강의

1) 이론 설명

2) 예제 진행

3) 렌더

 

오늘은 단일 solver로 결과를 내지 않는다.

볼륨 + 파티클 사용


기본 세팅을 진행한다.

위의 세팅을 고수하는 이유는 우리가 현재 solver에서 사용하고 싶은 정보가 명확히 볼륨이라는 것을 인지하기 위해서이다.

 

다른 방식의 세팅법도 있다.

pyro source 노드 하나만으로 세팅이 끝나는 것은 아니다. 이 노드는 우리가 어떤 볼륨 정보를 만들고 싶은지 그 정보가 될 포인트를 만들어주게 되고, volume rasterize attribute 노드로 포인트를 볼륨으로 바꿔주는 과정이 따로 필요하다.

Pyro Source parameter

pyro source 세팅을 할 때, attribute를 추가해주고, attribute가 custom인 상태에서 각각 name을 적어준다.(여기에서는 density, temperature, vel로 적어줬다.) 그리고 Attribute를 각각에 맞는 attribute로 선택해준다.

sphere가 포인트 정보로 바뀌었다.
pre sourece 와 pyro source는 형태가 다르다.

Volume Rasterize Attribute Node

  • 포인트의 정보를 볼륨정보로 바꿔주는 노드

Volume Rasterize Attribute parameter

General의 Attributes 에 우리가 바꾸고 싶은 포인트정보에 대한 이름을 적어줘야한다.

이 방식이 쉬울 수 있지만, 어쨌든 오늘은 처음 방식으로 진행하기로 하자.

기본 세팅이 마무리되었다.


볼륨을 위한 전용 노드들은 노드 이름 앞에 'gas'가 붙는다.

 

Gas Dissipate Node

  • 주어진 field의 정보가 얼마나 빠르게 소멸할지 정해주는 노드

Field : 어떤 field에 대해서 dissipate가 적용되는가? 에 대한 항목

Diffusion : 블러에 관여하는 항목

Evaporation Rate : 이 값이 커질수록 field의 정보가 빠르게 줄어든다(증발).

 

만약 Gas Dissipate 의 field가 temperature일 경우, Evaporation Rate의 값은 마치 Smoke Solver의 Cooling Rate처럼 작동한다.(값이 커질경우, 빠르게 온도가 식는다)


앞으로 작업을 진행하다보면, Smoke Solver의 세번째 인풋인 Velocity Input에 많은 노드들이 달리게 된다.

이 때 계산의 순서는 merge에 달리는 순서와 같다.

  • 위의 이미지를 해석하면, gas dissipate가 첫번째로 계산되고, gas turbulence가 두번째로 계산된다.
  • merge에 연결되는 순서에 따라서 같은 노드를 사용해도 결과가 달라질수도 있다.

Gas Turbulence Node

  • 어떠한 방식의 Velocity Field
  • Noise를 가진 Velocity field를 생성해준다.
  • Velocity field가 어디에 적용이 되는지에 대해서는 Control Setting tap의 Control Field에 기입된다.
    • 밀도 정보가 Gas Turbulence에 의해 없었던 이류 조건이 생긴 것이다.
    • Control Field에 density가 아닌, temperature가 올 수도 있고, 다른 field가 올 수도 있다.

Gas Turbulence > Turbulence Settings
Gas Turbulence > Control Settings
Gas Turbulence > Visualization
Gas Turbulence > Temporary Fields
Gas Turbulence > Bindings
Gas Turbulence > Advanced
Gas Turbulence > Visualize Turbulence를 활성화한 결과
Temperature field에 gas turbulence가 적용된 결과

  • Turbulence Settings
    • Scale : 얼마나 noise velocity field를 강하게 먹이고 싶은지에 대한 항목

Scale 0.05
Scale 0.15
Scale 0.5
Scale 0.75

Swirl size : 스모크의 자잘한 패턴이 더 많이 나온다(더 자글자글하다)

Scale 0.15 / Swirl Size 0.2
Scale 0.15 / Swirl Size 0.65

아래 항목들은 직접 조절해보고 업데이트!!

 


Gas Shred Node

  • 어떠한 방식의 Velocity Field
    • Trail로 표현이 된다는 것은 높은 확률로 Velocity Field 이겠거니 하면 된다.
  • Scalar 값이 높은 쪽으로 향하는 Velocity Field
    • Scalar 값이 높은 쪽 > 값이 커지는 방향 > Gradient 
  • Velocity field가 어디에 적용이 되는지에 대해서는 Control Setting tap의 Control Field에 기입된다.
    • 현재는 control field에 temperature가 기입되어있다.
      • 온도가 높아지는 쪽을 향하게 된다.(밖에서 안으로)
  • 일단 두군데를 주목할 필요가 있다.
    • Control Settings > Control Field
    • Temporary Fields
  • 우리는 애초에 gradient 정보를 만들지 않았다.
  • 하지만 Gas Shred는 gradient를 기반으로 값이 높은 쪽, 즉 뜨거운 쪽에서 열이 더 많이 돌기를 바란다.
  • Gas Shred는 Smoke solver가 한사이클 도는 과정에서 임시로 gradient 정보를 만들어서 Gas Shred 계산시 사용한다.
  • 그리고 Gas Shred 계산이 끝나면 임시로 만들었던 gradient 정보는 지워준다.
  • 그렇게 함으로써 처음 solver의 시작 데이터와 끝 데이터의 동일성을 보장한다.

 

Smoke Object 에서 density를 꺼준 모습

Gas Shred 노드를 분석해보자면,

  • 앞으로 임시로 사용할 gradient 라는 field를 만들어야 하기 때문에, 기존에 가지고 있는 field를 복사해주는 과정이 필요하다.
  • 이 때 gas match field라는 노드를 사용한다.
    • reference로 velocity field를 복사한다.
      • 그대로 복사를 해서 gradient_field를 만들기 때문에 아직은 값이 커지는 방향과 같은 정보는 아니다.
      • vector 정보를 다루는 그릇, field를 복제해준 것이다.
    • 마치 dop network 밖에서 density를 name 노드를 사용해서 temperature로 이름만 바꿔서 복제해준 것 같은 것이다.

Gas match Field parameter

  • gas match field를 한번 더 사용한다.
    • 이번에는 temperature field를 reference로 활용해서 shred_temp라는 field를 복제한다.

  • Gas Analysis 노드를 사용해서 밀도 정보를 gradient 정보로 변환해준다.
    • 여기에서 분석한 내용을 Dest Field에 적힌 gradient_field의 내용으로 대체해준다.
    • 아직까지는 위에서 복제한 Gradient field에는 Velocity Field를 복제하면서 Vel 정보가 들어있었지만, 이 단계에 오면서 Gradient 정보로 대체되는 것이다.

  • Gradient에 대한 정보는 옆의 Gas Field VOP / Gas OpenCL에서 꾸며진다.

  • 이렇게 꾸며진 gradient는 Gas Linear Combiation 노드에 의해 실제 velocity field에 더해진다.
    • VDB Combine과 비슷한 개념
    • 아래 이미지에 보면 source1(vel) 과 source2(gradient)를 combine operation(Add)한다는 것이다.
    • 더해진 결과는 Destination(vel)으로 가게 된다.
    • source1과 source2가 더해질 때, 각각의 source에 곱해지는 값이 존재한다.(Coefficient 1,2)

  • 마지막으로 Gas Calculate Node를 사용해서 gradient 정보를 날려준다.
    • gradient field 안에 있는 gradient 정보를 날려주면서(source pre-mult 가 0으로, gradient에 0을 곱해줘서 날려버린다.) gradient field는 비어있게 되고, Gas Shred 노드의 계산이 끝나고 밖으로 나가게 되면 gradient field는 사라진다.

 

Gas Turbulence Node 또한 위와 유사하다.

임시 field로 forcevel_temp field를 velocity field를 복제함으로써 만들어주고, turbulence를 계산하고, velocity field에 더해준 뒤, gas linear combination 노드를 사용해서 forcevel_temp field를 비어있는 field로 만들어준다.

  • Gas Shred와 다른 점이 있다면, Gas shred는 임시 필드를 비우기 위해 Gas Calculate 노드를 사용해서 임시 필드의 정보에 0을 곱해줌으로써 비웠고, Gas Turbulence는 임시 필드를 비우기 위해 Gas Linear Combination 노드를 사용해서 임시 필드에 아무런 정보를 전달하지 않는 것으로 임시 필드를 비웠다는 것이다.

임시 필드에 아무런 소스를 전달하지 않는 것으로 비워버렸다.

 

Gas Shred를 활용한다는 것은 뜨거운 쪽에서 더 많은 소용돌이가 치기를 바란다는 것이다. 그런 세팅이 Gas Shred 안에 들어있는 것이다.

이런 가로 / 세로 줄이 나오는 것은 좋은 결과는 아니다.
처음 시작시 shred 효과가 강하게 나오는 것은 온도가 높기 때문이다.
위로 올라갈수록 온도가 낮아지기 때문에 shred 효과는 약해진다.


Gas Disturb Node

  • 이류의 조건, velocity field에 영향을 주는 노드이다.
    • 마치 random과도 같은 노드이다.
    • 어떠한 흐름에 따라 바람과도 같은 영향을 주는 것이 아니라 velocity에 마구잡이로 방향을 바꾸기 때문에 결과적으로 연기가 뿌러지는 것과 같은 묘사가 된다.
  • 연기를 어느정도 흩어놓음으로써 멀리서 봤을 때 자연스러움을 더해준다.

Strength 25
Strength 2
Strength 0.6


정리!

  • 그냥 Smoke Solver만으로 해결할 수 없던 부분들을 Gas 관련 노드들을 활용해서 해결했다.
  • 그리고 위에서 봤던 Gas 관련 노드들은 모두 velocity에 영향을 주는 노드들이었다. 그리고 이 노드들은 smoke solver의 velocity update input에 연결되었다.
    • velocity field 별거 없다. density field가 움직이는 이류 조건이 velocity field 이다.
    • 위의 노드들은 모두 모양에 영향을 주는 노드들인것이다.
  • Gas Dissipate - 밀도값을 떨군다.
  • Gas Turbulence - 노이즈 패턴에 따른 추가적인 velocity를 생성해준다.
  • Gas Shred - gradient에 따른 추가적인 velocity를 생성해준다.
  • Gas disturb - 랜덤하게 velocity를 괴롭혀서 연기를 흩어놓는다.

오늘 복습해야하는 부분

 - 위 네가지 노드들의 대표적인 파라미터들을 꼭 만져볼 것

 


pyro solver를 꺼내보자.

Smoke Solver와 Pyro Solver의 parameter tap 비교

Smoke Solver parameter
Pyro Solver parameter
Pyro Solver > Shap Tap parameter

pyro solver의 shape tap에 보면, 위에서 공부했던 내용들이 파라미터로 나와있는 것을 확인할 수 있다.

 

 

pyro solver의 안으로 들어가보자.

마지막을 보면 smoke solver를 확인할 수 있다.

 

결국 pyro solver는 smoke solver가 더욱 디테일하게 빌드된 형태이다.

 


예제를 만들어보자.

횃불을 만들어볼 것이다.

 

본인의 작업에 기준을 두고 작업을 하기를 권장한다.

계획을 세우고 작업을 할 필요가 있다.

그리고, 초반에 너무 tweak 하지 말 것!

최선의 해상도를 쓰는 것은 마지막에 하는 것이다.

 


A. Smoke Solver 작업

  1. source 잘 정의하기
  2. smoke solver setting
  3. fire shape 잡기
  4. tweak
  5. file caching

B. Pop Solver 작업

  1. source 잘 정의하기
  2. pop solver setting
  3. 파티클 움직임에 대해 정의하기
  4. file caching

temperature 가 블러되는 것이 아쉬운 상황이면, smoke solver의 temperature diffusion 수치를 조절하자.

temperature diffusion 0 / cooling rate 0
temperature diffusion 0.25 / cooling rate 0.5

증발되어 사라지는 표현을 위해서 Gas Dissipate를 연결해준다.

  • Gas Dissipate의 Diffusion은 블러와 관련이 있기에 0으로 두고, Evaporation Rate만 0.95 정도로 올려준다.

해상도를 0.025로 높여본 결과

 

팁!
스스로 작업을 진행할 때, 떠오르는 것부터 하나씩 쌓아가면서 잡아도 된다. 터뷸런스를 먼저 적용할 수도 있고, 슈레드를 추가하고 디시페이트를 줄수도 있다. 순서가 결과에 남는 것은 아니기 때문에 의도에 맞고 결과만 이쁘면 된다.
그런데 기왕이면 디시페이트를 제일 먼저 적용해서 정하고 작업하는 것이 좋다. 만약 디시페이트를 작업의 맨 뒤로 보낸다면, 터뷸런스, 슈레드, 디스터브같이 shape이 바뀌는 효과를 먼저 사용하게 되는데, 이 노드들은 적용을 하자마자 시각적으로 화려하게 보이기 때문에 작업자 스스로 집착이 생길 우려가 있다. 불처럼 보이려면 적당하게 증발해야하는데, 증발되지 않은 상태에서 위쪽에서 표현되는 현란한 터뷸런스같은 것들을 포기하기가 어려워진다.
그렇기 때문에, 불이라면 적당히 증발해야지, 폭발이라면 증발이 아닌, 연기로 보여야지 이런 부분들을 먼저 잡아주는 것이 시간 절약에 도움이 된다.

 

Gas shred를 추가해준다.

너무 shred 효과가 강하게 적용되어서 세로 / 가로 줄이 나타나고 있다. 스케일을 조정해준다.

Gas shred > scale 0.1

Gas Turbulence를 추가해준다.

해상도 0.03으로 올린 결과

좀 더 증발을 진행해도 될 듯 하므로, Gas dissipate 노드에서 수정해본다.

  • Subtraction Rate : 값을 빼주는 방식으로 적용된다.

Subtraction Rate 0.95 적용결과, 위의 이미지보다 꼬리가 많이 짧아졌다.

swirl의 사이즈가 커보인다. shred를 조절하자.

Gas shred scale 0.25

gas turbulence도 조절하자.

Gas turbulence scale 0.2 / swirl size 0.55
Gas turbulence scale 0.13 / swirl size 0.55

색을 조절해보자.

 

이제 주어지는 온도가 높아지면 어떻게 될까?

temperature를 10배 해준 결과. 더 격하게 뜨거운 느낌이 난다.

마음에 드는 불과 같은 효과를 위해서 tweak를 더 해볼 필요가 있다.

 


이제 불이 탈 때 튀는 불씨들을 만들어줘야한다.

pop solver를 이용한다.

그리고 pop solver를 사용하기 전, 위에서 만들어준 불에 대한 데이터를 file caching해줄 필요가 있다.

 

file caching을 위해서 어디에 file cache 노드를 연결할지도 중요하다.

만약 blast 아래에 노드를 연결한다면 density 데이터만 cache로 얻게 될 것이다.

dop import field 아래에 노드를 연결한다면 density 뿐만 아니라 vel 과 temperature의 정보도 cache로 얻게 될 것이다.

 

 

이제 pop solver로 파티클을 만들어보자.

우리가 이용할 정보는 file cache 데이터 중 velocity field 이다. 여기에서 발생하는 velocity field에 의해 포인트가 움직이도록 하고 싶은 것이다.

 

현재 좀 아쉬운 부분이 있다. 바운딩 박스 사이즈가 계속 유동적으로 변화하는 것이 아쉬울 수 있다.

velocity에 의해서 위쪽으로 뻗어나가는 정보가 존재해야하는데, 밀도가 사라지면서 바운딩박스가 줄어들게 되고 velocity 또한 사라져버린다.

 

Gas resize fluid dynamic 노드의 연결을 해제해주는 것으로 해결이 가능하다.

Gas resize fluid dynamic을 해제하는 것으로 smoke object에서 설정했던 size 안에서는 velocity field를 얻어낼 수 있다.

이 부분을 챙겨주지 않으면, velocity field에 의해 움직이던 파티클들이 velocity field가 사라지면서 허공에 멈춰버리고 뚝뚝 끊겨버리는 것을 볼 수 있다.

새로운 file cache로 이 velocity field를 저장해준다.

 

기본적인 파티클 시스템 세팅을 진행한다.

pop source에서 필요한 source 세팅을 진행한다.

현재 density 정버에 scatter로 점을 뿌리고, 그 점에서 파티클이 나올 수 있도록 pop source는 emission type을 points로 설정해준다.

이제 생성되는 파티클이 움직이도록 해줄 필요가 있다.(현재는 dop network 밖에서의 point의 움직임의 궤적을 나타낼 뿐이다.)

pop advect by volume 노드를 활용한다.

 

Pop advect by Volume Node

SOP : 어느 경로에서 field를 불러올 것인지 기입

Advection Type : 주어지는 field를 어떻게 적용할 것인지에 대한 항목

  • update force : 주어지는 field의 정보가 힘으로 작용된다.
    • velocity가 0인 상태에서 점점 커지는 것을 의미한다.
  • update velocity : 주어지는 field의 정보가 속도로 작용된다.
  • update position : 주어지는 field의 정보가 위치정보로 작용된다.

 

이동은 하는데 아쉽다.

  1. 첫 시작이 매우 느리다.
  2. 제공되는 포인트가 너무 균일한 느낌이 있다.
  3. 포인트가 너무 오래 살아있다.

해결책

scatter의 global seed에 $F를 적어서 제공되는 포인트의 균일한 느낌을 좀 흩어준다.

pop advect by volume의 advection type을 update force 에서 update velocity로 변경해준다.

pop source의 life expectancy를 0으로 줄이고, life variance를 1로 조정해서 구간을 설정한다.

 

파티클이 적당히 말려들어가는 것이 보인다.
pop source의 birth를 수정한 결과

이제 위에서 제작한 포인트를 선으로 바꿔준다. 그리고 색을 교체한다.

아주 약간의 tweak이 들어간 결과

이제 나머지는 작업자의 역량에 달린 부분이다.

pop wind를 추가하거나, scatter로 뿌리는 포인트의 수량을 늘리거나, 기타등등 여러 tweak이 가능할 것이다.


알고 쓰면, 생각보다 세팅이 어렵지 않다.

노드는 많아보이지만, 묶어놓고 보면 긴것도 아니다.


예전에 후디니를 공부하겠다고 설치면서 A를 B에 연결하라고 하면 기계적으로 A를 B에 연결했고, 그것이 왜 연결이 되는건지, 그런 부분에 대한 고민은 해본적이 없었던것 같다.

공부를 하면 할수록 이런 부분에 대한 지식이 쌓이게 되면서 그래서 그렇게 연결이 되었구나 하는 것을 알게 되는 기쁨이 매우 크다. 그리고 그렇게 알게 된 부분에 대해서는 이렇게도 연결이 되지 않을까? 하면서 고민해볼 수 있고 시도해볼 수 있는 지금이 매우 즐겁다.

 

후디니는 즐겁다 :)