https://www.twahoudini.com/course/rigidbody1
HOUDINI1_ RIGIDBODY
3️⃣ 출동 SIMULATION 기초 이론부터 심화된 내용을 공부합니다. 또한 자동차를 이용한 리깅 시뮬레이션 BASIC을 훈련합니다.
www.twahoudini.com
지난 시간에 배운 것을 요약해보고 지나가겠다.
1. Dop Network 안에서 Object는 그릇이다.
2. RigidBody Simulation에서 가장 중요한 것은 충돌조건으로 RBD와 Bullet 방식이 있다. 우리는 Bullet에 중점을 두고 공부할 예정이다.
RigidBody Simulation에서 가장 까다롭게 중요한 개념은 얼마나 완벽하게 Proxy Geo와 고해상도 결과물을 치환시키느냐이다.
조금만 더 디테일하게 설명하자면, Simulation이 안정적이고 빠르게 작동하기 위해선 가벼운 충돌 조건들이 필요하다. 그리고 우리가 쓴 충돌조건을 기준으로 디테일이 많은 자료를 완벽하게 치환시킬 줄 알아야 한다. 이 과정이 Instancing이다.
이러한 Instancing 과정을 직접할 줄 알아야 시간을 많이 아낄 수 있다.
그리고 Proxy Geo로 Simulation하는데에 익숙해져야 하는 또 다른 이유는 가볍게 Simulation을 돌릴 수 있어야만 Tweak의 수를 늘릴 수 있다. 무거운 자료로는 시간이 오래 걸리기 때문이다.
이 때문에 이후 작업에서 무거운 자료를 다룰 때에는 가벼운 자료로 Simulation을 작동시키고 Tweak을 끝낸 뒤, 마지막에 치환해주는 작업을 가질 것이다.
후디니가 제안하는 올바른 방법을 잘 쫓고, 이와 같은 작업을 올바르게 하기 위해서는 결국 Pack된 자료를 바탕으로 Simulation을 해주어야 한다. 이때 우리는 자연스럽게 분리 Solver를 신뢰하고 쓰게될 것이다.
이에 맞는 학습 순서이다.
1. Packed Object로 Simulation 발생시키기
2. Pack된 자료를 Dop Network에 넣기 전에 미리 준비할 내용들
3. Simulation 자료 분석
4. 치환
이제 RigidBody04에서 Initial Data와 Physical을 다루는 방법에 대해서 배워보겠다.
Pack이 되었을 때와 Pack이 되지 않았을 때 이 두 녀석의 표면적 결과 차이를 비교할 필요가 있다. 완벽한 동일한 위치에서 동일한 각도로 떨어져도 서로 결과가 다르게 나올 예정이기 때문이다.
먼저 Box를 생성한 뒤, Transform으로 위치를 바꿔주겠다. 그리고 Null을 달아 Pack을 하지 않는다는 의미로 just라고 이름을 지어준다.
그리고 Pack된 Box를 하나 생성해준다. 이때 Pack의 위치를 Transform 위로 두어 Pack된 Box가 옮겨지도록 해준다.
마지막으로 Pack의 위치가 Transform 아래에 있는 Box를 하나 더 생성해준다.
Dop Network 안으로 RBD Object 하나와 RBD Packed Object 두 개를 생성한다.
RBD Object에는 Pack이 되지 않은 just를 넣고, 나머지 둘도 SOP Path를 지정해준다.
Solver로는 Rigid Body Solver를 사용한다.
물체가 지면에 충돌할 수 있도록 Ground Plane과 Gravity Force를 연결해준다.
결과를 보면 Box들은 충돌했을 때 둘의 모션은 비슷하지만, 다른 방향으로 돌고 있는 것을 볼 수 있다.
Object들의 위치와 방향을 로드하고 저장하는 방식에서 계속 오차가 발생하고 있기 때문에, 표면적으로 동일한 결과를 넣어도 다른 결과가 나오는 것이다.
구체적으로 설명해보자면, 물체를 사용하기 위해서 우리는 Transform을 많이 쓴다. 이는 사용자의 편의를 위해 후디니가 Transform이라는 node로써 360도의 각도를 계산하기 쉽게 만들어준 것이다.
실제 후디니가 각도를 인식하기 위해서는 @orient라는 정보가 필요하다. @orient의 정보는 x,y,z에 대한 vector3 정보가 아닌 무려 vector4의 정보이다. 이때 vector4의 정보 방식이 물체의 Instancing에 도움을 준다. 여기서 Instancing이란 점의 위치와 방향으로써 물체를 어떻게 공간에 배치할지를 정하는 것이다.
RBD Packed Object가 따로 존재하기 때문에, RBD Object node는 Pack과는 무관하다고 생각할 수도 있다.
하지만 실제 RBD Object를 이용한 Simulation 공정에서는 순간적으로 Pack을 하여 Simulation한 뒤, 다시 Unpack하여 결과로 출력한다.
왼쪽의 그림이 RBD Object의 Simulation 과정이다.
최초에는 어떤 Collision Data를 쓸지 변환하는 과정이 있을 것이고, 이때 이 Collision Data는 Packing이 된다. 그리고 그때부터 Pivot(회전의 중심)이 생기고 방향을 나타내는 Orient 그리고 위치정보를 가지게 된다. 이를 Collision 정보가 어떤 한 점에 Pack된 상태로 Instancing이 된 것이라고 할 수 있다. 이제 이 자료를 가지고 Simulation이 발생된다. 그리고 이 Simulation의 결과로 다음 Frame에서의 P(위치)와 Orient(방향)이 정해졌다면, 결과적으로 위치가 바뀐 Collision의 원본을 치환하여 돌려주게 된다.
그런데 만약 이와 같은 과정 대신 그냥 주어진 Object를 가지고 Simulation이 된다면, 우리가 가진 물체의 각각의 Point들의 위치가 Simulation이 진행되면서 오차에 의해 변형이 계속하여 발생될 것이다. 원본을 보존하지 못할 수도 있으며, 시간이 지남에 따라 원본에 손상이 갈 수도 있다는 것을 뜻한다.
정리해서 말해보자면, 우리가 Simulation을 한다고 해서, 각각의 조각의 모양이 바뀔 수는 없다. 그러려면 다른 값으로써 결과를 얻고, 마지막에 위치에 대체해주는 과정이 필요하다.
오른쪽은 Pack된 Obj를 넣었을 때의 Simulation 과정이다.
이미 Pack이 되어있기 때문에, Convert하는 과정이 생략된다. 이미 Pivot, Orient, P가 정해진 상태로 Simulation에 들어가는 것이다. 이렇게 Simulation을 돌려 나온 결과는 위치와 방향이 바뀐 상태일 것이다. 그 이후엔 그냥 Pack된 상태 그대로 돌려주면 된다. 그리고 최종적으로 우리가 이 Simulation된 결과를 이용하고 싶을 때, Unpack하여 작업하면 될 것이다.
이렇게 Convert 과정의 생략에 의해 결과적으로 차이가 날 수 밖에 없는 것이다.
RBD Packed Object 끼리도 결과가 달랐었다. 그 이유는 둘의 Pivot이 다르기 때문에 표현되는 Orient가 달라져 Simulation의 결과도 달라지는 것이다.
Geometry SpreadSheet에서 pack_A의 Primtives에서의 Intrinsics:pivot을 보면 {0,0,0}의 pivot 정보를 가지고 있는 것을 볼 수 있다.
이때 pack_B의 pivot 정보를 보면 {0,4,0}으로 pack_A와 다른 pivot 정보를 가지고 있는 것을 볼 수 있다. pivot의 정보가 다르기에 orient를 구해줄 때에도 다른 정보가 쓰이게 되어, Simulation의 결과에 영향을 미치는 것이다.
결과적으로 주어진 정보가 모두 같아 보이더라도 node 배치에 따라서 결과가 달라질 수 있다는 것을 확인하였다.
이러한 시스템적인 맥락을 가지고 있어야, RigidBody Simulation에서 왜 Packed Object를 많이 쓰는지 그리고 Simulation 안에서 충돌 조건으로써 어떻게 움직이는지, 또 Simulation 이후 Instancing은 어떻게 진행을 해야할지 감을 잡기가 편하다.
이제 앞으로는 당연하게 Pack된 자료를 가지고 Simulation을 하게 될 것이다. 그리고 맥락이 바뀐다면, Simulation의 작동원리가 아닌 좀 더 눈에 보이는 Simulation 결과를 바꿀만한 요소가 무엇인지에 집중하게 될 것이다.
이제 실험하는 느낌으로 이것저것 해볼 것이다. 그 중에서 Initial State와 Physical에 대해 이야기 해보려한다. Point나 물체의 시작 특징, 무게, 마찰, Bounce와 같은 물리적 특징을 정하는 것이다.
Rubbertoy를 Attribute Delete로 불필요한 요소(Shader, UV)들을 제거해준 뒤 Pack해준다. 이름은 pack_A로 하겠다.
Dop Network 안에서 RBD Packed Object로 pack_A를 불러온다.
Rigid Body Solver를 생성해 Bullet 엔진을 이용해준다.
물체가 지면에 충돌할 수 있도록 Ground Plane과 Gravity Force를 연결해준다.
Rubbertoy의 y축 높이를 높여줄 예정이다. Geometry 단계에서 Transform node를 이용하여도 되지만, RBD Packed Object의 Initial State 탭에서 Position의 위치 값을 변경해줄 수 있다.
y값에 4를 넣어준다면, Tranform에서의 결과와 같은 결과를 볼 수 있다. 이는 Simulation이 시작하기 전 y축으로 4만큼 이동시켜서 보겠다는 것을 뜻한다.
또한 Geometry 단계에서 Attribute Wrangle을 통해 Position을 변경해줄 수 있다.
Pack된 Object의 위치 정보는 각각의 점의 위치가 아닌, 물체가 어디에 놓이느냐를 뜻하기 때문에 @P에 대해서 vector 값을 더해줌으로써 Position을 이동시킬 수 있다.
Initial State의 Rotation에 40을 넣어준다. 이는 시작 단계에서 불러온 물체가 x축 방향으로 40도 만큼 회전해서 Simulation이 된다는 것을 뜻한다.
Pack된 Rubbertoy를 복사해 둘의 위치와 색을 다르게 해준다. 따로 Null을 달아 Dop Network 안에서 따로 부르도록 하겠다. RBD Packed Object로 둘을 따로 불러 Merge 해준다.
이제 Position과 Rotation을 수정해주려하는데, 이때 Dop Network 안에서 수정하기 보다는 밖에서 미리 준비해주는 편이 좋다. 그 이유는 Dop Network 안에서의 Object는 그릇으로 비유된다. 지금은 각각의 자료에 각각 하나씩 불러지고 있기 때문에 Initial State의 값을 변경해준 결과가 우리의 기대와 거의 같다. 그런데 그릇에 여러 물체가 담기기 시작하면 이야기가 달라진다.
다른 색과 위치의 Rubbertoy를 하나 더 생성해주도록 하겠다.
Dop Network 안에서의 결과를 보면 세 물체가 각각 따로 움직이고 있는 것을 볼 수 있다.
이제 Geometry 단계에서 세 물체를 Merge하여 Dop Network 안에서 하나의 그릇에 담아주겠다. 세 물체를 하나의 그릇에 담더라도 따로 움직이는 것을 볼 수 있다. 이와 같이 하나의 그릇에 담기더라도 서로 다른 Packing의 과정에 의해 묶여서 들어온다면 Simulation은 각각 Pack된 물체들이 따로 움직이게 될 것이다.
각도를 틀어보면 각각의 물체에 대해서 회전하는 것을 볼 수 있다.
이번에는 또 다르게 묘사해보겠다. 세 개의 물체를 Merge로 묶어준 뒤 Pack하여 하나의 그릇에 담아주도록 하겠다.
Simulation 결과를 보면 세 물체가 모두 묶인 상태로 움직이는 것을 볼 수 있다.
각도를 틀어도 큰 하나의 물체로 인식되어 회전하는 것을 볼 수 있다.
A 물체에 z축으로 5만큼의 Velocity를 줘보겠다. x축 방향으로 40만큼 회전된 상태에 맞춰 Velocity가 작동하는 것을 볼 수 있다.
Angular Velocity 값을 변경해보니 이 또한 Rotation의 영향을 받는 것을 볼 수 있다.
Velocity와 Angular Velocity가 Rotation에 영향을 받지 않고, 각각 따로 작동했으면 한다. Geometry 단계에서 미리 값들을 준비해주어 이를 해결하겠다. 속도는 v@v, 회전속도는 v@w이다.
Attribute Wrangle을 Pack 아래에 달아 속도와 회전속도를 조절해주도록 하겠다.
이때 이대로 Simulation을 시작하면 속도와 회전속도가 변경되지 않는다.
RBD Packed Object의 Initial State에서 Inherit Velocity from Point Velocity를 체크해주도록 한다. 파라미터의 세팅을 바뀐 것을 볼 수 있다.
생각했던대로 Simulation이 잘 작동하는 것을 볼 수 있다.
이번에는 그릇의 세팅을 변경해보도록 하겠다. 두 Rubbertoy를 하나로 묶고 하나만 따로 담도록 하겠다.
Dop Network의 Object에 A를 입력하면 두 개의 Rubbertoy가 보이고 B만을 입력하면 하나의 Rubbertoy만이 보이는 것을 볼 수 있다.
이제 물체들의 물리값을 다루어보려 한다. 앞에서 다루었던 Initial State 값을 다루는 방법과 큰 차이가 없다고 보면 된다.
무거운 정도는 @density와 @mass를 조절해 다룰 수 있다. 튀기는 정보는 @bounce, 마찰은 @friction을 쓰면 된다.
먼저 Dop Network 밖에서 Initial 정보를 신경쓰지 않고, Sphere가 Box를 때리는 Simulation을 만들어보겠다.
사이즈와 위치가 조절된 Box를 Pack해준다.
Sphere(Polygon Mesh)를 생성해 Group을 달아 영역을 지정하고 색을 준 뒤 Pack해준다.
Dop Network 안에서 RBD Packed Object를 두 개 만들어 따로 Sphere와 Box를 불러준다.
물체가 지면에 충돌할 수 있도록 Ground Plane과 Gravity Force를 생성한다.
이때 Sphere가 오목 볼록하지 않기에, Guide를 켜서 확인해보면 거의 원본과 동일한 녀석이 들어온 것을 볼 수 있다.
그리고 하나 더 독특한 점은 Collision Padding이라는 값에 의해 원본보다 좀 더 많은 면이 쓰이고 있다. Collision Padding 값을 0으로 내리면 훨씬 정리된 느낌을 볼 수 있다.
여기서 Geometry Representation을 Convex Hull에서 Sphere로 변경해준다면 훨씬 가벼운 정보가 될 것이다.
이제 Sphere의 Initial State 값에서 z축 방향의 Velocity를 높여 Box 쪽으로 날아가게 해준다. Simulation을 보면 Sphere가 회전이 없는 상태로 날아가서 Box에 부딪히는 것을 볼 수 있다.
이번에는 Pack된 Sphere의 위치와 초기 속도를 바꿔보려한다. 이때 Sphere를 연결하는 방식으로 Copy to Points를 써준다.
Copy to Points로 연결해준 다음 Add 아래에 Attribute Wrangle을 달아 초기 위치와 속도를 변경해준다.
어느정도 괜찮은 속도값을 얻었다고 생각이 든다면, 회전 속도도 달아준다.
이제 Box에 무게를 줄 예정이다. Sphere에 비해 엄청 무겁게 만들어 Sphere가 날아드는 충격에도 쉽게 넘어지지 않도록 해주겠다.
Box 또한 Copy to Points로 한 점에 붙여준다. Attribute Wrangle을 달아 Density 값을 높여준다.
Box의 무게가 증가함으로써 Sphere가 부딪혀도 크게 날아가지 않고 무게감있게 넘어지지 않는 것을 볼 수 있다.
마지막으로 Friction과 Bounce 값을 조절해보겠다.
Sphere에서 @friction과 @bounce 값을 조절한다. 이때 @friction을 0으로 두면, 마찰이 없어 공이 구르지 않고 쓸려나가고 있는 것을 볼 수 있다.
@friction 값을 0.5로 주면 자연스럽게 굴러가고 있는 것을 볼 수 있다.
@bounce 값이 0일 때는 Sphere가 Box에 부딪혀도 튕겨나오지 않는다.
@bounce 값을 올려줌에 따라 멀리 튕겨 나오는 것을 볼 수 있다.
'TWA Houdini1 > Rigidbody' 카테고리의 다른 글
TWA 후디니 1 RIGIDBODY_06 : Simulation 데이터 부르기 + 총알 모델 (0) | 2023.03.25 |
---|---|
TWA 후디니 1 RIGIDBODY_05 : 기본훈련 Domino Simulation (0) | 2023.03.25 |
TWA 후디니 1 RIGIDBODY_03 : RBD, Bullet Solver 그리고 RIGID BODY SOLVER (1) | 2023.03.21 |
TWA 후디니 1 RIGIDBODY_02 : PACK 훈련 & 나무플랭크 시스템 만들기 (0) | 2023.03.21 |
TWA 후디니 1 RIGIDBODY_01 : 리지드바디를 들어가며 & Pack 이해하기 (0) | 2023.03.20 |