TWA Houdini1/Rigidbody

TWA 후디니 1 RIGIDBODY_15_03 : 자동차 basic 리깅 + 자동화

yiss09 2023. 4. 23. 10:09

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

 

HOUDINI1_ RIGIDBODY

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

www.twahoudini.com

 

Rigidbody15_part3에서 배울 자동차 리깅은 빠르게 본인 것으로 만들면 만들수록 훨씬 효과적이고 강력한 무기가 될 것이다.

하나의 시스템으로 기본적인 Constraint 세팅, 리깅이 자동으로 잡힐 수 있게끔 작업을 해볼 예정이다.

오늘의 핵심은 우리가 만든 시스템이 자동차를 교체해도 올바르게 작동하는가이다.

 

목차

1. Wheel 세팅

2. Body 세팅

 

 


1. Wheel 세팅

 

제일 먼저 필요한 자동차 파일을 불러와주겠다.

이때 불러온 자동차들은 크기와 위치가 가지각색이다. Transform으로 위치와 사이즈를 동일하게 맞춰주겠다.

Move centroid to Origin으로 Object의 위치를 원점으로 이동시킬 수 있다.

 

이제 불러온 자료를 사용하게 편리하도록 정리해줄 필요가 있다.

그리고 최소한의 사전 작업으로 body와 wheel에 대한 Group을 만들어줄 필요가 있다. 그래야 앞으로 만들 시스템이 body와 wheel의 위치를 판단하고 Simulation에 필요한 뼈대 proxy를 만들어줄 것이다.

해당 작업을 Subnetwork 안에서 해주겠다.

일단 가장 먼저 불러온 파일에 뒤집힌 면이 있기에 Reverse node로 앞면이 바깥을 향하도록 뒤집어주겠다.

 

그 다음 Select mode에서 wheel 부분만을 떼어내어 준다. Delete Non Selected가 지정된 부분이 wheel 아닌 부분이 body가 되겠다.

이제 wheel에서 바퀴를 하나하나 분리해주는 작업을 하려한다.

이때 바퀴를 분리하는 순서에 규칙을 만들어주려 한다. 앞쪽 바퀴 먼저 분리해주고, 뒤쪽 바퀴로 넘어가겠다. 순서는 왼-오, 왼-오 이다.

 

Blast로 떼어내진 부분들에 대해서 Group을 만들어주려 한다.

순서대로 body, wa,wb,wc,wd로 이름을 지정해주겠다.

그 다음 Merge해주고 Attribute Delete로 필요하지 않은 정보를 모두 지워주도록 한다. P에 대한 정보는 반드시 남겨야 한다.

 

Normal에 대한 정보를 제거해주었기 때문에 다시 만들어줄 필요가 있다.

Normal node를 달아주면 Cusp Angle 값에 따라 보이는 느낌이 달라지는 것을 볼 수 있다. 값이 낮아지면 좀 더 평평한 느낌이 나고, 값이 올라가면 곡선을 그리는 듯한 느낌이 든다. 적당하게 평평한 느낌을 주도록 하겠다.

그리고 output에 연결해주겠다.

 

이제 Subnetwork 밖에서 원하는 파츠를 그룹별로 떼어내서 볼 수 있게 되었다.

다른 모델링 파일의 차량 또한 같은 방식으로 작업을 해준다.

 

기본적인 세팅이 준비가 되었다. 이제 어떤 자동차를 연결하여도 올바르게 Proxy가 만들어지게 세팅을 잡아보도록 하겠다.

먼저 Blast로 wa를 분리해 작업해보겠다. Bound를 두 개 생성해 아래에 연결해준다.

우리가 가진 원본자료를 high라고 했을 때, tube를 이용해 훨씬 간단한 형태의 proxy를 만들어주려 한다.

이때 tube에 필요한 정보는 radius와 height이다. 이 두 정보를 왼쪽 Bound에서 만들어주도록 하겠다.

tube가 만들어질 때 원점에 위치하게 된다. wheel의 중심 위치에 tube가 놓여야 proxy로써의 역할을 할 수 있을 것이다. 오른쪽 Bound에서는 center에 대한 vector 정보를 구해주도록 하겠다.

 

왼쪽 Bound에서 radius와 height 정보를 구해주기 위해서 Bound의 point number를 이용해주도록 하겠다.

Blast로 필요한 point를 떼어내준 다음 선으로 만들어주겠다.

