TWA Houdini1/Rigidbody

TWA 후디니 1 RIGIDBODY_01 : 리지드바디를 들어가며 & Pack 이해하기

yiss09 2023. 3. 20. 22:28

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

 

HOUDINI1_ RIGIDBODY

3️⃣ 출동 SIMULATION 기초 이론부터 심화된 내용을 공부합니다. 또한 자동차를 이용한 리깅 시뮬레이션 BASIC을 훈련합니다.

www.twahoudini.com

 

RigidBody01에서는 리지드바디에 대한 기초 설명과 리지드바디에서 기본으로 활용될 Pack에 대해서 알아보겠다.

 

1. 이론 설명

2. Pack, Unpack

 

 


1. 이론 설명

 

리지드바디가 무엇인가? 직역하면 강체, 딱딱한 물체의 물리적 작용을 뜻한다.

CG에서 우리에게 익숙한 리지드바디 Simulation은 뭐가 있을까? Object의 낙하와 충돌, 힌지의 열림과 닫힘 부러짐, 충돌에 의한 물체의 찌그러짐, 건물의 붕괴 파괴와 같은 것들을 우리는 RigidBody Simulation이라고 한다.

 

먼저 후디니가 제공하는 Help를 보면서 Pack의 원리가 무엇인지 알아보겠다.

Pack을 활용한 Instancing을 하면 컴퓨터가 실제로 어떻게 계산을 하고 얼마나 효율적인지 이런 내용이 먼저 나온다.

Instancing은 간추려 말해 교환을 뜻할 수 있다. 하지만 실제로는 말로 직역하기에는 어려움이 있어, Pack을 활용한 예제를 다루다보면 어떠한 일련의 과정을 뜻한다는 것을 알게 될 것이다. Pack과 Instancing은 연관이 많으니 생소하더라도 이러한 단어를 사용해주도록 하겠다.

 

해당 사진을 보고 Pack의 기능을 설명해보겠다.

8000 Polygons의 1MB의 나무 1개를 4개로 만들고 싶다. 이 과정에서 3번의 복사 과정이 발생하게 된다.

이때 후디니는 4배 즉, 32000 Polygons의 4MB의 메모리를 쓰게 될 것이다.

만약 지금과 같이 작은 용량이 아닌 하나에 250GB 처럼 큰 용량인 경우, 4개 복사했을 때 1TB의 메모리를 사용하게 될 것이다. 이러한 부담스러운 상황에 Pack을 사용하면 훨씬 적은 용량으로 동일한 수행이 가능해진다.

 

앞과 똑같이 나무 1개를 4개로 복사해줄 것이다. 다른점은 이때 Pack이라는 과정이 추가된다.

Pack을 했고, 껍데기가 4개가 있다. 그리고 전체 과정에서 1MB 밖에 사용이 되지 않았다.

 

일상 생활에서도 Pack의 개념을 사용한 경우가 있다. 바로 파일 압축과 스트리밍 업로드이다. 이러한 것들을 예시로 들어서 보면 이해하기가 훨씬  쉬울 것이다.

Pack에는 2가지 역할이 있다.

하나는 하나의 자료를 압축한다는 뉘앙스가 있고, 다른 하나는 컴퓨터 어딘가에 자료를 저장한다라는 뉘앙스가 있다.

예를 들어 스트리밍 사이트에 영상을 올리면 그 이후엔 동시에 삼천명이 영상을 볼 수도 있고, 만명이 영상을 볼 수도 있다. 굳이 원본을 물리적으로 복사하지 않아도 시청할 수 있다는 것이 핵심이다.

 

어떤 Node의 결과로서 우리가 만든 나무가 있다.

그 안에는 수 많은 모델링 데이터, UV 자료, Attributes, Groups와 같은 내용들이 들어있다. 이때 우리는 Pack을 이용해 이것들을 하나의 꾸러미로 묶어줄 예정이다. 파일 압축과 유사하다.

