Lesson 6: Pyro 시뮬레이션

Pyro 시뮬레이션이란 무엇이며 후디니에서 어떻게 구현되는지 알아보자.


Pyro 시뮬레이션이란?

연기 또는 불과 같이 기체로 이루어진 물체의 운동을 나타내는 다이나믹이다.

다음과 같은 상황들이 Pyro 시뮬레이션에 포함될 수 있다.


Pyro 시뮬레이션은 다름 아닌 볼륨(Volume) 시뮬레이션이다.

즉, 각 Voxel 마다 가지고 있는 볼륨양이 변해가면서 기체가 운동하는 모습을 나타내는 것이다.

후디니 볼륨과 관련해 더 자세한 정보는 여기에 있다.

Pyro 시뮬레이션은 대부분의 경우 Smoke 시뮬레이션이라고 생각하면 된다.


Pyro 시뮬레이션 기본구조

후디니 Pyro 시뮬레이션의 기본 골격은 다음과 같다.

Smoke 오브젝트가 어떤 힘을 받을 경우, Smoke 솔버가 그 힘을 계산하여 오브젝트를 움직인다.

특별히 불이 동반되는 상황에서는 Smoke 솔버 대신 Pyro 솔버가 쓰일 것이다.



Pyro 시뮬레이션 구현하기

다이나믹을 하기위해 '/obj' 에 DOP Network 노드를 하나 만든다.

만들어진 'dopnet1' 노드 안쪽 Dynamics 레벨로 들어간다.



TAB메뉴를 이용해서 Smoke Object DOPSmoke Solver DOP 을 하나씩 만든다.



만들어진 'smokeobject1' 과 'smokesolver1' 노드를 다음과 같이 연결한다.

Output Flag 를 'smokesolver1' 으로 지정해준다.



이전까지 배운 다른 다이나믹 오브젝트와 다르게 기본값으로 나타나는 지오메트리가 없다.

씬 뷰에서 원점에 박스 형태로 이루어진 선들을 볼 수 있는데 이를 Voxel Grid 라고 한다.

Smoke 오브젝트는 오직 이 Voxel Grid 영역 안에서만 그 운동을 나타낼 수 있다.



이제 Smoke 오브젝트로 쓰일 기본 지오메트리를 지정해 줄 차례다.

Pyro 시뮬레이션은 Voxel 기반이기 때문에 기본 오브젝트 또한 볼륨이어야 한다.


/obj 레벨에서 지오메트리 노드를 만들고 그 이름을 'volume' 으로 정한다.

'volume' 노드를 더블클릭하여 안쪽 Geometry 레벨로 들어가자.



Volume SOP 을 하나 생성하고 파라미터 창을 다음과 같이 바꾼다.

'Initial Value' X 속성에 1 값을 입력하여 볼륨을 채운다.



씬 뷰에 정사각형 형태로 채워진 볼륨이 나타난다.

이제 DOP Network 에서 이 볼륨이 Smoke 오브젝트로 사용될 것이다.

위에서 보이는 분홍색 박스와 DOP Network 안의 Voxel Grid 를 혼동하지 않도록 주의한다. 분홍색 박스는 볼륨 생성시 정해지는 Volume Box 이고 이 볼륨이 다이나믹에 이용될 때 볼륨이 운동할 수 있는 공간이 Voxel Grid 이다.


다시 DOP Network 안으로 돌아온다.

'smokeobject1' 파라미터창 [Initial Data] 탭에 있는 'Density SOP Path' 속성에 준비한 볼륨을 지정한다.



아이콘을 클릭하여 'volume' 을 선택하고 Accept 한다.

다음과 같이 볼륨 패스가 입력되었다.



씬 뷰에는 비어 있었던 Voxel Grid 안에 볼륨 오브젝트가 들어왔다.

현재 기본골격인 Smoke 오브젝트와 솔버가 있지만, 플레이를 해도 볼륨에는 아무 변화가 없다.

그것은 볼륨을 움직이게 만드는 외부힘이 존재하지 않기 때문이다.


외부힘을 더하기 위해 중력을 만든다.

Gravity Force DOP 을 만들어서 'smokeobject1' 과 'smokesolver1' 노드 사이에 연결해 준다.



그런데 플레이를 해 보면 볼륨이 단순히 사라지는 듯하다. 왜 그럴까?

실제로는 볼륨이 중력으로 인해 아래로 떨어지고 있다.

단지 볼륨이 Voxel Grid 영역 밖으로 벗어나자마자 사라지는 것이다.



볼륨의 운동방향을 추적할 수 있도록 Voxel Grid 크기를 충분히 늘려준다.

'smokeobject1' 노드의 'Size' 속성값을 다음과 같이 수정한다.

Size 속성값을 크게 할수록 솔버가 계산할 Voxel 양이 증가하므로 시뮬레이션 시간이 느릴 수 있다.


다시 플레이를 해 보자.

늘어난 Voxel Grid 크기 덕분에 볼륨이 아래로 떨어지는 모션을 충분히 관찰할 수 있다.



후디니 화면 우측 밑 Playbar 에 있는 Real Time Toggle 버튼을 눌러서 리얼타임으로 플레이 한다.

다이나믹을 플레이 할 때는 반드시 프레임 1부터 시작하도록 한다.



충돌(Collision) 오브젝트 만들기

볼륨이 충돌할 평면을 만들기 위해 다이나믹 레벨에서 Ground Plane DOP 을 하나 만든다.

다음과 같이 그리드 모양의 평면 오브젝트가 나타난다.

만들어진 'groundplane1' 노드의 Output Flag 를 클릭해야 평면 오브젝트를 볼 수 있다.


자, 그럼 어떻게 볼륨 (smokeobject1) 을 바닥 (groundplane1) 에 충돌하게 만들 수 있을까?

Merge DOP 노드를 만든 후, 다음과 같이 연결해 준다.

만들어진 'merge1' 노드의 Output Flag 를 켜준다.

'merge1' 노드의 Relationship 속성으로 인해 그 인풋으로 오는 오브젝트들을 충돌관계에 넣고있다.

Affector Relationship 속성으로 인해 볼륨은 바닥에 충돌하지만 바닥은 볼륨의 영향을 받지 않는다.



Pyro 시뮬레이션 마무리하기

현재 볼륨과 바닥 오브젝트가 원점에 겹쳐서 위치하고 있다.

'groundplane1' 의 Position Y 값을 조절하여 바닥을 충분히 볼륨 아래쪽으로 내려 준다.

이 때 바닥 오브젝트가 Voxel Grid 영역 밖으로 나가지 않도록 주의한다.


다시 시뮬레이션을 플레이 해 보자.

볼륨이 바닥에 충돌하면서 넓게 퍼져 나아가는 모습을 확인할 수 있다.

'groundplane1' 노드의 Hidden Flag 를 클릭해서 볼륨이 좀 더 뚜렷하게 보이게 한다.