https://www.twahoudini.com/course/rigidbody1
HOUDINI1_ RIGIDBODY
3️⃣ 출동 SIMULATION 기초 이론부터 심화된 내용을 공부합니다. 또한 자동차를 이용한 리깅 시뮬레이션 BASIC을 훈련합니다.
www.twahoudini.com
지난 시간에 자동차 베이직 리깅을 완성했다. 시스템으로써 만들었기에 wheel과 body에 대한 그룹만 지정해준다면, 바퀴 4개짜리 물체에 대해서는 쉽게 리깅할 수 있었다. 그리고 Simulation도 바로 작동이 되었다.
하지만 충돌 조건이 없는 상태로 마무리가 되었었다.
Rigidbody15_part4에서는 올바른 충돌 조건을 만들기위한 작업을 해볼 예정이다.
충돌 조건이 잘 만들어졌다면 서스펜션 시스템도 만들어볼 것이다.
목차
1. 이론 설명
2. 충돌 조건 만들기
3. 서스펜션
4. 드리프트
1. 이론 설명
먼저 충돌 조건을 어떻게 만들지에 대해 아이디어를 정리하고 가겠다.
지금까지 만든 시스템은 wheel과 body에 대한 내용이었다. 그리고 proxy body는 Transform Pieces로 realy body와 교환해줄 수 있었다. 이 상태에서의 우리가 이용 가능한 충돌 조건은 파란색 영역까지이다. 그렇기에 몸체를 뚫고 바퀴에 충돌하는 것처럼 묘사될 것이다.
그래서 실제 body에 맞게 충돌 조건을 더 만들어주려 한다.
바퀴와 충돌하지 않은 상태의 충돌 조건을 만들기위해서 body를 가로 세로로 쪼개주도록 하겠다.
각각의 조각이 나뉜 상태에서 바퀴의 간섭이 있는 조각들은 붉은색, 간섭이 없으면서 실제 body의 윤곽을 가질 수 있는 조각들은 파란색 표시를 해주었다.
그 다음 각각의 조각들을 Packing해서 이름을 지어줄 예정이다.
바퀴에 영향을 주지 않는 조각들만 남기고 모두 지워주고, Body proxy에 영향을 줄 수 있는 조각도 지워줄 것이다.
이때 남은 조각들을 각각 Glue Constraint로 엮어줄 예정이다.
그리고 Glue Constraint에 의한 연결은 충돌이 발생하여도 부서지지 않게 만들어주려 한다.
cap끼리 연결된 상태에서 바퀴 시스템이 동시에 Dop Network 안으로 들어간다면 둘이 따로 움직일 것이기에 둘 사이에도 연결 관계를 만들어줄 것이다.
이렇게 cap이라는 이름으로 만들어진 조각들이 충돌의 조건으로 쓰일 것이다.
이때 이 cap 조각들이 Simulation에서는 쓰이지만 실제 출력에서는 쓰이지 않도록 후에 치환해주도록 하겠다.
2. 충돌 조건 만들기
Blast:body에서부터 작업을 시작하겠다.
body로 쓰일 충돌 조건을 만들기 위해서 바퀴 시스템에 겹치지 않도록 조각을 내 줄 예정이다.
지금까지는 물체를 조각내기 위해서 Voronoi Fracture를 사용했었다. 오늘은 새롭게 Boolean Fracture를 사용해보려 한다.
일단은 여러개로 나뉜 body를 하나의 Polygon으로 변형을 시켜줄 필요가 있다. Remesh Grid를 이용해주겠다.
이제 바로 Boolean Fracture를 사용해보려 한다.
Grid를 생성해 rows와 columns를 2x2로 맞춰준 다음 Boolean Fracture의 Input2에 넣어주겠다.
Exploded View로 보면, Grid가 놓인 부분을 기점으로 반으로 갈라진 body를 볼 수 있다.
Grid를 이용해 반복 작업으로 원하는 느낌으로 body를 조각내어 주겠다.
각도를 틀어 사이드미러도 조각내어 준다.
그 다음 Assemble을 이용해 조각별로 Pack해주겠다.
이 상태에서 Select mode를 이용해 바퀴와 충돌한 부분을 모두 제거해주겠다.
그리고 추가적으로 본넷과 앞 유리가 겹치는 부분의 충돌 조건도 혹시 몰라 제거해주겠다.
지금의 조각들은 오로지 Simulation에서만 쓰인다. 그래서 용량을 줄여 Simulation 시간을 절약해주고자 한다.
For-each Primitives를 통해 각각의 조각별로 용량을 줄여주는 작업을 해주겠다.
Unpack - Convex Hull - Poly Reduce - Pack 과정을 거쳐 용량이 크게 줄어들게 된다.
이때 Poly Reduce를 이용하면 원하는 퍼센테이지만큼 용량을 줄여줄 수 있게 된다.
그 다음 Dop Network 안에서 잘 작동하는지 확인하기 위해서 name을 정해주겠다.
새롭게 Dop Network를 만들어 Simulation을 돌려보면 중력의 작용을 받아 떨어지는 조각들을 볼 수 있다.
proxy를 만들어주었으니 이제 Constrant 세팅을 만들어줄 차례이다.
조각별로 점을 얻기 위해서 Add로 면을 날리고 위치 정보만을 남겨주도록 하겠다.
이 점들을 각각 엮어서 선으로 만들어주려 한다. 하지만 이렇게되면 다루어내야 할 선이 너무 많아지게 된다.
그래서 새롭게 Connect Adjacent Pieces node를 사용해주겠다.
point에 대해서 작업해줄 것이기에 Connection Type을 Adjacent Points로 변경해준다.
Connect Adjacent Pieces는 가까운 점들을 선으로 연결해주는 기능을 한다.
이때 Search Radius를 이용해 한계 반경을 조절해줄 수 있다. 만약 Search Radius가 0.3이라면 Connect Adjacent Pieces로 만들어진 선의 최대 길이가 0.6을 넘지 못할 것이다.
Max Search Points는 반경 안에 만들어줄 선의 갯수를 뜻한다.
이렇게 얻어준 길이들의 정보를 Length Attributes를 체크해 정보로써 저장해줄 수 있다.
Connect Adjacent Pieces로 점들을 연결해주었다면, 이제 직접 필요없는 선들을 Select mode에서 지워주는 작업을 해주겠다.
지금까지는 Constraint 세팅을 잡을 때 기왕이면 primitive 사이즈를 줄여서 두 point를 한 곳에 모아주는 과정을 했었다.
그런데 지금은 구조물같이 짜여진 선들이 아예 단단히 고정이될 Constraint이기 때문에 그대로 두고 Constraint 세팅을 잡아보도록 하겠다.
@restlength는 Connect Adjacent Pieces에서 구해주었으니 Constraint type과 name만 정해주면 된다. Type은 all로 해주겠다.
Dop Network 안에서 방금 만들어준 Constraint를 불러와 Glue Constraint를 연결해보겠다.
Strength가 낮은 상태에서 Simulation을 주면 cap이 바닥에 충돌하면서 부서지는 것을 볼 수 있다.
어떠한 강한 충돌에도 부서지지 않게 하기 위해서는 Strength 값에 -1을 주도록 한다.
그리고 비교를 위해서 Hard Constraint를 써보면 충돌이 가해졌을 때 오차가 발생하는 부분이 보인다.
우리는 cap이 아예 고정된 상태로 모양이 바뀌는 것을 원치 않기 때문에 Glue Constraint를 쓰도록 하겠다.
이제 원래의 Dop Network에 proxy_cap과 con_cap의 내용을 추가해도록 하겠다.
Dop Network 안에서도 Glue Constraint를 추가해주겠다.
결과를 보면 Cap과 body가 고정되어있지 않기 때문에 따로 움직이는 모습이 보인다.
바퀴가 cap의 간섭을 받지 않게 하기 위해서 cap과 body를 고정시키는 작업을 해주겠다.
먼저 필요한 조각을 얻기 위해서 Cap의 윗부분을 따로 떼어내어준다.
그 다음 Add로 면을 제거하고 점만을 남긴 뒤 두 점을 연결해 선으로 만들어준다.
constraint type은 all로 해주고 name은 con_cap에서의 constraint name과 동일하게 해주겠다.
만들어진 새로운 Constraint를 원래의 con_cap과 Merge하여 하나의 정보로 만들어주겠다.
Simulation 결과를 보면 body와 cap이 잘 고정된 것을 볼 수 있다.
3. 서스펜션
이제 드디어 서스펜션을 만들어줄 차례이다.
실제 자동차의 서스펜션은 바퀴 안쪽에 위치하고 그 위에 사람이 탑승하는 차체가 존재한다.
우리는 proxy_body와 같은 사이즈의 Box를 서스펜션 스프링 위에 올려줄 것이다.
그리고 스프링으로 묘사된 서스펜션은 Soft Constraint Relationship으로 쓰일 것이다. proxy_body와 그 위에 새롭게 만들어진 Box 사이의 Constraint로써 쓰일 것이다.
서스펜션이 생기게 되면서 앞서 만들어둔 충돌 조건인 Cap이 붙는 위치도 proxy_body에서 그 위의 Box로 바뀌게될 것이다.
proxy_body가 만들어진 Bound에 Attribute Wrangle로 정보를 따로 빼어 y축으로 그 높이를 높여주겠다.
이 Box를 Pack해준 뒤 name을 붙여준다면, 필요한 proxy_sus가 완성된다.
그 다음은 둘 사이의 Constraint 세팅을 만들어주어야 한다.
아래쪽 Box의 윗면에서의 4개의 points와 윗쪽 Box의 아랫면에서의 4개의 points를 Blast로 떼어내어준다. 남은 면은 Add로 제거해준다.
두 points를 각각 위 아래 점끼리 연결해 선으로 만들어주기 위해서 위아래 각각 id를 만들어준다.
By Attributes에서 id를 이용해 의도한 대로 위아래 점을 연결해 선으로 만들어준다.
Constraint type은 all로 해주고 name을 consus라 해주겠다. Measure로 길이를 정해준다.
서스펜션을 만들어주면서 또 바꿔줄 부분이 하나 있다.
원래 cap을 고정하기 위해서 proxy_body와 연결되었던 부분을 proxy_sus와 연결되도록 변경해주겠다.
Constraint에 consus 내용도 추가해준다.
Dop Network에 Bullet Soft Constraint Relationship을 추가한 뒤 결과를 보면 서스펜션이 들어간 것을 볼 수 있다.
하지만 cap이 뒤로 밀려나 바퀴의 회전에 영향을 주는 것도 관찰된다.
이는 proxy_body와 proxy_sus간의 Constraint가 앞 뒤로 움직이기 때문에 발생하는 문제이다.
이를 해결하기 위해서 두 물체간의 Constraint의 경첩의 위치를 Primitive Properties로 변경해주겠다.
Simulation 결과를 보면, 원했던 느낌의 서스펜션이 구현된 것을 볼 수 있다.
이제 Transform Pieces로 Simulation의 결과를 원본과 교환해주는 작업을 가지려한다.
지난 시간에 해두었던 Transfrom Pieces에서는 차체가 proxy_body와 교체되는 작업을 가졌기 때문에 수정해줄 필요가 있다.
차체가 proxy_sus와 치환이 될 수 있도록 변경해보겠다.
Blast로 body와 sus에 대한 내용을 Blast로 떼어내어준다.
다시 sus에 대한 내용만을 떼어낸 뒤 원본에서의 body와 치환해줄 것이기에 sus라는 이름을 body로 변경해준다.
그 다음 sus와 body를 제외했던 부분과 다시 Merge해준다음 Input2에 넣어준다.
결과를 보면 예쁘게 치환된 것을 확인할 수 있다.
이때 서스펜션이 과하다고 느껴진다면 Soft Constraint Relationship의 복원력을 높여주도록 하자.
충돌할 물체를 만들어 충돌이 잘 되는지 확인해보겠다.
이전과는 달리 차체에서 충돌이 일어나는 것처럼 묘사되는 것을 볼 수 있다.
4. 드리프트
마지막으로 드리프트에 관해 이야기해보려 한다.
자동차의 작동방식은 전륜구동과 후륜구동으로 나뉜다. 일반적으로 후륜구동 자동차가 드리프트를 발생시키고 통제하는데에 용이하다.
이때 우리는 드리프트가 발생될 때의 타이어의 마찰력에 집중해보려 한다.
Simulation에서 자동차가 옆으로 미끄러질 때 앞바퀴와 뒷바퀴의 마찰력이 다르다면 어떻게 될까?
빙글빙글 도는 것처럼 묘사가 될 것이다.
만약 차체 자체가 10만큼의 힘으로 미끄러지고 있다면 가정하면, 이때 앞바퀴는 마찰력이 2 뒷바퀴는 마찰력이 1이라고 가정해보겠다.
그렇게되면 앞바퀴는 8만큼, 뒷바퀴는 9만큼 이동하게 될 것이다. 이에 바라보는 방향이 틀어지게 될 것이다.
이를 Geometry 단계에서 작업해주려 한다.
f@friction에 관한 Attribute Wrangle을 만들어 바퀴에 각각 붙여주겠다.
앞바퀴와 뒷바퀴의 마찰력을 다르게 주고 결과를 보겠다.
공중에서 착지하여 접지력을 찾으려 할때 마찰력에 의해서 방향이 틀리는 것을 볼 수 있다.
오늘은 자동차의 마찰값에만 차이를 줘보았다.
그런데 오늘 @friction에 대해서 작업해주었던 부분에서 여러작업을 할 수 있다.
aad 세팅, Initial Value, Physical 등의 정보를 한번에 통제할 수 있을 것이다.
어떤 자동차의 경우에는 cap의 무게를 줄여주어야 할 것이고, 또 어떤 경우에는 바퀴가 땅과 충돌하는 느낌을 바꾸기 위해서 Bounce 값에 차이를 줄 수 있어야 할 것이다.
'TWA Houdini1 > Rigidbody' 카테고리의 다른 글
TWA 후디니 1 RIGIDBODY_17 : mixamo 캐릭터로 충돌조건 만들기 (1) | 2023.04.26 |
---|---|
TWA 후디니 1 RIGIDBODY_16_01 : Constraint 데이터 부르기 (Vis Data 활용) (0) | 2023.04.23 |
TWA 후디니 1 RIGIDBODY_15_03 : 자동차 basic 리깅 + 자동화 (0) | 2023.04.23 |
TWA 후디니 1 RIGIDBODY_15_02 : 4족 로봇 + 리깅베이직 (0) | 2023.04.22 |
TWA 후디니 1 RIGIDBODY_15_01 : 회전을 위한 Constraint (0) | 2023.04.20 |