그리고 이렇게 압축 된 파일은 메모리에 저장된다. 서버에 자료를 올리는 과정과 유사하다.

이렇게 하여 얻게 되는 Pack에 의한 결과는 껍데기, 즉 가상의 결과를 얻게 된다.

가상의 원본 상태에서는 나뭇가지의 디테일을 바꿀 수 없다. 왜냐하면 해당 자료를 불러서 올 뿐이기 때문이다.

만약 나뭇가지의 디테일을 바꾸고 싶다면, Pack된 결과물을 다시 풀어주야할 것이다.

여기까지 Packing에 대한 내용이다. 이러한 한번의 Pack 과정만을 가지고 Instancing을 이해하기는 어렵다.

 

이제 이 나무를 여러 그루로 복제하려한다. 이때 Pack이 된 가상의 원본들을 활용해서 메모리에 부담을 주지 않고 여러 곳에 나무를 배치해준다. 처음의 나무가 {0,0,0} 그 다음으로는 x축으로 1만큼 씩 이동해주다고 표현해보겠다.

이와 같은 결과를 얻기 위해서 Node로 표현한다면, Pack한 나무 결과를 transform으로 나열하거나, Copy to Stamp를 이용해주면 되겠다.

이때 얻은 가상의 결과물들은 모두 메모리에 있는 원본 자료를 요청하게 될 것이다.

각각의 Point들이 가상의 원본을 복제하고, 이와 같이 메모리에 있는 자료를 불러오는 과정을 Instancing한다라고 보아도 될 것이다. 이때 복제 과정에서 메모리 효율을 극대화하기 위해서 Pack을 쓰게 될 것이다.

 

 


2. Pack, Unpack

 

이제 Houdini로 가서 작업해주도록 하겠다.

Box를 하나 생성해주겠다. 이때 Box의 Node Info를 보면 대략 3MB의 메모리를 가지고 있는 것을 볼 수 있다.

Remesh를 달아 면을 늘려준다. Remesh node의 Node Info를 보면 메모리가 증가한 것을 볼 수 있다.

해당 Object를 3개 복사하면서 x축 방향으로 1씩 이동시켜주겠다. Merge 시켜준다.

Merge node의 Node Info를 확인해보면 메모리가 대략 4배가 된 것을 볼 수 있다.

 

똑같은 과정을 Copy with Stamp로도 해줄 수 있다.

Number of Copies에 수를 늘려 메모리를 크게 늘려보자.

 

이제 Pack을 활용하였을 때 Object가 어떻게 변하는지 확인해보겠다.

Pack을 해줌에 의해 해당 Object가 Viewport에서 보여지는 느낌이 이전과 달라진다(Smooth Wire Shaded 상태).

우리가 원본으로 만들었던 결과는 Point와 Primive의 정보들이 모두 확인되지만, Pack을 한 뒤에는 모든 내용이 Packed Geo 하나에 압축이 되게 된다. Node Info를 보면 Points, Primitives, Vertices 모두 한개가 되어 있는 것을 볼 수 있다.

그리고 메모리가 확실히 줄어든 것을 확인할 수 있다.

 

그런데 Pack된 Object를 Wireframe으로 보면 두 결과가 동일하게 보이는 것을 확인할 수 있다.

 

이제 Copy with Stamp를 Pack에 붙여줘 아까의 원본에서의 결과와 비교해보겠다.

확연히 메모리가 사이즈가 적은 것을 볼 수 있다. 이에 의해 두 결과에 속도 차이가 확연하게 발생하게 된다.

 

이번에는 Memory 측면에서의 이야기가 아닌 압축과 압축 해제에 대해서 다루어 보겠다.

Box, Tube, Sphere를 생성해준다. Transform으로 Tube와 Sphere를 이동시킨 뒤 Merge해 Box와 나란히 볼 수 있도록 해준다. 각각의 Object에 Group도 달아준다.

