SMOKE 시뮬레이션

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

Posted: July 27, 2019

Version: Houdini 17.5


Smoke 시뮬레이션이란?

DOP_smoke_1.jpg

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

 

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

  • 낡은 다락방 안에서 먼지가 날리는 장면

  • 자동차가 가드 레일에 충돌해서 폭발하는 장면

  • 건물이 붕괴하면서 엄청난 연기가 발생하는 장면

 

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

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

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

Smoke 시뮬레이션 기본구조

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

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

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

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


Smoke 시뮬레이션 구현하기

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

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

DOP_rbd_3.jpg

 

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

 

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

Output Flag 를 맨밑에 있는 'output' 노드로 지정해준다.

DOP_smoke_3.jpg
DOP Network 안에 자동으로 생성되는 Output DOP 노도는 최종 시뮬레이션의 결과를 하드디스크에 저장해주는 기능을 한다. 실무에서는 거의 사용하지 않으므로 가볍게 생각하도록 하자.

 

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

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

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

박스 형태의 Voxel Grid

박스 형태의 Voxel Grid

 

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

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

 

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

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

DOP_smoke_4.jpg

 

안쪽에서 Volume SOP 노드를 한개 생성한다.

DOP_smoke_5.jpg

‘volume1’ 노드 Initial Value X 속성에 1 값을 입력하여 볼륨을 채운다.

DOP_smoke_6.jpg

 

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

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

위와 같은 Geometry 레벨에서의 볼륨과 DOP Network 안의 Voxel Grid 를 혼동하지 않도록 주의한다. ‘volume1’ 노드는 볼륨 생성시 만들어지는 Volume Box 이고 이 볼륨이 다이나믹에 이용될 때 볼륨이 운동할 수 있는 공간이 Voxel Grid 이다.

위와 같은 Geometry 레벨에서의 볼륨과 DOP Network 안의 Voxel Grid 를 혼동하지 않도록 주의한다. ‘volume1’ 노드는 볼륨 생성시 만들어지는 Volume Box 이고 이 볼륨이 다이나믹에 이용될 때 볼륨이 운동할 수 있는 공간이 Voxel Grid 이다.

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

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

볼륨의 경로를 직접 입력해도 되고, 오른쪽 Operator Chooser 아이콘을 눌러서 지정해도 좋다.

볼륨의 경로를 직접 입력해도 되고, 오른쪽 Operator Chooser 아이콘을 눌러서 지정해도 좋다.

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

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

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

 

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

TAB 메뉴를 이용해서 Gravity Force DOP 노드를 한개 만들어준다.

DOP_rbd_8.jpg

만들어진 ‘gravity1’ 노드를 ‘smokesolver1' 과 'output' 노드 사이에 연결해 준다.

DOP_smoke_9.jpg

'gravity1' 노드의 Force 기본값이 (0, -9.80665, 0) 임을 확인할 수 있다.

DOP_rbd_10.jpg

후디니 화면 밑쪽 Playbar 에 있는 Play 버튼을 클릭해서 플레이 해본다.

이때 플레이버튼 밑에 있는 Real Time Toggle 버튼을 눌러서 리얼타임으로 플레이 한다.

리얼타임이란 1초에 24프레임의 속도로 플레이 하는 것을 말한다.

리얼타임이란 1초에 24프레임의 속도로 플레이 하는 것을 말한다.

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

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

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

다이나믹을 플레이 할 때는 반드시 프레임 번호가 1인 지점에서 시작하도록 한다.

 

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

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

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

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

Size 속성에서 XYZ 축별 Voxel Grid 의 크기(사이즈) 를 정한다.

Center 속성에서 XYZ 축별 Voxel Grid 의 위치(센터점) 를 정한다.

다시 플레이를 해 보자.

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


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

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

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

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

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

 

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

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

Output Flag 는 항상 마지막 ‘output’ 노드에서 활성화시키도록 주의한다.

Output Flag 는 항상 마지막 ‘output’ 노드에서 활성화시키도록 주의한다.

 

우선 Merge DOP 은 Merge SOP 과 그 성격이 많이 다르다.

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

DOP_rbd_17.jpg

Affector Relationship 속성은 인풋으로 오는 오브젝트들의 관계에서 우선 순위를 정해준다.

기본값은 Merge DOP 의 왼쪽 인풋의 오브젝트가 오른쪽 인풋의 오브젝트에게 영향을 미치도록 되어 있다.

즉, 볼륨은 바닥의 영향을 받아 충돌하지만 바닥은 볼륨의 영향을 받지 않는다.

그러므로 Merge DOP 에 연결시 인풋들의 순서에 특별히 주의한다.


Smoke 시뮬레이션 마무리하기

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

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

[Initial State] 탭은 다이나믹 최초(Frame:1) 에 해당 오브젝트의 위치 또는 회전값을 정해 준다.

[Initial State] 탭은 다이나믹 최초(Frame:1) 에 해당 오브젝트의 위치 또는 회전값을 정해 준다.

이때 바닥을 너무 많이 내려서 Voxel Grid 영역 밖으로 나가지 않도록 주의한다.

 

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

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

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

Hidden Flag 는 해당 오브젝트를 숨길뿐, 시뮬레이션에는 관여를 한다.

DOP_smoke_13.jpg