Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

테드옹의 VFX

Whitewater 탐구 본문

Houdini

Whitewater 탐구

Tedd_Kim 2025. 2. 15. 14:07

Whitewater를 Emission할 때, 생각해야할 어트리뷰트들

 

[ 01. Depth : SDF와의 거리 ]

- 특정 값 이하면 Bubble, 이상이면 Spray, 그 사이면 Foam으로 인식된다

- 0 ~ 1의 소수점으로 이루어진 가중치가 있기 때문에 모션을 블렌딩할 때 도움이 된다.

- 수중환경이 아닌 이상에야 음수값인 Bubble은 사용할 필요가 없음

 

[ 02. Speed : 속력 ]

- 빠르게 흐르는 물은 공기와 섞여서 난류를 만들고 이로 인해 거품을 발생시킬 가능성이 높다

- 하지만 속력이 높다는 이유만으로는 거품이 발생하지 않는다 (ex. 높은 속력을 가지고 있어도 잔잔한 경우)

- 위의 이유로 인해 Emission의 Mask로써 활용하는게 물리적으로 합당해보인다

 

[ 03. Vorticity : 회전력 ]

- 난류 혹은 소용돌이의 정도를 나타내며 마찬가지로 공기와 섞여서 거품을 발생시킬 가능성이 높다

- Velocity와는 다르게 Mask로 활용해도 되고 바로 Emission으로 활용해도 될 것 같다

 

[ 04. Curvature : 곡률 ]

- 물이 충돌하면서, 혹은 급격하게 방향을 전환할 때 보통 곡률이 높아지면서 거품을 발생시킬 가능성이 높다

- 파도의 붕괴 등등에서 특히 유용할 것 같다

- Volume Wrangle에선 Surface Gradient와 Velocity Direction을 dot프로덕트 하여 계산한다. (굳이 샘플링을 하지 않음)

 

[ 05. Stretch, Squish, Scale : 변형 ]

- Whitewater는 단순히 속도만 빠르다고 생성되는 것이 아니라 유체가 강하게 변형하는 부분에서 발생하기 때문에 20버전 이후의 후디니에서 나온 방법

- 유체 속도의 변화(Velocity Gradient)를 계산하여 변형량을 기반으로 Emission을 한다

 

- Velocity Gradient(L) : 속도 변화율 

- Strain Rate Tensor (D) : Velocity Gradient의 대칭성분을 분리해서 유체가 늘어나거나 찌그러지는 정도를 계산할 수 있음

- Surface Projection (P) : 물 표면과 평행한 변형만 고려하여 표면을 따라 어떻게 퍼지는지의 정도를 계산할 수 있음

이 단계에서,

matrix3 P = ident() - outerproduct(normal, normal)

이라는 방식을 사용하여 Normal방향을 제거하는(표면과 평행한 성분만 남기고 수직성분을 제거) Projection행렬 P를 만듦. 이것을 특정 벡터에 곱하면 Normal방향이 없어진 벡터가 나온다 (투영에 관한 토픽, 그냥 받아들이자)

- Eigenvalue : Stretch(늘어나는 정도), Squish(찌그러지는 정도), Scale(전체 크기 변화)의 고윳값을 계산

 

- Stretch : 물 표면이 찢어질 때 발생, 표면 장력이 깨지면서 공기가 주입될 때 (ex. 폭포에서 떨어지는 물)

- Squish : 물이 외부의 힘을 강하게 받아서 순간적으로 압축될 때 공기방울이 유체에 강제로 끌려감 (ex. Wave Crash)

- Scale : 부피의 변화, 난류가 강할 때 발생. 압력차이가 불생하고 물 안으로 공기가 주입됨 (ex. 급류, 소용돌이). 유체는 비압축성이기 때문에 부피가 유지되어야하지만 Scale은 국소적인 부피 변화율과 관련이 있음.

 

[ Deformation.Scale에 대하여 더 자세히 ]

Scale은 값이 양수일 때 유체의 해당 영역이 팽창중이고, 음수일 때 해당 영역이 수축중이란 의미이다.

- 유체가 확장이되면 압력이 낮아지고 그로 인해 공기가 들어가며 거품이 형성된다

- 반대로 수축되면 공기가 강제적으로 밀려나면서 거품이 형성된다.

그래서 Remap된 값은 양 끝에서 집중적으로 Emission을 시키는듯한 Ramp를 가지고 있다.

 

이거는 완전히 이해하려면 유체역학을 알아야할 것 같은데... 😑

 

