Houdini1_Volume_14
오늘의 목표는 dopnet안에서 추가적인 field를 만들고 vel field에 적용시키고
볼륨의 큰 모양을 헤치지 않고 디테일을 올려주는것입니다.
sphere로 소스를 만들고 기본적인 dopnet세팅부터 했습니다.
소스는 density, temperature, velocity 정보를 가지게 했습니다.
각정보는 volume VOP으로 컨트롤가능하도록 했습니다.
다음은 dopnet 안에서 세팅을 잡아주었습니다.
그리고 null로 control을 만들어서 voxel 과 div size를 조절할 수 있게 했습니다.
vel의 volume VOP을 컨트롤 해서 0,1,0의 값을 주면 위쪽으로만 상승하게 만들 수 있습니다.
이 결과를 dopnet 밖에서 보기위해 dop import fields노드를 활용했습니다.
VV를 달아주고 Light를 설치해줬습니다.
gas turbulence를 달아주면 아래와같은 결과를 확인할 수 있습니다.
이 때 gas turbulence가 어떻게 vector정보를 변경시켜주는지 확인해봤습니다.
아래와 같이 임시 field를 만들고 vel에 값을 업데이트 후 field를 삭제해줍니다.
후디니가 업데이트되면서 turbulence의 Temporary Fields가 사라진듯 합니다.
만약 Turbulence를 쓰기 위해서 field를 만들고 만들어진 field를 삭제해주지 않는다면 solver가 계산하는데 들어오는 정보와 나가는정보가 일치하지 않는 결과가 나옵니다.
아래는 TWA님의 Turbulence계산을 설명해주신 자료입니다.
오늘은 Turbulence를 활용하지않고 임시 필드를 만들어서 정보를주고 필드를 삭제시켜주는 과정을 해볼것입니다.
총 다섯가지과정과 다섯개 또는 그 이상의 노드가 필요합니다.
이 노드들은 gas turbulence안에 들어가면 사용되는것들인것을 알 수 있습니다.
1. 임시 필드를 만들때는 레퍼런스로 사용할 필드를 지정해줘야 합니다.
vector field를 만들것이기때문에 vel field를 레퍼런스로 활용하는것이 좋을것입니다.
density나 temperature는 float정보이기 때문에 적합하지 않습니다.
2. 임시 필드에 값을 담아줘야하는 이유는 필드만 만들어준것이기 때문에 그 필드는 기본적으로 0,0,0정보를 가지고 있을것입니다. 이 때 필드를 채워줄 값을 담아주는 것입니다.
3.advection이 어디에 얼마나 적용될지 정해주는 과정입니다. tempvel이 vel field에 어떤 방식으로 적용을 해줄지 그 계산법을 정해주는 과정입니다.
이 부분에서 3, 4번이 말로만보면 헷갈리는데 뒷부분에서 노드와 논문? 연구 결과?를 보면서 상세하게 설명해주셔서 이해가 확실하게 됐습니다.
4. vel에 어떻게 계산해줄지, 더해줄지 빼줄지 곱해줄지 등 그 계산을 발생시켜주는 과정입니다.
5. solver의 앞뒤 모양을 맞추기 위해서 생성해줬던 임시필드, temp field를 삭제 시켜줍니다.
vel update란에 노드를 계산 순서대로 merge해서 넣어줬습니다.
field에는 만들어줄 임시필드의 이름을,
Reference Field에는 레퍼런스로 사용할 Field이름을
Rank에서는 정보의 형식을 정해주는데 vector도 있지만 Same as Reference를 선택했습니다.
그리고 Match Samples를 체크해주었습니다.
다음으로는 gas field VOP을 설정했습니다.
다른 VOP들과 동일합니다.
처음부터 노이즈를 적용하기보다 간단한 수치를 입력했습니다.
다음은 gas advectfield 입니다.
이 부분은 advect하기위한 엔진을 골라주는 과정입니다.
smoke solver에서도 advection을 확인할 수 있는데 advection type과 Vel Advection Type에서 엔진을 선택할 수 있습니다.
총 세가지 선택지가 있는데
Single Stage 가장 가볍고
BFECC 가장 무겁고
Modified MacCormack 중간입니다.
결과도 무거울수록 좋은 결과가 나옵니다.
Gas Advect Field도 선택해줄 수 있습니다.
Semi-Lagrangian만 다른데 가장 가벼운 친구입니다.
왜 BFECC를 쓰는지 보여주시기 위해서 BFECC관련 학술자료를 보여주셨습니다.
https://faculty.cc.gatech.edu/~jarek/papers/FlowFixer.pdf
기존advection 방식인 semi-Lagrangian이나 first order upwinding방식에서 시공간적으로 추가적 계산을 해준다고 합니다.
또한 advection이 진행되면서 손실되는 정보의 양을 줄여준다고 합니다.
아래 사진을 살펴보면 위쪽은 기존, 아래쪽은 BFECC계산이 추가된 결과입니다. 충돌과 이류에 대해서 좀 더 계산을 더해주고 디테일을 더 살려줍니다.
이 부분에서도 BFECC를 기존 계산방식에 더해줌으로 다양한 효과(vel, smoke, image advection 등)와 상황에 있어 탁월하게 결과가 향상된다고 합니다.
강의에서 이런부분이 나올때 너무 재밌는거 같습니다.
우리가 BFECC를 써야할 이유를 완벽하게 설명해주신거 같습니다.
다시 파라미터를 보면
마찬가지로 Field에 적용할 tempvel을 적어주고
적용시킬 vel을 Velocity Field에 적어줍니다.
advection을 얼마나 할지 정하는 과정입니다. 계산을 해주는 과정이 아닙니다!
Clamp Values는 Clamp로 설정해줍니다.
계산은 Gas Calculate에서 해주는데,
Dest Field에 어디에 더해줄지, vel을 적어주고
Source Field에 소스로 들어올 필드, tempvel을 적어줍니다.
이 때 Calculation에서 계산방식을 정해줍니다.
이제 마지막으로 임시필드를 지워주면 됩니다.
Gas Linear Combination은 사실 지워준다기보다 대체해주는 느낌입니다.
Destination에 적용될 정보를 적어주고
Combine Operation을 Copy로 해준다면 대체될것입니다.
이 때 대체할 내용을 아무것도 적지 않는다면 그 정보가 사라지게 됩니다.
모든 과정이 끝났고 결과를 보면 아까 만들었던 gas field VOP에 의해서 1,0,0방향으로 움직이는것을 확인할 수 있습니다.
다음은 일정수치가 아닌 aaflownoise를 적용해봤습니다.
노이즈 패턴에 맞게 advection되는것을 확인할 수 있습니다.
이 때 mult를 활용해서 그 힘을 다룰 수 있습니다.
노이즈의 Frequency를 올려주고 mult값을 내려준다면 원본의 형태를 약간 유지하면서 촘촘한 결과를 볼 수 있습니다.
frequency를 20까지 올리면 패턴이 곱게 나타나는것을 볼 수 있습니다.
이제 다음 목표인 원본모양을 유지하면서 디테일을 살리는 과정입니다.
TWA님이 그림을 그려서 설명해주셨습니다.
지금까지 해왔던 방식은 12frame의 원본에 tempvel noise가 추가되면서 원본이 글로벌하게 효과가 적용되고 있습니다.
이제 해볼 방식은 볼륨의 형태를 분석해서 맨아래의 느낌을 만들어 볼것입니다.
gradient정보를 활용하면 됩니다.
gradient는 density가 커지는 방향정보를 가지고있는데 이 정보를 normalize해주고 noise를 적용해준다면 핑크색 화살표처럼 noise패턴을 가진 방향성을 가지게 됩니다.
이 때 gradient정보는 density를 통해서 얻기 때문에 gas analysis로 vector 정보 gradient로 바꿔줍니다.
노드 연결순서는 노이즈가 적용되기 전인 gasfielvop 앞에 넣어주면 됩니다.
파라미터를 살펴보면
Dest Field는 정보가 들어갈 tempvel
Source Field에는 활용할 정보인 density
Analysis는 사용할 정보인 Gradient를 선택해주면 됩니다.
다음으로 gas field VOP에서 Gradient 정보를 가져와서 다룰 수 있습니다.
gradient 정보인 density가 커지는 방향, 안쪽으로 말려들어가는것을 확인할 수 있습니다.
곱해주는 값을 음수로 바꿔준다면 커지는 반대방향으로 방향성을 가지는것을 볼 수 있습니다.
왼쪽은 양수 오른쪽은 음수입니다.
밖으로 방향성을 가지는방법은 추천하는 방법은 아니라고 하십니다. 확실히 조금 부자연스러운듯 합니다.
힘의 크기를 강하게해주면 아래와같은 결과를 볼 수 있습니다.
이제 gradient정보에 noise를 적용해보겠습니다.
기존에 해오던 방식처럼 noise를 만들어서 더해줬습니다.
아래처럼 결과가 노이즈따로, 안쪽으로 들어가는 힘 두가지 둘 다 적용되는것을 볼 수 있습니다.
오늘 우리가 원하는 목표와는 조금 동떨어진 결과입니다.
noise의 곱해지는값을 낮춰주고 freq을 올려주면 아까 만든 결과와 비슷한 결과가 나옵니다.
우리가 원하는 결과를 얻기 위해서는 normalize된 gradient의 정보를 활용해서 noise를 만들어주고 더해줘야 합니다.
별거 없지만 결과의 차이와 이해를 하고 못하고의 차이는 큽니다.
이 부분도 TWa님이 그림을 그려서 설명해주셨습니다.
왼쪽이 기존 normalize된 vector정보이고, 오른쪽 아래가 noise의 방향성 입니다.
기존 방식에서 noise의 방향성이 더해져서 큰 화살표의 방향으로 최종 방향성을 가지게 될것입니다.
아래는 TWA님의 mult수치에 따른 결과차이 입니다.
gradient로 만든 noise가 곱해지는 정도차이 입니다.
그 값이 올라가도 크게 원본의 형태를 잃지 않는것을 확인할 수 있습니다.
각 프레임별로 비교해봤습니다.
점점 값이 쌓이기 때문에 시간이 지날수록 형태가 더 크게 다른것을 볼 수 있습니다.
오늘은 진짜 너무 재밌고 유익했던 수업이었던거 같습니다. 학술자료나 우리가 왜 이걸 써야하는지 매우 상세하게 설명해주실때마다 왜 TWA님의 강의를 좋아했었는지 다시 한번 느껴집니다.
볼륨은 정말 배우면 배울수록 매력있고 시각적으로도 매우 이쁜거 같습니다. 오늘은 계속 sphere에서 올라오는 볼륨을 봤는데, 살짝 아이스크림느낌도 나고... 정말 귀엽기도 하고 멋진 친구같습니다. 다만 캐쉬굽는 속도가 아쉬워서 빨리 후디니에서 gpu기반으로 계산을 하는 vdb가 적용되면 좋겠다는 생각입니다.
오늘도 좋은 강의와 아이디어 제공해주시는 TWA에 감사드리며 다음 주 공부일기로 찾아 뵙겠습니다:D
https://www.twahoudini.com/home-old
TWA houdini
TWA 후디니의 정석 홈페이지에 오신 모든 랭글러 여러분 환영합니다.
www.twahoudini.com