본문 바로가기

Houdini/Houdini1_Rigidbody

RIGID BODY_15 리깅 시뮬레이션 BASIC - Ep15_Part02. 4족 로봇 + 리깅베이직


constraint 리깅 basic 단계에서는 각각의 조각별로 디테일하게 움직일 방향을 정해줘야하기 때문에 한땀한땀 위치를 정해주고, 잘 작동하는지 확인하는것이 중요하다.

 

복습 겸 지난시간 두번째 숙제 만들기

경첩 모양만 봐도 어느 축으로 회전할지 보이는듯 하다.


이제 로봇을 만들어보자.

 

기본적인 모델링부터 진행해보자.

몸통이 존재하고, 일단 하나의 다리를 제대로 세팅해주는 것이 중요하다.

다리 하나에 대한 constraint 시스템이 잘 만들어지고 나면, 그 이후에 다리를 네개로 늘려주고, 원하는 장면을 구현해보면 된다.

 

일단 각 위치에 해당하는 포인트를 만들어주자.

  1. 몸통이 놓일 원점 { 0, 0, 0 }
  2. 몸통과 다리를 연결하는 관절 { 1, 0 , 0 }
  3. 다리가 꺾이는 관절 { 2, 2, 0 }
  4. 발이 놓이는 위치 { 3, -1, 0 }

2번 포인트와 3번포인트, 3번 포인트와 4번 포인트를 연결해주고, 선으로 만들어준 다음 양 끝 길이를 살짝 조절해주고 두께를 추가해준다.

{ 3, -1, 0 }에 튜브를 하나 달아서 발로 사용해준다.


이제 다리 하나에 대해 constraint 세팅을 진행해보자.

 

constraint 세팅을 잡음에 있어 관절이 되는 부분들(위의 이미지의 포인트 위치)은 각각의 조각에 대한 이름을 가져야한다.

그렇기 때문에 노드 정리를 잘해두면 작업이 좀 더 용이하다.

그리고 거의 동일한 내용을 네번 반복하기 때문에(다리 개수) 반복할 때 쉽게 시스템을 이식할 수 있도록 앞으로 벌어질 일에 대해 예상을 하면서 작업을 진행하는 것이 좋다.

 

현재 만들어준 포인트와 조각들을 다 그룹으로 분리해줄 예정이고, 해체를 진행할 것이다.

각각의 조각에 대해 grouping을 하는데, group 이름은 각각

  • box는 body
  • 다리는 몸통쪽에서부터 p0, p1, 02
  • 관절은 몸통쪽에서부터 c0, c1, c2

이렇게 만들어준다.

 

위의 것은 group 이름이고, 실질적으로 각각이 가지게 될 이름(@name)은 다리쪽의 이름 뒤에 a, b, c, d를 붙여주기로 한다.

 

현재 작업에서 primitive는 두께감을 주기 위해 사용된 것이지 constraint를 위해 필요한 것은 아니다.

dop network에 잘 들어갈 수 있도록 세팅해보자.

s@name과 a_a_d 세팅도 필요하다.

 

신경써야할 부분은, 이후에 네개의 다리에 적용할 수 있도록 이름이 업데이트 된다는 점이다.

 

일단 body와 p0를 연결하는 관절 c0에 대해 constraint 세팅을 해보자.

position은 깨지지 말아야할 것이다. 그렇기 때문에 i@condof는 3이 된다.

rotation은 한 축(z축)으로만 움직이면 된다. 그렇기 때문에 i@condof는 2, v@condif은 {0, 0, 1}이 된다.

마지막 세번째는 회전에 대한 복원력을 위한 constraint이다. i@condof는 3으로 설정한다.

각각의 관절에 적용해줬다.


이제 다리 네개에 적용해주고 정리를 해줘야할 때이다.

 

현재 가지고 있는 것은 다리 하나이다.

이것이 궁극적으로 우리가 원하는 모양이다.
이런식으로 복제해주면, body 부분이 중복생성되어버린다.

body를 도려내고, 마찬가지로 다리 네개에 같은 작업을 네번 반복할 때 body 쪽 계산이 중복해서 일어나지 않도록 도려내서 빼준다.

이랬던 노드 구조를
이렇게 바꿔줬다. 마치 구조화된 시스템에 바디 하나를 툭 얹어놓은 느낌이랄까

이제 이 시스템은 바디를 제외한 다리쪽의 constraint 시스템이라고 할 수 있을 것이다.

이제 p0, p1, p2 노드 라인을 묶어서 그룹으로 정리해주고, constraint 세팅 또한 constraint 세팅끼리 그룹으로 묶어서 정리해주려고 한다.

 

각각 group(leg), group(cnt)로 묶어줬고, 다시 이 둘을 merge로 묶어줬다.

이제 이 시스템은 subnet으로 묶어줄 수 있다.

 

subnet으로 묶은 시스템은 이제 각 다리에 연결되어서 constraint 세팅을 진행한 결과를 도출해낼 것인데, 각각의 이름에 몇번째 다리인지 꼬리표를 하나 더 달아줘야한다.(그래야지 고유한 이름이 된다.)

잘 연결한것 같은데 결과가 이상하다.

바디와 다리가 연결이 불안정하다.

위처럼 연결이 끊어져보이는 이유로는, 꼬리표를 달 때 body에도 꼬리표가 달리게 되어서 그렇다.

그렇기 때문에, 꼬리표를 달 때, 식을 좀 더 구체화해서 @name이 body라면, 꼬리표를 붙이지 않도록 해줘야한다.

일단 다리 두개는 잘 연결된 듯 싶다.

이제 다리 네개를 다 연결해줬다.

결과는 꽝이다.

constraint를 만들어줄 때, v@condir을 { 0, 0, 1 }로 설정해줬기 때문에, 두개의 다리는 현재 회전이 일어나지 않고 있다.

축 방향을 수정해주자.

올바르게 축 방향이 설정된 것을 볼 수 있다.

제대로 나오는듯 하다.

ground plane을 꺼내서 그 위에 올려보자.

너무 다리가 흔들거려서 복원력을 더 높여줬다.(Stiffness 50)

무게를 조절해보자.

dop network 밖에서 f@mass 정보를 전달하면, 각각의 무게를 조절할 수 있을 듯 하다.

f@mass를 body는 0.1, 다리는 1로 설정하였다.

body가 가벼우니 더 잘 버틴다.(다이어트의 필요성.avi)
초기 속도 및 회전 속도를 올려줘도 상당히 안정적으로 착지하고 있다.

이제 sop network 를 추가해서 로봇에게 임의의 프레임에 위로 솟구치도록 속도를 추가해주는 세팅을 잡아보자.

80 프레임에 위로 솟구치도록 설정했다.


정리!

이 구조물을 만드는데 가장 신경써야했던 부분은 다리 하나를 '어떻게' 이쁘게 세팅을 잡아주느냐 이다.


다음에 있을 자동차 세팅이 매우 기대되는 밤이다.