Merge에서의 Node Info를 확인해보면, Object들에서 사용된 Points와 Group들이 존재하는 것을 볼 수 있다.

 

이제 해당 Objects들을 Pack으로 압축시켜 보겠다.

결과를 보면, Viewport 상에서 껍데기와 같은 느낌으로 변하는 것을 볼 수 있다.

그리고 모든 내용이 Packed Geo 하나에 압축된 것으로 묘사되고 있다.

이때 아까 만들어두었던 Group들이 보이지 않는 것을 볼 수 있는데, 이는 Pack의 Transfer Groups에서 해결이 가능하다.

 

이제 Unpack node를 활용해 압축을 해제해보겠다.

Unpack의 Node Info를 보면, Merge node에서의 결과와 동일한 것을 볼 수 있다.

 

이번에는 기본적으로 Pack 된 상태로 제공되어지는 Object를 이용해보겠다.

Crag를 생성해 Animation을 꺼주고, Shader를 제거해준다.

Crag의 Node Info를 보면 Points와 Packed Geometry가 67개로 구성되어 있는 것을 볼 수 있다. 디테일에 비해 그 수가 적은 것을 보아, 연결된 파츠끼리 Pack이 된 상태로 출력된 것을 알 수 있다.

Crag에 Unpack을 달아준다면, Points와 Primitves가 늘어나는 것을 볼 수 있다.

 

이번에는 Pack이 두 번 되는 상황에 대해서 이야기 해보겠다.

Group 아래에서 각각 따로 Pack을 해준다. Merge를 보면 Points와 Packed Geo가 3개가 된 것을 볼 수 있다.

이제 Pack된 것들을 다시 한번 Pack 해준다. 하나의 Packed Geo로 압축된 것을 볼 수 있다. 이는 1개의 zip파일 안에 3개의 zip 파일이 있는 것과 같다고 생각하면 된다.

Unpack 해준다면, 3개의 Packed Geo가 있는 것을 볼 수 있다. 다시 한번 더 Unpack 해준다면, 원래의 Box, Tube, Sphere의 정보를 확인할 수 있다.

이를 Crag에서도 똑같이 확인할 수 있다. 67개의 Packed Geo로 된 Crag를 다시 한번 Pack해주면, 1개의 Packed Geo로 압축된다. 이때 두 번 Unpack하여 모든 Pack을 풀 수 있다.

 

이번에는 Pack된 Geometry의 사이즈를 바꿔보겠다.

Box를 생성해 Pack해준다.

Transform으로 y축 사이즈를 늘려준다.

이 상태에서 Unpack 해준다면, 사이즈가 늘어난 상태로 Unpack된 것을 볼 수 있다.

 

Grid를 생성해 Rows Colums를 3x3으로 낮춰준 뒤 Add로 점만을 남긴다.

이렇게 생성된 각각의 점에 Pack된 Box를 붙여보려 한다. Copy to Points로 점 위치에 Box를 붙여준다.

Node Info를 확인해보면 9개의 Packed Geo를 확인할 수 있다.

 

이때 Blast로 하나의 점만을 떼어내준다.

다음 Unpack 해준다면, 위치가 바뀐 상태에서 Unpack된 결과를 얻게 된다.

 

이때 Add node 아래에 Attribute Wrangle로 Random한 @pscale을 준 뒤, Blast, Unpack된 결과를 본다면 사이즈가 바뀐 상태로 Unpack 된 것을 볼 수 있다.

 

이렇게 Pack에 대한 내용은 이론 수업만으로는 완벽히 Pack이 어떻게 쓰이는지, 왜 Pack을 쓰는지를 실전적으로 이해하기가 쉽지 않다.

한번 Pack을 직접 손으로 다루어보아야 감이 좀 잡힐 것이다. 이에 다음 수업에서는 오늘 배운 Pack을 활용한 예제를 다루어볼 것이다.