Measure로 선의 길이를 측정해준 다음 길이를 저장할 Attributes의 이름을 height와 rad로 저장해준다.

Measure로 구한 rad는 지름의 길이가 되기 때문에 나중에 사용할 땐 반으로 나눈 값을 이용해줄 것이다.

 

오른쪽 Bound에서는 Bounding Type을 Sphere로 이용해주겠다. 그리고 Accurate Bounds로 정확하게 중심을 찾아주고 Add로 면을 제거하고 point만을 남겨주겠다.

이렇게 wa의 중심이 되는 위치 정보를 구해주었다.

 

이제 Tube를 생성해 방금 만들어준 정보들을 Tube의 파라미터에 넣어주려 한다.

그 전에 우리가 만들어둔 정보를 하나의 Attributes에 정리해주도록 하겠다.

Input1에 Center에 대한 point 정보가 들어가고, Input2에는 height, Input에는 rad 정보를 넣어준다.

prim function을 이용하여 height와 rad 정보를 point 정보로 가져온다.

 

Tube에 정보들을 넣어줄 차례이다.

End Caps로 열린 면을 닫아준 뒤, Tube의 방향을 바퀴와 동일하게 X Axis로 변경해주겠다.

그 다음 Copy to Points로 아까 얻어준 wa의 위치정보를 Tube에 붙여주겠다.

그리고 point function으로 Tube의 파라미터에 정보들을 불러오겠다. 이때 rad는 2를 나누어주어야 한다.

마지막으로 Column 값을 높여줌으로써 하나의 proxy 바퀴가 완성되었다.

다른 자동차에 연결해도 문제가 없는지 확인해본 뒤 문제가 없다면 다음 순서로 넘어가준다.

 

이제 우리가 만든 proxy가 Dop Network에서 작동하게 하기 위해서 Pack과 name 작업을 해주겠다.

그리고 이후에 Simulation에서 바퀴가 굴러가는 것을 구별하기 위해서 Tube에 색을 넣어주겠다.

면을 띄엄 띄엄 선택해준 뒤 Group해준다.

그 다음 해당 Group에만 Color를 넣어주겠다.

 

지금까지 만든 과정이 wb,wc,wd에도 적용이 되도록 해주어야 한다.

해당 시스템을 이용해줄 예정이기에 맨 위의 Blast:wa를 제외한 나머지를 Subnetwork로 만들어주겠다.

wb,wc,wd에도 proxy 시스템을 복사해 붙여준다.

그대로 사용하면 Simulation에서 작동이 제대로 되지 않는다. Subnetwork 내부에서 name의 정보를 변경해주겠다.

 

겸사겸사 바퀴마다 색을 다르게 줘보겠다.

 

 


2. Body 세팅

 

이제 body에 대해 proxy를 만들어주려 한다.

이때 Convex Hull을 이용해주면 body가 바퀴와 충돌하는 부분이 생겨 원하는 결과가 나오지 않을 것이다.

아예 전혀 다른 아이디어가 필요하다.

바퀴 사이에 놓일 판자를 만들어 그 판자가 전체 body를 담당하는 proxy가 되도록 해줄 것이다.

이러한 경우 proxy와 원본의 모양이 많이 달라지게 되는데 큰 문제는 없다.

자동차처럼 바퀴같은 구조물이 body 안쪽에 위치하는 경우에 유용하게 사용되는 방식이다.

body를 대변하는 가상의 물체는 굳이 판자가 아니더라도 다른 물체로 이용하여도 상관이 없다.

하지만 이 방식으로는 충돌 조건이 올바르게 구현되지 않는 문제가 있다. 이러한 문제는 다음 강의에서 손봐줄 예정이니, 오늘 강의에서는 기본적인 리깅과 Simulation에 집중해보도록 하겠다.

 

바퀴 사이에 판자를 만들기 위해서 body는 이용하지 않을 것이다.

대신 우리가 만든 바퀴에 대한 proxy 정보를 기준으로 만들어보겠다.

wheel에 대한 정보에 Add로 점들을 구해준다. 그 다음 네 개의 point에 대해 Bound를 해주겠다.

위아래 면이 닿아있는 상태로 상자가 만들어진 것을 볼 수 있다.

두께를 넣어주기 위해서 Bound의 Lower Padding과 Upper Padding의 y값을 올려준다.

 

