TWA Houdini1/Volumes

TWA 후디니 1 Volume_01 : Volume 기초 이론, Density와 SDF

yiss09 2023. 2. 14. 06:26

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

 

HOUDINI1_ VOLUMES

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

www.twahoudini.com

 

Volume01 강의에서는 Volume의 기초이론에 대해 설명하였다.

 


Volume은 공간을 voxel이라는 단위로서 표현한 부피를 가진 결과물이다.

Volume의 기본단위인 voxel은 volume과 pixel의 합성어이다.

Volume은 두 가지로서 구분 가능하다. 하나는 결과, 다른 하나는 정보 저장으로서의 Volume이다.

1. 눈으로 볼 Volume은 결과물로서의 Volume이 많다. 일반적으로 밀도에 의해 시각적인 표현이 가능해진다. 연기, 구름, 불, 화염, 에너지와 같은 표현들이 Volume을 밀도로서 표현했을 때 시각적으로 볼 수 있는 결과들이다.

2. 정보저장면에서의 Volume의 활용은 시각적으론 큰 의미를 가지지 않는 경우가 대부분이다. 작업에 유용한 정보로서는 굉장히 중요하다. 예를 들면, 공간에 부는 바람, 표면이 가지는 곡률, 표면이 가지는 normal과 같은 정보가 Volume으로서 저장이 된다. 이러한 정보들은 Volume을 통한 modeling에서도 사용이 가능하다. 정보로서 활용되는 Volume을 잘 활용하느냐 마느냐기 최대 관건이 될 것이다. 정보가 잘 다뤄진 뒤에 그에 맞는 좋은 결과가 나온다.

 

사진에서의 Volume은 3*3*3의 형태를 가지고 있는데, 이를 [3,3,3] 이라고 표기한다. voxel의 갯수는 3*3*3 = 27개로 계산된다.

사진을 보면 중간에 있는 육면체는 다른 육면체보다 진하게 표현된다. 이는 중간의 육면체가 다른 것들에 비해 밀도가 크다는 것을 뜻한다. 

또한 밀도의 이름을 변경해줄 수 있다.ex) density[3,3,3], twa[3,3,3], a[3,3,3]

이때 변경된 것들의 Volume의 형태와 해상도가 똑같아도 이름이 다르게 설정된다면 서로 다른 Volume으로 활용이 된다.

 

하나의 Volume은 그 자체로 하나의 primitive에 저장된다. 그리고 primitive에 저장된 volume은 point 한개로써 위치 정보를 가지게 된다. 이때의 위치 정보는 Volume이 어디에 놓일지 정해주는 point number이다.

 

만약 Volume의 내용이 float 타입이 아닌 vector 타입이라면 Node infor에서 두 가지 방식으로 쓰일 것이다.

 

 각각의 voxel의 실제 위치 값은 존재하지 않는다. 그럼에도 Volume에서는 시각적으로 표현된 것들을 볼 수 있는데 이 내용은 Intrinsics에서 확인 가능하다. Intrinsics로 저장된 voxel의 위치 정보에 대해 알려면 Volume이 어떻게 정보를 다루는지 이해를 할 필요가 있다. 큰 행렬에서 순서대로 쓰인다고 생각해보자.

가장 첫 내용은 0 그 다음 순서대로 1,2,3...의 순서를 가진다.

 

만약 volume[3,3,3]일 때, (0,0,0) (1,0,0) (2,0,0) (0,1,0) (1,1,0) (2,1,0) (0,2,0) (1,2,0) (2,2,0)  (0,0,1) (1,0,1) (2,0,1) 순서로 Intrinsics에 정리된다. 이는 x + (y*a) + (z*a*b)의 식에 대입되었을 때 0,1,2,3,4,5,6,7,8,9,10,11의 값이 된다.

 

Volume에서 가장자리 부분은 밀도가 낮다. VDB는 이러한 부분을 제거하여 Volume에서 효율을 높인 방식이다.

