TWA Houdini1/Volumes

TWA 후디니 1 Volume_05 : 볼륨의 확산? 이류? Volume advect

yiss09 2023. 2. 23. 07:42

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

 

HOUDINI1_ VOLUMES

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

www.twahoudini.com

 

Volume05에서는 Volume Advect를 활용해 Curvature와 Gradient 정보를 이용해볼 예정이다.

 

1. 이류(Advect), 확산

2. VDB Advect

3. Polygons에서의 Gradient, Curvature

4. Volume에서의 Gradient, Curvature

 


1. 이류(Advect), 확산

 

Advect(이류)는 유체가 이동하는 원인으로 확산의 개념에 이류가 포함되어 있다.  

이류 = 방향 + 이동

확산 = (방향 + 이동) + 값의 평형

 

확산의 이류와는 달리 굳이 방향에 대한 정보가 없는 경우에도, 값의 평행을 맞추기 위한 방향들이 생성된다.

 


2. VDB Advect

 

이제 후디니 안에서 Advect에 대한 정보를 이용하기 위해 VDB Advect를 다뤄볼 예정이다.

VDB Advect의 첫 번째 Input에는 원본 Volume이 들어가게 된다. 두 번째 Input에는 방향에 대한 Volume(Vector Field)이 들어가게 된다.

VDB Advect를 활용한다면 원본 Volume을 Vector Field에 의해 이동시킬 수 있다.

확산에 의한 방향을 구하기 원한다면, Gradient에 (-1)을 곱해주어 사용하면 된다.

 

Rubbertoy를 Fog Volume으로 만들어주었다.

Volume Visualization을 활용하여 안쪽의 값이 1로 붉은색, 표면(SDF가 0인 부분)의 값이 0으로 파랑색, 외부의 값은 존재하지 않는 것을 확인하였다.

 

Vector Field가 될 Initial Value 값이 {1,1,1}인 Volume을 생성해주었다. 

Scatter로 points를 생성해 Volume Trail로 움직임의 방향을 보았다.

이후 Carve node를 달아 선의 길이를 조절해 trail이 향하는 방향을 볼 수 있게 만들었다. 이때 First U 값에는 Second U 값을 Copy Parameter 해준 뒤 0.1을 빼주었다. trail이 일정한 길이로 방향에 따라 움직이도록 만들어주었다.

 

이제 VDB Advect를 사용하기 위해 생성해둔 Fog Volume과 VectorField를 VDB로 전환해주었다.

이때 VectorField가 될 VDB의 정보가 float으로 나뉘어져있다.

이러한 경우 VDB 정보를 이용하는 Node들에서 정보가 작동하지 않기 때문에, VDB vector from scalar(VDB vector to Merge)를 이용하여 float 정보를 vector 정보로 합쳐준다.

 

VDB Advect로 만들어진 결과는 Input 1으로 들어오고 있는 VDB의 결과에서 오른쪽 대각선 위로 이동한 것을 알 수 있다.

Input 2의 위치정보로 들어온 VectorField의 Initial Value 값이 {1,1,1}이기 때문이다.

1. Velocity 즉, Vector Field의 정보를 기입하는 란이다. 이때 미리 VDB vector to Merge로 vf 값을 하나의 vector로 전환시켜두지 않는다면 vf 정보를 가져오지 못하는 경우가 생긴다.

2. Timestep은 Input 2로 들어온 위치정보를 Multiply 해주는 기능을 한다. Delete Channel을 해줌으로써 직접 그 값을 변경해줄 수 있다.

 

Volume Vop을 이용해 VDB Advect의 움직임을 재현해보았다.

Volume Sample File node로 Input 1과 Input 2의 내용을 불러와주었다.

여기서 Multiply Constant는 VDB Advect에서의 Timestep과 같은 역할을 한다.

Vop Global에서 @P의 정보를 끌어와 원본 Volume에서의 각각의 voxel 정보로서 활용해주었다.

Volume에서의 정보이동은 반대로 이루어지기 때문에, Input 2의 Vector Field를 빼줌으로써 원하는 방향으로 움직이게 만들어주었다.