그리고 지금 상태로 Bound를 이용해준다면 바퀴와 충돌하는 부분이 존재한다.

Transform으로 바퀴와 충돌하는 부분의 길이를 변경해주도록 하겠다.

완성된 body proxy 시스템이 잘 작동하는지 자동차를 변경해가며 확인해준다.

body proxy를 Simulation에서 사용하기 위해 Pack해주고 이름도 달아주겠다.

 

proxy 세팅이 된 wheel과 body 각각 Null로 이름을 지정해준 뒤 Constraint 세팅을 시작해보겠다.

지금부터 주어진 네 개의 Tube와 판자를 어떻게 연결하면 바퀴처럼 구르게 할 지에 집중하겠다.

이번에는 물체와 물체 사이에 경첩을 두는 것이 아니라, 판자의 꼭짓점에 경첩을 두도록 해보겠다.

그러기 위해선 판자의 각 꼭짓점의 중심을 구해주어야 한다. 이를 Bound의 Divisions를 이용해 구해주도록 하겠다. Division 된 정보는 원했던 느낌이 아니기에 다시 Bound 해준다.

 

여기서 우리는 Division된 Bound에서의 point number를 이용해줄 것이다.

Blast로 필요한 점들을 떼어내어준다.

그리고 각각의 꼭짓점에 대응하는 wheel 옆에 Blast로 떼어낸 점을 놓아준다.

 

Constraint 세팅에 필요한 모든 point를 가지고 있고, Dop Network에서 쓸 object도 모두 준비가 되었다.

앞으로는 Dop Network 세팅을 잡아가면서 진행해보도록 하겠다.

Object Merge로 object로 쓰일 proxy 정보들을 불러와준다.

Dop Network 안에서 결과를 보면 object가 Simulation에서의 중력의 영향을 잘 받는 것을 볼 수 있다.

 

이제 바퀴와 body를 Constraint 작업으로 연결해주려 한다.

이때 필요한 point들을 보면 이름 정보를 가지고 있지 않다.

Attribute Copy로 proxy에서의 @name 정보를 point들에 각각 알맞게 붙여넣어 주겠다. 

Constraint 세팅을 위해서 같은 위치에서 body에 대한 정보를 대체할 point도 만들어 준다.

두 point들을 선으로 만들어준 뒤 con_con과 con_set 세팅을 잡아주겠다.

Constraint의 position은 고정시켜주고 rotation의 x축에 대해서 회전하도록 세팅해준다.

그 다음 Measure로 길이를 측정해준 다음 Null로 Constraint라 저장해주겠다.

Dop Network 안에서는 Hard Constraint를 사용해주겠다.

결과를 보면 한쪽 바퀴가 판자에 잘 붙어있는 것을 볼 수 있다.

 

이제 위와 같은 세팅을 각각의 바퀴에 전부 해주려 한다.

이름을 세팅해주는 부분은 직접 세팅해준 뒤, 그 이후 부분부터 For-each Point를 이용하겠다.

결과를 보면 모든 경첩들이 모두 예쁘게 만들어진 것을 볼 수 있다.

object의 Initial State에 velocity.z 값에 변화를 주면 바퀴가 굴러가는 것을 확인할 수 있다.

 

Simulation이 잘 작동하는 것을 확인하였으니, 이 proxy가 원본 자료와 잘 치환이 되는지 확인해보도록 하겠다.

Transform Pieces를 이용하려면 proxy와 고화질 자료의 @name의 정보가 같아야 한다.

원본의 정보가 Pack 되어 있지 않으니 Pack해준 뒤 Attribute Copy로 @name에 대한 정보도 만들어주겠다.

body의 경우엔 이름에 대해서 직접 세팅해주도록 하겠다.

Object Merge로 원본의 정보를 불러와준 다음 Transform Pieces로 Simulation에서의 정보와 교체해주겠다.

 

다른 자동차로 변경하여도 시스템이 잘 작동하는 것을 볼 수 있다.

 

Simulation 안에서 Velocity 값을 원하는 느낌으로 변경해주겠다.

 

하지만 지금의 충돌 조건으로는 자동차가 물체에 충돌했을 때 문제가 발생하게 된다.

기둥에 차가 충돌하는 것을 보면 차체를 뚫고 내부의 판자와 충돌하는 것처럼 묘사되고 있다.

이러한 부분은 다음 강의에서 해결해주도록 하겠다.