Volume은 float 방식으로 정보를 다루는 반면, VDB는 vector 방식으로 정보를 다룬다.

예를 들자면 Volume에서의 vector는 wind.x[], wind.y[], wind.z[]와 같이 float으로 나뉘어 입력된다. 하지만 VDB에서는 wind[]의 방식으로 한번에 정보가 입력된다.

 

먼저 그냥 Volume에서의 예시이다.

공간상에 어떠한 구를 기준으로 Volume을 만든 결과이다.

구 안의 voxel들은 0보다 큰 밀도값을 가지고 있고, 구 바깥에 있는 voxel들은 밀도가 0이다. 이때 0보다 큰 값을 가지는 voxel들의 모든 밀도값을 1로 올려준다면, 오른쪽 그림과 같이 blur된 느낌이 하나도 없는 블럭같은 느낌으로 표현 가능해진다.

 

SDF(Sign Distance Filed)는 거리에 대한 정보라는 뜻이다. 또한 점으로부터 구를 그렸을 때 물체의 표면과 접하게 되는 voxel의 최단 거리이다. 여기서 얻게되는 r 값이 SDF 값이다.

그냥 Distance Field 값이었다면 +를 가졌겠지만, Signed Distance Filed 이기에 구 안에서의 값이 마이너스를 가지게 된다.

이때 Signed Distance Filed 값이 0인곳을 물체의 표면이라고 볼 수 있다.

구 밖의 값은 +이고 내부의 값은 - 이다. 그 다음 전체에 -1을 곱해준다면 구 안팎의 부호가 바뀌게 된다. 여기서 0보다 작은 음수를 모두 0으로 바꿔준다면, 0과 +로 구성된 어떠한 정보가 된다.

 

Sphere는 Box를 향해서 날아가고 있다.

두 SDF를 곱해준다면, sphere와 box는 -가 되고 외부는 +로 그대로 유지된다.

 

sphere가 날아가 box에 충돌한 상황이다.

두 SDF를 곱해준다면, sphere와 box가 충돌한 부분이 +로 바뀌게 된다. 이와 같은 조건이 발생했을 때 충돌이 발생했다고 인식된다.

 

VDB는 Volume에 비해서 Voxel의 수가 적은 것을 알 수 있다.

이때의 VDB는 속이 비어있다.

 

첫 번째는 SDF가 0인 부분에 면을 댄 결과이다.

두 번째는 실제 SDF의 결과를 밀도로서 시각화한 결과이다. 중간에 비어 있는 구 부분은 scene view가 어떠한 값 미만의 밀도에 대해 표현을 하지 않아서이다.

세 번째는 두번째 결과에서 수치값의 변화를 주어 보기 편하게 바꾸었다. 속이 비어 있고, 밖의 밀도가 더 높다.

네 번째는 SDF에 대해 가장 많이 오해하는 결과이다. 표면에 얇은 Volume이 있는 것처럼 보이는데 이것은 강사님이 시각적으로 보여주고자 만든 모습이고 실제 SDF는 두 번째 모습과 같이 표현된다.

 

맨 왼쪽의 Volume과 VDB의 SDF 결과는 동일하다. 그 이유는 동일하게 SDF가 0인 구간을 면으로 치환해서 후디니가 보여주고 있기 때문이다.

이제 SDF의 결과를 밀도로 본 결과들을 비교해보겠다.

그냥 Volume으로 만든 결과들은 정육면체의 윤곽을 보이고 있다.

하지만 VDB로 만든 결과들은 정육면체의 윤곽이 없다. 그 이유는 SDF가 중요하다고 판단하는 것은 거리가 0인 부분이기 때문에 어느 기준을 넘어서면 VDB가 판단하기에 불필요한 부분을 모두 지우기 때문이다.

 

이와 같이 SDF의 거리가 어느정도 기준을 넘어서면 VDB가 필요없는 정보라고 판단해 기준치 너머의 바깥쪽과 안쪽의 정보들을 지워주게 된다.

Volume과 VDB에서의 SDF 차이를 확실히 인지하자.