후디니의 Whitewater Source노드에는 볼륨랭글로 작성됐지만, 나는 Mesh에서 작업을 하기 때문에 포인트랭글로 바꿨다.

볼륨에서는 volumesmoothsamplev()함수를 사용하여 속도의 변화율(Velocity Gradient)을 계산한다. 그냥 변형이 일어날 때 거품이 생기는구나 정도만 알아도 될 것 같다. 

 

[ Outer Product에 관하여 더 자세히 ]

보통 후디니에서 많이 쓰는 내적으로는 Dot Product가 있고 외적으로는 Cross Product가 있다. 하지만 Outer Product 또한 외적이다.

 

Cross Product는 정확하게는 벡터곱이라 불리며 벡터를 아웃풋으로 주지만 Outer Product는 텐서곱으로 행렬을 아웃풋으로 준다. 두 벡터가 이루는 평면 또는 공간에 대한 정보를 담고 있으며, 이 행렬의 고유값과 고유 벡터는 두 벡터가 이루는 평면 방향과 크기를 나타낸다.

 

동일한 벡터를 외적하면 항상 값이 0이지만, 이것을 활용해서 특정 방향의 성분을 제거하는 효과를 얻을 수 있다. (솔직히 계속 찾아봐도 정확히 무슨 말인지 모르겠고, 이걸 작업에 실질적으로 활용할 수 있을지도 모르겠음)

 

 

[ Emission Rule of Thumb ]

- Curvature와 Vorticity에서 Emission을 잡고 Speed와 Depth를 마스크로 활용

- Deformation에서 Emission을 함으로써 불필요한 영역에서 과하게 생성되는 파티클을 제한할 수 있다.

- 보통 High Resolution의 경우 20,000,000 - 40,000,000개의 파티클이 나온다. 최종 목표를 저 정도로 두고 하자 (물론 어지간한 컴퓨터에서는 저정도 했을 때 컴퓨터가 뻗어버리기 때문에, 소스를 나눠서 여러가지 시뮬레이션을 하고 합치는게 좋다)

 

[ Emit Volume vs. Custom Particles ]

후디니에서 제공하는 Whitewater Source노드의 문제점

1. 굉장히 느림

2. Emit볼륨을 만들어주긴 하지만 Source내부에서 그냥 Scatter를 해버리기 때문에, 다소 Generic한 모양이 나올 수 있음. (물론 Velocity Noise이용해서 모양을 바꿀 수 있지만)

3. 정확히 얼마나 많은 포인트를 시뮬레이션에 넣을 것인지 예측하기 힘듦

4. Whitewater Scale이 달라지면 Emission Amount를 계속 바꿔줘야함

 

그래서 보통 심화적으로 파고들어가는 튜토리얼에서는 보통 Custom한 방식으로 Emission을 만드는데 여기서도 또 Flip Mesh를 이용할 것이냐, Simulation Points를 이용할 것이냐도 갈린다. 둘 다 경험해본 결과, 개인적으론 Mesh를 사용하는 것이 더 나아보인다

 

그래도 Whitewater Source SOP의 장점이 있다면 자타공인 SideFX의 훌륭한 엔지니어들이 만들어준 솔루션이고, 지속적으로 업데이트가 되고 있다. (그럼에도 그 솔루션의 핵심만 빼다가 Custom하게 만드는 것이 퍼포먼스적으로 낫다고 생각한다)

 

또한 변화율을 계산한다는 대목에서 Volume Gradient의 기능이 너무 강력하기 때문에 결과 자체는 Volume이 더 정확할 수도 있을 것 같다. (물론 Point Wrangle로 변환한 코드가 잘 작동한다면 무시할만한 수준일 것 같긴 함)

 

 

[ Flip Mesh vs. Points ]

- Mesh 방법의 장단점

Normal을 이용한 Curvuature계산, Deformation계산 등이 유효하다. 그리고 렌더링 과정에서 화이트워터를 만들기 위해 만들었던 어트리뷰트들을 활용하여 Mesh렌더링의 퀄리티를 올릴 수 있다. 하지만 꽤나 오랜 시간이 걸리는 Meshing과정을 끝마쳐야 Whitewater 시뮬레이션을 할 수 있기 때문에 추가적인 단계를 거쳐야한다.

 

- Points 방법의 장단점

Meshing과정을 거치지 않아도 돼서 빠른 작업에 유리하다. 하지만 물론 SDF를 샘플링하여 Curvature, Deformation계산을 할 수 있지만 Mesh에 비하여 번거롭고 또한 시뮬레이션이 무거워질수록 포인트의 개수가 많이 증가하기 때문에 데이터가 무거워졌을 때 퍼포먼스의 단점이 있다.

 

