https://www.twahoudini.com/course/volumes1
HOUDINI1_ VOLUMES
2️⃣ 볼륨의 기초이론과 응용 그리고 SIMULATION까지 경험해보세요.
www.twahoudini.com
Volume14에서는 Gas 관련 node들을 활용해 연기의 퀄리티를 향상시키는 법을 배워보도록 하겠다.
오늘의 목표이다. 연기가 안쪽으로 말려가면서 뽀개지는 느낌을 줄 것이다.
1. Dop Network 안에서 직접 추가적인 Field를 만들고 그 Field를 Velocity Field에 적용해줄 예정이다.
2. 보통 Detail을 올려주고자하면 Gas Turbulence 값을 올려줄 수도 있다. Turbulence의 값이 바뀜에 따라 연기의 움직임, 큰 모양 자체가 바뀌는 경우가 있다. 오늘의 강의에서는 Volume의 큰 모양을 해치지 않고 연기 사이사이의 Detail을 늘려줘볼 예정이다.
목차
1. Smoke 기본 셋팅
2. Gas 관련 Node들로 Noise 효과 주기
3. Gradient를 이용해 Smoke에 Noise 주기
1. Smoke 기본 셋팅
가장 먼저 연기가 위로 올라갈 수 있는 기본적인 모양부터 만들어보겠다.
여태 Volume 강의를 들어오면서 많이 만들어보았던 Smoke의 기본 셋팅이다.
Source로 density, temperature, vel을 생성해주었다.
Dop Network 안에서 Smoke Solver, Smoke Object, Volume Source, Gas Resize Fluid Dynamic을 생성해준다.
Control을 만들어 voxel size를 한번에 조절할 수 있도록 해주었다.
결과를 보면 연기가 잘 발생되는 것을 볼 수 있다.
그런데 연기가 위쪽이 아닌 대각선으로 날아가고 있는 것을 볼 수 있다. 이는 density로부터 만들어진 vel의 값이 {1,1,1}이기 때문에 발생하는 문제이다.
vel의 Volume Vop을 수정해 vel이 {0,1,0}의 값을 가지도록 해주었다.
결과를 보면 위쪽으로 연기가 올라가고 있는 것을 확인할 수 있다.
Dop Import Fields로 Dop Network 안에서의 내용을 Geometry 단계에서 Viewport로 볼 수 있도록 해주겠다.
각도가 다른 Light(Distant)를 두 개 생성해 서로 다른 색상을 주어 연기에 입체감을 더해주었다.
현재 발생하는 연기가 온도에 의해 너무 빠르게 상승하고 있다.
Volume Solver에서 Buoyancy Lift의 세기를 1로 낮춰주고, Temperature Diffusion과 Cooling Rate를 0으로 두어 연기가 온도의 영향을 덜 받도록 해주었다.
vel의 세기도 {0,0.1,0}으로 낮춰주어 연기가 상승하는 속도를 낮춰주었다.
Smoke가 위로 올라갈때 그 모양에 변형을 주려한다. 변형을 위해서 Noise를 추가해 이류조건을 변경해주려한다.
이를 위해서 Gas Turbulence를 사용해주겠다.
Smoke에 Noise가 입혀진 것을 볼 수 있다.
이제 핵심으로 들어가보려한다.
Smoke Solver의 Node Info를 확인해 Smoke에서 다루고 있는 Field가 무엇이 있는지 보았다. density, pressure, temperature, vel의 Field 정보가 존재하는 것을 볼 수 있다.
density는 vel의 존재에 의해 움직이게 된다. 그리고 temperature는 vel에 영향을 주고 있다.
만약 vel이 temperature의 영향을 덜 받아 조금만 상승하기를 원한다면, Buoyancy Lift의 값을 조절해주거나 Source 준비 단계에서 Volume Vop으로 temperature의 값을 낮춰주는 방법도 존재한다.
그렇다면 Gas Turbulence는 어떤 식으로 정보를 만들어서 vel에 정보를 더해주는가? 이를 알아보도록 하겠다.
Gas Turbulence를 Reference를 활용해서 필요한 Vector Volume을 만들게 되는데, 이때 만들어진 Noise 형태의 정보는 임시 Field에 저장되어 vel에 더해지게 된다. 이때 임시로 생성될 Fields의 이름이 Temporary Fields 탭에서 결정되게 된다.
그리고 vel에 더해지고 난 후 쓸모가 없어진 임시 Field의 정보가 사라져 주어야 다시 한 사이클을 돌 수 있다. 이는 Clear Temporary Fields를 체크함으로써 제거해줄 수 있다.
이와 같은 내용은 Volume08에서 자세하게 다루고 있으며, 오늘 강의에서도 몇번 더 언급하게 될만큼 중요하다.
2. Gas 관련 Node들로 Noise 효과 주기
이제 Gas Turbulence가 만들어지는 과정을 Gas 관련 node들로 직접 만들어볼 예정이다. 이렇게 직접 만들어줌으로써 얻는 이점은 이후에 설명할 것이다.
순서는 이러하다.
1. 임시 Field를 만들어준다.
2. 임시 Field에 값을 담아준다.
3. 어떤 이류 규칙(Advection)을 따를지를 정해준다.
4. 계산을 발생시킨다.
5. 임시 Field를 지워준다.
1. 임시 Field를 만들어준다.
먼저 임시 Field를 만들어주어야한다. 이때 Field를 그냥 생성해낼 수 없기 때문에, 원래 가지고 있던 Field를 Reference 삼아 복제해주겠다. 복제된 Field가 임시 Field가 될 것이다.
우리가 Velocity Field(3D)에 값을 더해주기 위해서 임시 Field를 1D 정보로 만든다면 의미가 없을 것이다. 똑같은 형태의 3D 임시 Field가 필요된다.
그러면 임시 Field는 1D 정보인 density나 temperature보다는 3D 정보인 vel의 정보를 Reference 삼아서 복제되어야할 것이다. 임시 Field의 이름을 tempvel이라 하겠다.
이러한 과정을 Gas Match Field node로 수행해주겠다.
2. 임시 Field에 값을 담아준다.
방금 만든 tempvel의 Field는 그릇이 vel과 같을뿐 안에 들어있는 정보가 없다. 기본으로 {0,0,0}의 값을 가진 상태가 될 것이다.
이제 빈 그릇에 내용을 담아주어야 한다. 만약 새롭게 만들어진 값이 {1,0,0}이라면 각각의 값을 voxel 그릇에 넣어주어야할 것이다. 이와 동일한 과정이 앞서 해왔었던 Attribute Vop, Volume Vop에서의 과정과 동일하다.
이때 Turbulence와 같은 효과를 내주기위해 {1,0,0}의 값이 아닌 Noise를 넣어줄 것이다.
이러한 과정을 위해 Gas Field VOP node를 이용해주겠다.
3. 어떤 이류 규칙(Advection)을 따를지를 정해준다.
3번과 4번은 세트로 한번에 이루어질 것 같아 보이지만, node로서는 따로 되어있다.
먼저 3번에서는 어떤 이류 규칙을 따를지를 정해주게 된다. 이때 Advection의 엔진을 정해줄 수 있다. 어떤 엔진을 골라주느냐에 따라 속도와 퀄리티에 영향을 끼칠 것이다.
그런데 3번 내용에서 이미 Advect가 적용된 것이 아닌가하고 의문이 생기게 된다.
3번째 과정까지의 의미는 vel에 tempvel이 얼마만큼 Advect해주고 싶은지 준비해주는 과정을 tempvel에서 엔진(이류 규칙)을 정해줌에 따라 새로운 tempvel의 모양을 만들어주게 된다. 이를 Gas Advect Field node로 해주겠다.
4. 계산을 발생시킨다.
4번에서는 새롭게 만들어진 tempvel의 모양을 vel에 더해줄 것인지, 곱해줄 것인지, 아니면 그냥 vel에 대체할 것인지를 계산해주게 된다. 이렇게 계산의 과정이 없다면 tempvel에 의해서 vel의 모양이 바뀌지 않을 것이다. 이 내용을 Gas Calculate node로 계산해주겠다.
5. 임시 Field를 지워준다.
앞선 과정에 의해 이미 vel의 값이 바뀌어 density에 영향을 주었다. 이제 tempvel은 불필요한 Field로서 존재하게 된다.
Gas Linear Combination node로 임시 Field를 지워주겠다.
이제 node들을 순서대로 Smoke Solver의 Input 3에 연결해 작업해주도록하겠다.
Gas Match Field의 Field에 tempvel을 적어 임시 Field를 생성하고, Reference Field로 vel을 이용해주겠다.
Reference Field로 Reference를 지정해주게 되면 자동으로 Reference SOP는 닫히게 된다.
Rank는 Vector로 하여도 좋지만, Same as Reference로 두도록하겠다.
Match Samples를 체크해 tempvel의 해상도값을 vel과 맞춰주도록하자.
Gas Field Vop에서는 앞에서 만든 tempvel(vector)의 값을 지정해주도록 하겠다.
Gas Field Vop 안에서 Constant로 tempvel에 {1,0,0}의 값을 정의해주었다.
그리고 Multiply를 달아 Constant로 tempvel의 세기를 조절할 수 있게 해주었다.
이제 Gas Advect Field로 Advection을 정해주려 한다. Gas Advect Field의 Field에 tempvel을 입력해준다.
Gas Advect Field를 다루기 전 Smoke Solver를 다시 한번 볼 필요가 있다. 왜냐하면 Smoke Solver에서 density를 vel로 Advect 해주게 되는데, 이때 Advect를 하기 위한 엔진을 선택하는 구간이 Smoke Solver에도 존재한다.
Smoke Solver의 Advanced에 Advection에서 엔진을 골라줄 수 있다.
Advection Type을 정해줌에 따라 엔진을 골라줄 수 있는데, 그 종류는 Single Stage, Modified MacCormack, BFECC가 있다. 왼쪽에서 오른쪽으로 갈수록 퀄리티가 좋아지고 무거워진다.
이와 같은 엔진 세팅을 Gas Advect Field에서 해주도록 하겠다.
Gas Advect Field의 Advection Scheme을 보면 Single Stage 대신 Semi-Lagrangian이 있는 것을 볼 수 있다. 둘은 같은 것이다.
높은 퀄리티의 연기를 뽑기 위해서 BFECC를 선택해주도록하겠다. Clamp Values는 Clamp로 지정해준다.
Gas Advect Field에서 엔진을 골라주었다면, Smoke Solver에서도 같은 엔진으로 선택해주도록 한다. 둘의 엔진을 똑같이 설정해주어야 결과가 튀는 것을 방지할 수 있다.
앞에서 만들어준 tempvel을 vel에 더해주기 위해서 Gas Calculate을 이용하겠다.
Source Field에 tempvel을 Dest Field에 vel을 적어준다.
그리고 Caculation에서 어떤 식으로 계산해줄 것인지를 정해줄 수 있다. tempvel을 vel에 더해줄 것이기에 Add를 골라준다.
이제 역할을 다한 tempvel을 지워줄 차례이다.
Gas Linear Combination의 파라미터를 관찰해보면, Field를 지워준다기 보다는 Field를 겹쳐주거나 더해준다는 느낌이 강하다.
사용방법은 이러하다.
Destination에 지워줄 Field인 tempvel을 입력해준 뒤, Combine Operation을 Copy로 변경해주겠다. 이때 Source에 어떠한 내용도 적지 않는다면, tempvel이 아무 정보도 없는 상태로 대체되게 될 것이다. 이렇게 tempvel이 사라지게 만들 수 있다.
결과를 보면 Gas Field Vop에서 만든 정보가 Smoke에 잘 적용된 것을 볼 수 있다.
Gas Field Vop에서 tempvel의 세기를 조절하고자 만든 Constant를 변경해 변화를 줘보았다.
이제 다른 내용을 Gas Field Vop에서 만들어보겠다. 이제 vector 값의 방향을 주는 것이 아닌 Noise를 줘보려한다.
Anti-
Aliased Flow Noise를 생성해 P에 연결하고 Noise Pattern은 3D가 될 수 있도록 해준 뒤 tempvel에 넣어주겠다.
결과를 보면 tempvel에 넣어준 Noise 값에 의해 사방으로 퍼지는 Advection이 발생하는 것을 볼 수 있다.
만약 세기를 줄이고 싶다면 Multiply를 달아 Constant로 Noise의 세기를 조절해줄 수 있다.
Noise의 컬의 크기가 너무 큰게 아쉽다면 3D Frequency 값을 늘려 컬의 크기를 줄여주도록 하자. Frequency 값을 높게 올려주어도 계산 속도에는 큰 영향을 끼치지 않으니 안심하고 올려주도록 하자.
Frequency를 20까지 올려주었다. Noise의 패턴이 작아지다보니 큰 결과로서는 뭉쳐있는 느낌이 든다. 패턴이 훨씬 작아지면서 패턴이 없는 것처럼 묘사된 느낌도 있다.
3. Gradient를 이용해 Smoke에 Noise 주기
지금 우리는 어떠한 Noise Pattern을 이용하고 있기 때문에 만약 Constant 값을 높여줌으로써 Noise 효과를 많이 주게 된다면, Noise가 가진 Pattern의 모양을 Smoke가 쫓아가게될 것이다.
Constant 값을 높여 결과를 보면, Smoke가 Anti-Aliased Flow Noise의 패턴에 맞춰서 흘러가고 있는 것을 볼 수 있다.
여기서 아쉬운 점은 연기의 정보를 해석하여 만든 Noise가 아닌, 단순히 공간상에 흐르고 있는 Noise를 연기가 따라가는 것이다.
이제 이렇게 공간상의 Noise를 따라가는 것이 아니라, 지난 Frame에 얻은 모양을 기준으로 새로운 방향을 구해주려한다.
이전 Frame의 정보를 기반으로 어떠한 작업들을 수행줄 것이기에 훨씬 더 정교한 결과를 얻을 수 있을 것이다.
앞에서 말한 작업을 해주기 위해서 Gradient 정보를 이용해주도록 하겠다.
Gradient는 밀도가 낮은 쪽에서 큰 쪽으로 가는 방향을 뜻한다. Smoke의 경우 밀도가 바깥쪽보다 안쪽이 높을 것이다. 그렇기에 Gradient는 Smoke의 표면 바깥쪽에서부터 안쪽을 가리키게 될 것이다.
이렇게 구해준 Gradient 값은 실제로 뒤죽박죽일 것이기에, Normalize를 하여 사용가능한 상태로 만들어주도록 하겠다.
Normalize된 값에 마이너스 값을 곱해준다면, Smoke의 Normal 방향도 구해줄 수 있을 것이다.
이에 gradient(3D) 정보는 density(1D) 정보를 분석하여 구해줄 것이다.
이렇게 Normalize된 Gradient에 Noise를 준다면, 이전 Smoke의 모양을 기준으로 Noise가 들어간 tempvel을 얻을 수 있게될 것이다.
이러한 과정을 Gas Analysis에서 해주겠다. Gas Field Vop에서 내용을 만들기 전 gradient를 생성해주어야 하기 때문에 Gas Field Vop 앞에 Gas Analysis를 위치시키겠다.
Dest Field에 tempvel, Source Field에 density를 넣어준다. Analysis를 Gradient로 변경해준다.
Gas Analysis에서 density를 기준으로 graident를 분석해주었다.
앞에서 구한 gradient 정보가 이미 tempvel에 들어있기 때문에, Bind로 tempvel의 정보를 불러온다.
Normalize node로 크기를 1로 맞추어 방향으로서 의미를 가질 수 있게 해주겠다.
Normalize 된 값은 힘이 굉장히 쎈 편이다. Multiply를 달아 Constant로 값을 줄여주도록 하겠다.
결과를 보면 gradient에 의해 연기가 뽀개지는 효과가 나기 시작했다. gradient에 의해 연기 안쪽으로 누르는 힘이 발생하고 있는 듯한 효과를 볼 수 있다.
이때 Constant에 마이너스 값을 곱해준다면 바깥쪽을 향해서 뻗어나가는 힘이 생성된다. Gas Shred와 비슷한 효과가 나는 것을 볼 수 있다. 아쉽게도 이러한 스타일은 좀 지저분한 느낌이 나기 때문에 많이 사용하지는 않을 것으로 본다.
지금까지는 어떠한 다른 내용 없이 gradient만 tempvel로서 추가적인 정보로 이용해주었다.
이제 gradient에도 Noise를 주겠다. 이것도 어디에 어떻게 Noise를 주느냐가 관건이 되겠다.
일단 먼저 오늘의 의도와는 다르지만 비교를 위해 익숙한 방법으로 Noise를 줘보도록 하겠다.
Vop Global에서 P의 정보를 가져와 Anti-Aliased Flow Noise에 활용해주었다. 이렇게 만들어진 정보를 tempvel에 Add로 더해주겠다.
Anti-Aliased Flow Noise와 Add 뒤에 Multiply를 달아 세기를 조절해주도록 하겠다.
결과를 보면 Noise에 의해 옆으로 찌그러지는 느낌과, gradient에 의해 안으로 Compressing하는 느낌이 드는 것을 볼 수 있다.
지금까지의 내용은 Gas Turbulence로도 충분히 할 수 있는 내용이었다.
이제 gradient의 정보로 만들어진 Noise를 tempvel에 더해주는 작업을 해보겠다.
방법은 간단하다. 방금 Anti-Aliased Flow Noise에 연결되었던 Vop Global의 P가 Normalize node로 변경되면 된다.
Normalize로부터 얻어진 Noise가 Normalize gradient에 더해짐으로써 밖으로 더 나오거나, 안쪽으로 들어가게 되는 녀석이 생기게 될 것이다.
결과를 보면 전체적인 형체를 유지하면서 Noise가 들어간 것을 볼 수 있다.
Frequency가 높아 패턴의 사이즈가 작아질수록 원본과 가까워지는 모습을 볼 수 있다.
오늘 배운 세팅을 알고 Smoke를 다루느냐 아니냐가 Smoke에서의 퀄리티 차이에 큰 벽을 하나 세워줄 것이다.
'TWA Houdini1 > Volumes' 카테고리의 다른 글
TWA 후디니 1 Volume_16 : TWA Standard Smoke & 폭발 Render (0) | 2023.03.20 |
---|---|
TWA 후디니 1 Volume_15 : 폭발 Divergence (0) | 2023.03.17 |
TWA 후디니 1 Volume_13_02 : Brute 최종 랜더 (전기, 스파크 면 만들기, Pass 따로 뽑기) (0) | 2023.03.16 |
TWA 후디니 1 Volume_13_01 : 최소한 Volume Visualization과 똑같이 랜더하기 (1) | 2023.03.15 |
TWA 후디니 1 Volume_12 : 전기에 따른 스파크(Particles) (0) | 2023.03.11 |