이 부분은 빠르게 습득해 보자.
하나의 시스템으로 기본적인 constraint 세팅 / 리깅이 자동으로 잡힐 수 있게끔 작업을 해보자.
- 물론 디테일한 부분에 있어서는 차종별로 세팅해줘야 하는 부분도 존재할 것이다. 그럼에도 최소한의 리깅은 시스템 안에서 자동으로 잡히게끔 만들어볼 예정이다.
가장 먼저 할 일은, 자동차의 스케일 조정과 각 모델들의 방향을 맞추는 작업이다.
아무리 constraint를 시스템화하더라도 시스템에 들어갈 규칙은 사용자가 직접 잡아줘야 할 필요가 있다.
작업의 순서
- 자료의 정리
- PROXY 뼈대 만들기
- PROXY로 Dop network 세팅 잡기
- Constraint 세팅 잡기
최소한의 사전작업으로는 바디와 바퀴에 대한 그룹을 미리 만들어줘야 한다.
그래야지 만들어질 시스템이 어디가 바퀴이고 어디가 바디인지 판단하고 자동으로 필요한 proxy 뼈대를 만들어주게 된다.
바디와 각각의 바퀴를 그룹으로 만들어줬다.
현재 우리는 간단한 proxy 버전의 데이터를 만들려고 하는 것이다.
바퀴를 예로 든다면,
- 바퀴의 반지름(radius) 정보가 필요하고, 바퀴의 폭(height) 정보가 필요하다.
- bound 노드를 활용해서 구해준다.
- 그리고 proxy 데이터가 만들어졌다고 해서 원점에 있다면 소용이 없다. 바퀴의 중심(center : vector)에 대한 정보를 알고, 그곳에 proxy 데이터를 붙여줘야 한다.
- 이것 또한 bound 노드를 활용해서 구해준다.
- 총 두 개의 bound 노드가 필요하다.
bound1에서 box 형태로 bounding box를 구해주고, point를 두 개씩 떼어서 길이를 측정한 뒤, 그 값을 height, radius로 사용하였다.
dop network에서 사용할 수 있도록, packing 및 @name을 만들어준다.
이렇게 바퀴 하나에 대해 만들어준 노드는 sub network로 묶어주고, 각각의 바퀴에 대해 적용해 준다.
다음 단계로 넘어가기 전에 잠깐 바퀴 하나만 고화질 버전으로 치환해 보자.
고화질 버전은 현재 packing 된 상태가 아니기 때문에 packing해준 뒤, @name을 만들어줬다.
바디도 Proxy 버전으로 치환이 필요하다.
일단 가장 먼저 생각나는 것은 convex hull로 덮어주는 것인데, 용량에서는 큰 차이를 보이지만, 우리가 만들어준 proxy 바퀴랑 겹치는 부분이 발생해 버린다.
proxy는 원본 자체로 충돌의 조건이 될 예정인데, 이런 식으로 겹치게 proxy를 생성하게 될 경우, 바퀴가 제대로 회전하지 않고, constraint가 망가질 수도 있다.
이것 말고 전혀 다른 아이디어가 필요하다.
원본 바디를 바퀴 사이의 박스로 proxy 데이터를 치환하는 것이다.
바퀴들 안쪽의 저 박스가 원본 바디에 대한 proxy 바디이다.
이와 같이 원본과 proxy가 아예 다르게 생기는 경우도 있다. 어떠한 경우에는 이런 경우가 더 좋기도 하다.
자동차처럼 바퀴 같은 구조물들이 바디 안쪽에 있는 경우 이런 식의 방법이 유용하다.
원본과는 다른 가상의 물체, 그것을 원본 바디를 대변하는 proxy이다라고 정의하는 아이디어이다.
- 위의 이미지와 같은 박스가 맘에 들지 않는다면, 작은 sphere 혹은 작은 box를 하나 가져다 놓고 이것이 원본 바디를 대변하는 proxy이다라고 할 수도 있다.
- 중요한 것은, Transform pieces로 치환만 잘 이뤄지면 되는 것이다.
- 대신에 이 방식으로는 proxy를 가지고 충돌의 조건이 올바르게 구해지지는 않는다.
- 이 방식으로는 기본적인 리깅과 시뮬레이션을 마치고 난 뒤 충돌조건에 대한 부분을 다시 만들어줄 계획이다.
이제 할 일은, 바퀴를 기준으로 적당한 사이즈의 박스를 만들어주는 것이다.
바퀴를 add로 primitive를 날려버리면, 바퀴의 중심점에 대한 위치정보만 남게 된다.
이 정보를 바탕으로 bound 노드를 적용해 준다.
처음 bound를 적용하면 무언가 겹쳐있는 면이 만들어진다.
엄연히 포인트 8개, primitive 6개를 가진 상자이다. 두께가 없어서 겹쳐있을 뿐이다.
bound parameter의 Lower / Upper Padding을 사용해서 두께를 줄 수 있다.
bound만 적용하게 되면, 바퀴와 겹치는 부분이 존재하는데, 이렇게 만들게 되면 박스와 바퀴 또한 충돌이 발생하기 때문에 proxy로 사용하기가 애매한 부분이 있다. 그래서 transform 노드로 적절하게 사이즈를 조절해 준다.
proxy 데이터가 만들어졌다.
이제 constraint 세팅을 해보자.
지금 집중해야 할 것은, 주어진 네 개의 tube와 하나의 박스를 어떻게 연결해 줘야 바퀴처럼 구르게 할 것인가?이다.
각각의 바퀴를 대변하는 포인트의 위치를 잡아야 하는데, 튜브의 중앙에 오게 할 수도 있고, 튜브와 박스 사이에 오게 할 수도 있지만, 지금은 각각의 튜브가 마주 대하는 박스의 모서리에 바퀴와 박스를 대변할 포인트가 오도록 해보자.
box의 bound 노드에서 division parameter를 활성화해 주면 bounding box가 여러 조각으로 나뉘는 것을 볼 수 있다.
중간 높이의 point를 blast로 떼어낸 뒤, 각각의 바퀴 위치와 가까운 포인트로 다시 떼어내 준다.
이제 dop network에서 사용할 오브젝트와 포인트를 다 구해줬다.
dop network 세팅을 진행해 보자.
기본적으로 시뮬레이션 세팅 후 불러온 결과이다. 당연하다. 현재는 아무런 cosntraint 세팅을 하지 않았다.
위에서 만들어줬던 바퀴를 대변할 포인트에 현재 @name 정보가 없다. attribute copy로 각각 @name을 가져와준다.
그리고 constraint 세팅을 위해 같은 위치에 바디를 대변하는 포인트 또한 필요하기 때문에, null로 분기를 하나 만들고 attribute wrangle로 @name을 body로 만들어줘서 포인트를 하나 더 생성한다.
각각의 바퀴에 하나는 위치를 고정하는 constraint를 만들어줘야 하고, 하나는 회전축을 고정해 주는 constraint를 만들어줘야 한다.
이 세팅을 각각의 바퀴를 대변하는 포인트에 대해 해줘야 하는데, for each point를 사용하여 작업할 수 있다.
이제 proxy 데이터가 고화질 데이터로 잘 치환되는가를 확인해야 한다.
object merge로 시뮬레이션 데이터를 불러오고, 고화질 데이터는 packing 및 @name을 달아준 뒤, Transform pieces 노드를 사용해서 치환한다.
바퀴와 바디에 대해서 규칙을 가지고 분류만 잘해준다면, 바로 constraint 시스템과 함께 시뮬레이션을 돌려볼 수 있게 되었다.
현재의 시스템의 결정적인 문제는 충돌조건이 올바르게 준비되지 않았다는 점이다.
이 부분은 다음시간에 잡아보기로 한다.
이건 꼭 잘 익혀서 내 것으로 기필코 만들어야겠다는 생각이 드는 시스템이다.
내친김에 예전에 그룹 연습할 때 작업한 고화질 버전 자동차도 적용해 보았다.
'Houdini > Houdini1_Rigidbody' 카테고리의 다른 글
RIGID BODY_16 CONSTRAINT의 변형 (1) | 2023.04.18 |
---|---|
RIGID BODY_15 리깅 시뮬레이션 BASIC - Ep15_Part04. 자동차 서스펜션 시스템 (1) | 2023.04.14 |
RIGID BODY_15 리깅 시뮬레이션 BASIC - Ep15_Part02. 4족 로봇 + 리깅베이직 (1) | 2023.04.12 |
RIGID BODY_15 리깅 시뮬레이션 BASIC - Ep15_Part01. 회전을 위한 Constraint(숙제1 업데이트 완! / 숙제2 업데이트 완!) (2) | 2023.04.11 |
RIGID BODY_14 접한면에 자동으로 컨스트레인트 구하기 - Ep14_Part03. Constraint System(자동화+RnD) (1) | 2023.04.10 |