Posted: July 27, 2019
Version: Houdini 17.5
Smoke 시뮬레이션이란?
연기 또는 불과 같이 기체로 이루어진 물체의 운동을 나타내는 다이나믹이다.
다음과 같은 상황들이 Pyro 시뮬레이션에 포함될 수 있다.
낡은 다락방 안에서 먼지가 날리는 장면
자동차가 가드 레일에 충돌해서 폭발하는 장면
건물이 붕괴하면서 엄청난 연기가 발생하는 장면
Pyro 시뮬레이션은 다름 아닌 볼륨(Volume) 시뮬레이션이다.
즉, 각 Voxel 마다 가지고 있는 볼륨양이 변해가면서 기체가 운동하는 모습을 나타내는 것이다.
Smoke 시뮬레이션 기본구조
후디니 Smoke 시뮬레이션의 기본 골격은 다음과 같다.
Smoke 오브젝트가 어떤 힘을 받을 경우, Smoke 솔버가 그 힘을 계산하여 오브젝트를 움직인다.
Smoke 시뮬레이션 구현하기
다이나믹을 하기위해 '/obj' 에 DOP Network 노드를 하나 만든다.
만들어진 'dopnet1' 노드 안쪽 Dynamics 레벨로 들어간다.
TAB메뉴를 이용해서 Smoke Object DOP 와 Smoke Solver DOP 을 하나씩 만든다.
만들어진 'smokeobject1' 과 'smokesolver1' 노드를 다음과 같이 연결한다.
Output Flag 를 맨밑에 있는 'output' 노드로 지정해준다.
이전까지 배운 다른 다이나믹 오브젝트와 다르게 기본값으로 나타나는 지오메트리가 없다.
씬 뷰에서 원점에 박스 형태로 이루어진 선들을 볼 수 있는데 이를 Voxel Grid 라고 한다.
Smoke 오브젝트는 오직 이 Voxel Grid 영역 안에서만 그 운동을 나타낼 수 있다.
이제 Smoke 오브젝트로 쓰일 기본 지오메트리를 지정해 줄 차례다.
Pyro 시뮬레이션은 Voxel 기반이기 때문에 기본 오브젝트 또한 볼륨이어야 한다.
/obj 레벨에서 지오메트리 노드를 만들고 그 이름을 'volume' 으로 정한다.
'volume' 노드를 더블클릭하여 안쪽 Geometry 레벨로 들어가자.
안쪽에서 Volume SOP 노드를 한개 생성한다.
‘volume1’ 노드 Initial Value X 속성에 1 값을 입력하여 볼륨을 채운다.
씬 뷰에 정사각형 형태로 채워진 볼륨이 나타난다.
이제 DOP Network 에서 이 볼륨이 Smoke 오브젝트의 초기 볼륨으로 사용될 것이다.
다시 DOP Network 안으로 돌아온다.
'smokeobject1' 파라미터창 [Initial Data] 탭에 있는 'Density SOP Path' 속성에 준비한 볼륨을 지정한다.
씬 뷰에는 비어 있었던 Voxel Grid 안에 볼륨 오브젝트가 들어왔다.
현재 기본골격인 Smoke 오브젝트와 솔버가 있지만, 플레이를 해도 볼륨에는 아무 변화가 없다.
그것은 볼륨을 움직이게 만드는 외부힘이 존재하지 않기 때문이다.
외부힘을 더하기 위해 중력을 만든다.
TAB 메뉴를 이용해서 Gravity Force DOP 노드를 한개 만들어준다.
만들어진 ‘gravity1’ 노드를 ‘smokesolver1' 과 'output' 노드 사이에 연결해 준다.
'gravity1' 노드의 Force 기본값이 (0, -9.80665, 0) 임을 확인할 수 있다.
후디니 화면 밑쪽 Playbar 에 있는 Play 버튼을 클릭해서 플레이 해본다.
이때 플레이버튼 밑에 있는 Real Time Toggle 버튼을 눌러서 리얼타임으로 플레이 한다.
그런데 플레이를 해보면 볼륨이 단순히 사라지는 듯하다. 왜 그럴까?
실제로는 볼륨이 중력으로 인해 아래로 떨어지고 있다.
단지 볼륨이 Voxel Grid 영역 밖으로 벗어나자마자 사라지는 것이다.
볼륨의 운동방향을 추적할 수 있도록 Voxel Grid 크기를 충분히 늘려준다.
'smokeobject1' 노드의 'Size' 속성값을 다음과 같이 수정한다.
Size 속성에서 XYZ 축별 Voxel Grid 의 크기(사이즈) 를 정한다.
Center 속성에서 XYZ 축별 Voxel Grid 의 위치(센터점) 를 정한다.
다시 플레이를 해 보자.
늘어난 Voxel Grid 크기 덕분에 볼륨이 아래로 떨어지는 모션을 충분히 관찰할 수 있다.
충돌(collision) 오브젝트 만들기
볼륨이 충돌할 평면을 만들기 위해 Ground Plane DOP 을 하나 만든다.
다음과 같이 그리드 모양의 평면 오브젝트가 나타난다.
자, 그럼 어떻게 볼륨 (smokeobject1) 을 바닥 (groundplane1) 에 충돌하게 만들 수 있을까?
Merge DOP 노드를 만든 후, 다음과 같이 연결해 준다.
우선 Merge DOP 은 Merge SOP 과 그 성격이 많이 다르다.
'merge1' 노드의 Relationship 속성값으로 인해 그 인풋으로 오는 오브젝트들을 충돌관계에 넣고있다.
Affector Relationship 속성은 인풋으로 오는 오브젝트들의 관계에서 우선 순위를 정해준다.
기본값은 Merge DOP 의 왼쪽 인풋의 오브젝트가 오른쪽 인풋의 오브젝트에게 영향을 미치도록 되어 있다.
즉, 볼륨은 바닥의 영향을 받아 충돌하지만 바닥은 볼륨의 영향을 받지 않는다.
그러므로 Merge DOP 에 연결시 인풋들의 순서에 특별히 주의한다.
Smoke 시뮬레이션 마무리하기
현재 볼륨과 바닥 오브젝트가 원점에 겹쳐서 위치하고 있다.
'groundplane1' 의 Position Y 값을 조절하여 바닥을 충분히 볼륨 아래쪽으로 내려 준다.
다시 시뮬레이션을 플레이 해 보자.
볼륨이 바닥에 충돌하면서 넓게 퍼져 나아가는 모습을 확인할 수 있다.
'groundplane1' 노드의 Hidden Flag 를 클릭해서 볼륨이 좀 더 뚜렷하게 보이게 한다.
Hidden Flag 는 해당 오브젝트를 숨길뿐, 시뮬레이션에는 관여를 한다.