Subtract 된 값들을 Input 1의 원본 Volume의 위치정보로 넣어준 뒤, Bind Export를 통해 toy의 정보(Input1)로 빼내어 주었다.

VDB Advect와 똑같이 vf의 방향으로 움직이는 결과를 볼 수 있다.

 

VDB Advect, Vector Field의 움직임을 더 편리하게 이해하기 위해 새로운 방법으로 Visualization 해보겠다.

VDB Advect에 Volume Visualization을 달아 색을 주고, Vector Field의 움직임을 보여주는 결과와 Merge 해주었다.

이때 좀 더 직관적으로 변화를 관찰하기 위해 Vector Field의 Initial Value를 {0,1,0}으로 바꿔주었다.

Control의 역할을 할 Null node를 하나 생성해 Copy Parameter 후 각각 Carve node의 FirstU, SecondU 값과 VDB Advect의 Timestep 값에 Paste Relative References 해주었다.

결과적으로 vf의 흐름에 따라 상승하게 되는 Advect를 관찰할 수 있었다.

 

이때 이러한 방식에서 좀 더 확실하게 방향성을 관찰하기 위해 vf에 Noise를 넣어보겠다.

vf Volume의 바로 아래에 Volume Vop을 생성해준다.

Anti-Alised Noise의 3차원 정보를 이용해주겠다.

이후 결과물이 생성되었을 때 Noise의 거친 느낌을 주고 싶다면 Roughness를 수정해주도록 하자.

 

Control의 값을 높여줌에 따라 vf의 Noise에 의해 VDB의 형태가 일그러지는 모습을 볼 수 있다.

 

Trail의 흐름이 너무 밝다고 느껴진다면, Alpha 값을 낮춰주도록 하자.

 


3. Polygons에서의 Gradient, Curvature

 

이제 Gradient와 Curvature를 동시에 사용해볼 예정이다. Volume으로 넘어가기 전 상대적으로 쉽게 다룰 수 있는 Polygon으로 작업해보겠다.

Crag의 거친 부분을 Blur 처리해준 다음 Measure를 통해 Curvature 값을 구해주었다(Volume04강의 참고).

이제 Curvature를 활용해 Crag에서 튀어나온 부분은 더 튀어나오고 들어간 부분은 더욱 들어가게 만들어주도록 하겠다.

 

이때 Curvature만으로는 면을 튀어나오거나 들어가게 만들 수는 없다.

Crag에서의 면을 움직여주기 위해 방향의 정보가 필요하다.

Normal node로 Points에 대한 Normal 정보를 생성해주도록하자.

 

이제 Attribute Wrangle을 달아 @P의 값에 @N의 방향을 더해준다. 이때 @N에 @curvature를 곱해줌으로써 Normal이 curvature의 정보를 가지게 해주었다.

예상과는 다른 결과가 발생한 것을 볼 수 있다.

이 이유는 현재 가지고 있는 Curvature 값이 들쭉날쭉해 급격하게 커지는 부분이 발생하고 있기 때문이다.

 

Normal node 아래에 새로운 AttributeWrangle을 달아준다.

1. Curvature 값은 -100~100 또는 그보다 더 큰 범위을 가진다. 이러한 들쭉날쭉한 값들을 Clamp 해줌으로써 필요한 만큼의 사이즈 조절이 가능해진다.

2. float 값을 곱해주어 Curvature의 세기를 조절해줌으로써 어느정도의 형체를 유지시킨다.

하지만 그럼에도 불구하고 아직 우글우글한 느낌이 강하게 든다.

 

1. Attribute Blur를 이용해 Curvature 값을 완만하게 만들어준다.

2. Blurring Iterations를 높여주면 높여줄수록 부드러운 느낌을 내줄 수 있다. 원하는 느낌을 찾아 그 값을 조정해주도록 하자.

결과적으로 오목한 곳과 볼록한 곳의 울퉁불퉁함이 잘 나타나진 것을 볼 수 있다.

 


4. Volume에서의 Gradient, Curvature

 

앞선 Polygons에서의 작업 과정에서는 @P, @N, @curvature의 정보가 필요했다. 이제 들어갈 Volume의 작업에서는 VDB의 @P, Volume에서의 @gradient, Volume에서의 @curvature 값이 필요할 예정이다.