뭐 어짜피 Meshing은 꼭 거쳐야하는 단계니까 Mesh를 이용하여 표면에서 Points를 생성하고, POP Replicate등을 통해 주변에서도 포인트를 생성한 후 Depth에 의해서 Culling해주는 것이 좋아보인다

 

공통적인 장점이 있다면 Velocity와 Surface SDF볼륨을 주렁주렁 달고다니지 않아도 된다는 것

 

[ Particle Solver vs. Whitewater Solver ]

확실히 짚고 넘어가자면, 결국 Whitewater Solver는 이런저런 기능이 많이 더해진 Particle Solver이다. 수면 위의 움직임이 중요하다면 Repellants, Clumping 의 역할이 커지기 때문에 Whitewater Solver를 사용하는게 좋아보이지만, 가벼운 작업을 할 때는 Particle Sovler로 간단하게 커스텀을 하는 것도 하나의 옵션일 것 같다.

 

대규모 Splash 씬이라면 무조건 Custom Solver가 유리하다. 어짜피 Foam 패턴이랑은 관계 없기 때문에 굳이 무거운 솔버를 사용할 필요가 없음

 

다만 Surface의 Foam패턴이 주가 되는 씬이라면 앵간하면 기능이 점점 더 좋아지는 Whitewater Solver 쓰자. 정적으로 잔잔하게 일렁거리는 상황에서 Foam 패턴을 만드려면 Custom Solver로는 한계가 있을 것 같다.

 

[ Whitewater Post Process SOP ]

1. Particles

- 기본적인 Output이다. ParticleDensity에 따라서 Pscale에 변형을 주면 일정한 모양을 깨는데 도움을 줄 수 있다. (커스텀으로 만들거나 relativedensity를 사용하거나)

2. Fog Volume

- 합성시 레이어 추가할 때 좋을듯함

3. Mesh

- 굳이 화이트워터를 왜 Mesh로 바꿔야하는지 모르겠지만 옵션이 있음..

 

 

[ FLIP Mesh 와 자연스럽게 렌더링 하는 법 ]

간혹 Splash작업을하면 너무 큰 Mesh덩어리가 나와서 Whitewater와 제대로 블렌딩되지 않는 경우들이 있는데 이것을 해결하지 않으면 Scene의 스케일감이 살지 않는다. 일단 문제가 될만한 부분은 FLIP 시뮬레이션 단계에서 지워버리는 것이 좋다. Post Sim으로 할만한 단계는

 

VDB Converting 과정에서

- VDB Connectivity를 사용해서 Main Body외에 Droplet같은 것들을 지워주기

- 공중에 떠있는 파티클들 pscale 낮추기

- 밑으로 빠르게 떨어지는 파티클들 pscale 낮추기 (이미 Whitewater로 변해있어야함)

- Density가 강한 부분 pscale 낮추기 (너무 덩어리진 Mesh되는 것 방지)

- FLIP Particle의 일부를 Whitewater로 렌더링하기

 

공중에 떠 있는 Mesh덩어리들은 지우던지 Opacity를 주던지해서 Shader에서 Foam으로 렌더링하던지 어쨌거나 티가 나지 않도록 해야한다. 공중에 떠있는 유리같은 덩어리가 보이는 순간 망한 샷이다.

 

[ ETC. ]

1. Adhesion과 Clumping (POP Fluid DOP)은 Surface tension의 느낌을 살릴 때 적극 활용

2. 연산이 무거우니 뭐 주렁주렁 많이 달지 말자, 차라리 Mist 파티클 시뮬레이션을 따로 해서 레이어를 추가하는 게 나을 것 같다

 

 

 

렌더링에 관한 내용 추가 예정

 

커스텀 Solver로 만든 파티클, 4개의 Cluster를 써서 대략 20-30분이 채 안되게 걸린 시뮬레이션이다. Air Field를 적용해서 일자 모션을 조금만 흐트러놓으면 참 괜찮은 모션일 것 같다

 

Whitewater Solver로 만든 파티클, 밑에 쓸모 없는 파티클을 좀 지웠으면 확실히 더 적게 걸리긴 할텐데.. 아무튼 더 적은 포인트지만 1시간이 조금 넘게 걸린 시뮬레이션이다. 아마 이것도 Cluster단위로 나눴으면 더 빠르긴 했을텐데 그걸 차치하더라도 Custom Solver연산이 더 빠르다. 그리고 위에 보단 카메라를 멀리서 잡아서 때깔은 좀 더 좋은 것 같음