VDB = VDB + (@gradient + @curvature)의 방식으로 VDB Advect를 활용해줄 예정이다.

먼저 Mountain으로 Noise를 준 뒤 Remesh 과정을 거친 Sphere를 Fog Volume으로 만들어준다.

Bound node로 Fog Volume의 경계를 확인해준다.

 

Fog Volume과 똑같은 조건의 SDF Volume을 하나 더 생성해 Gradient 값과 Curvature 값을 구해준다.

Name node를 통해 Gradient와 Curvature의 이름을 변경해준다.

VDB Advect에 활용될 정보들이기 때문에 전부 Volume에서 VDB로 변경해준다.

이때 Gradient의 정보는 VDB로 변경 후 VDB vector to Merge를 통해 3개의 float 정보를 하나의 vector 정보로 합쳐준다.

 

VDB Advect에 Fog Volume과 VectorField로서 Gradient를 활용하였다.

Timestep이 증가하면서 Gradient의 방향에 따라 Fog가 퍼지는 모습을 볼 수 있다.

 

이제 Gradient와 Curvature 값을 곱해주려 한다. 둘을 곱해준다면, Curvature가 가지는 양수 값은 Gradient의 크기에 변화를 줄 것이며, Curvature가 가지는 음수값은 Gradient가 가지는 방향을 바꾸면서 크기에도 영향을 줄 것이다.

Merge node로 Gradient와 Curvature의 내용을 합쳐준다. 이후 Volume Vop을 통해 둘의 값을 곱해준다.

VDB Advect에서 VectorField로 활용되었을 때 들어갈 곳은 들어가고 나올 곳은 더욱 나오게 되면서 사진과 같이 터지는 듯한 효과를 가지게 된다.

 

조금 더 뚜렷한 정보를 보기 위해서 VDB Advect의 결과를 Polygons로 변경해주려 한다.

하지만 Convert VDB를 연결해 Polygons로 연결해주었음에도 Scene View에 결과가 나타나지 않는 것을 볼 수 있다.

그 이유는 기본적으로 Volume을 Polygons로 변경해줄 때 SDF 정보로 표면을 찾아 mesh로 만들어주기 때문에 Fog Volume 상태에서는 작동하지 않는 것이다.

 

VDB Advect의 Input 1으로 들어오는 정보를 SDF Volume으로 변경해준 뒤 그 결과를 관찰해보았다.

형체를 보아 Fog Volume과 동일한 형태를 가지고 있는 것을 알 수 있다.

 

이때 위치의 이동이 어떻게 이루어지는지를 관찰하기 위해 Trail을 달아주겠다. 

하늘색의 Trail은 안쪽으로 향하고, 남색의 Trail은 바깥쪽으로 향하고 있는 것을 확인하였다.

 

Fog Volume의 VDB Advect와 함께 관찰해보았다.

VDB Advect의 Timestep 값을 Copy Parameter로 Carve의 SecondU 값과 연동해주었다.

SecondU 값을 키움으로써 VectorField에 의해 움직이는 Volume을 관찰할 수 있었다.

 

마지막으로 Fog Volume의 Timestep 값을 키워줌으로써 뾰족하게 튀어나오는 부분을 제거해보도록 하자.

VDB Advect를 쓸 때 사용하는 VectorField는 Timestep이 0일때의 Gradient, Curvature 값을 이용한 것이다.

이때의 문제점은 Timestep이 증가함에 따라 새롭게 구해진 Gradient, Curvature 값이 새롭게 정의되는 것이 아니라, 처음의 값을 그대로 이용한다는 것이다. 그럼으로써 급격하게 들어가거나 튀어나온 부분이 생기게 된다.

 

이러한 현상을 완화해주기 위해서 세 가지 방법을 사용해주려한다.

1. Volume Vop에서 Gradient와 Curvature를 곱한 값에 Normalize 해준다.

 

2. Volume Vop에서 Clamp function을 통해 Curvature 값의 범위를 통제해준다.

 

3. VDB Smooth를 Curvature VDB 아래에 달아 그 값에 Blur를 준다.

 

세가지 방법 모두 Fog의 튀는 부분이 잘 잡힌 것을 볼 수 있다.