본문 바로가기

Houdini/Houdini1_Rigidbody

RIGID BODY_15 리깅 시뮬레이션 BASIC - Ep15_Part01. 회전을 위한 Constraint(숙제1 업데이트 완! / 숙제2 업데이트 완!)


constraint를 만들어줄 때, 물체를 대변하는 두 점을 찾게 되고, 두 점은 각각의 물체를 대변하기 위해 이름을 가지게 된다.

만약 두 점의 이름이 아래와 같이 하나만 기입되어있다면?

이렇게 두개의 점을 가지고 constraint를 만들 경우, box 이름을 가지는 물체를 공간상에 '고정'한다는 의미로 사용된다.

 

 

현재 box는 hard constraint로 공중에 고정되어있다.

만약 soft constraint로 연결되어있다면 어떻게 될까?


현재 constraint type은 "all"이다. position과 rotation이 모두 고정된 상태인데, 이것을 각각 따로 잡아보기로 하자.

 

const_set2 노드는 type "position", name은 "cnt_pos" / const_set3 노드는 type "rotation", name은 "cnt_rot"을 사용중이다.

이 결과는 constraint type "all"과 다른 결과를 나타낼까?

결론은 같은 결과를 도출했다.

여러개의 constraint를 merge로 넣어줄 수 있다!!


우리가 현재 사용하는 constraint type은 all, position, rotation을 사용중이다.

보통 물체 사이에 하나의 constraint 연결을 사용했다.

 

서로 다른 이름을 가지는 constraint가 두개가 쓰일 수 있다.

이 말의 의미는, 앞으로는 물체 사이의 관계가 한쌍의 constraint가 아니라, 동시에 여러가지 constraint가 쓰일수도 있다는 것을 뜻한다.

 

일반적으로 constraint가 겹겹이 사용되는 이유는

1) constraint의 합성때문에 여러 관계를 동시에 써야할 순간들이 있다.

  • position, rotation도 세부적으로 네가지의 추가적인 분류가 존재한다.

2) 조건에 따라 쓰고자 하는 constraint가 바뀔 때, 여러 constraint를 겹겹이 준비해줘야한다.

  • 조건은 시간, 위치, 길이 등 다양하다.
    • ex) 조건이 시간일 경우, 40프레임 이전에는 hard constraint이다가 40프레임 이후부터는 soft constraint로 바뀔 수 있다.

Condof(Constrained Degrees Of Freedom) (종류, integer)

Condir(Constraint Direction) (방향, vector)

 

condir 방향으로 축 고정을 할 수 있다.

안움직이는것만이 고정이 아니다. 한뱡향으로 움직이는 것 또한 고정이다.

 

i@condof

  • 주어진 v@condir에 대해서 constraint type이 "position"일 때, 
    • 0 : v@condir 방향에 관계 없이 자유롭게 움직인다.
      • 이것은 엄밀히 말하면 포지션이 고정되었다고 보기는 어렵다.
      • 다만, i@condof 0이 가지는 의미는 물체가 어디로 움직이던 상관없으니, 마치 낚시줄을 걸어둔 것 처럼 연결관계에 대한 체크만 하겠다. 라는 의미이다.
        • 어떠한 복원력도 없지만, 연결관계만 계산하겠다.
    • 1 : v@condir 방향을 제외한 방향으로만 움직일 수 있다.
      • ex) v@condir 이 {0, 1, 0}이라면, 박스에 적용될 경우, y축 방향을 제외하고, 주어진 방향의 수직인 방향으로만 움직임이 가능하게 된다.
    • 2 : v@condir 방향으로만 움직일 수 있다.
      • ex) v@condir 이 {0, 1, 0}이라면, 박스에 적용될 경우, y축 방향으로 상하운동만 가능하게 된다.
    • 3 : 움직임이 완전히 고정된다.(v@condir과 상관없다.)
  • 기존에 사용했던 constraint type이 position이라는 것은, i@condof 가 3일 때의 결과와 같다.
    • i@condof 세팅을 따로 잡지 않는다면, i@condof는 3이다.
  • i@condof의 단계가 낮아지면 낮아질수록, 움직일 수 있는 방향의 수가 하나씩 늘어난다.(왠지 세 축에 대해 락 걸린 것이 하나하나 해제되는 느낌이다.)

  • 주어진 v@condir에 대해서 constraint type이 "rotation"일 때,
    • 0 : v@condir 방향에 관계 없이 자유롭게 회전한다.
      •  
    • 1 : v@condir 방향을 제외한 방향으로만 회전한다.
      • ex) v@condir 이 {0, 1, 0}이라면, 박스에 적용될 경우, y축 방향을 제외하고, 주어진 방향의 수직인 방향으로만 움직임이 가능하게 된다.
    • 2 : v@condir 을 축으로 회전한다.
      • ex) v@condir 이 {0, 1, 0}이라면, 박스에 적용될 경우, y축 방향으로 상하운동만 가능하게 된다.
    • 3 : 회전이 완전히 고정된다.(v@condir과 상관없다.)
  • 기존에 사용했던 constraint type이 rotation이라는 것은, i@condof 가 3일 때의 결과와 같다.
    • i@condof 세팅을 따로 잡지 않는다면, i@condof는 3이다.

i@condof 와 v@condir 정보는 point로 주는 것이 맞다.

  • 물체를 대변하는 각각의 포인트에 정보를 주는것이 맞다.

 

참고로, 어느 한쪽에만 i@condof  세팅을 진행하면, merge를 했을 때, 우리가 원하는 결과를 얻기 어려울수도 있다.

position constraint에 대해 @condof 값이 3일 경우, @condof를 적용하지 않은것처럼 포지션이 고정이 된다. 그래서 position 쪽의 con_con1 노드를 bypass해주면, 우리가 예상하는 결과는 포지션이 고정된 box를 기대하지만, 전혀 다른 결과를 도출한다.

이 이유로는 geometry spreadsheet를 확인해보면 알 수 있다.

@condof 값을 적어주지 않았는데, merge 노드가 진행되면서 한쪽에만 있는 @condof 정보를 0으로 채워넣게 된다.

그럼 결국, position constraint에 적용되는 @condof는 0이고, 이 말은 곧 position 고정없이 자유롭게 움직인다는 것이 된다.

 

이것을 피하기 위해 constraint를 아예 따로 만들어보자.

constraint가 두개이기 때문에, constraint network도 두개여야한다.

position / rotation을 각각 따로 잡아준 constraint가 잘 작동하고 있다.

하나의 관절에 대해 position constraint 따로, rotation constraint 따로 이런 식으로 작업한 적은 잘 없다고 한다.

일반적으로, 하나의 관절에 대해 position에 condof 세팅이 들어간다면, rotation에도 condof 세팅을 넣어주는 것이 좋고, 마찬가지로, rotation에 condof 세팅이 필요하다면, position에도 condof 세팅을 잡아주는 것이 좋다.


constraint 합성을 진행해보자.

이번에 해볼 것은 복원력을 가지고 z축 방향으로 회전하는 것이다.

복원력을 위한 rotation constraint를 하나 더 잡는다.
constraint network를 추가해준다.

추가적인 constraint를 달아줬더니, constraint들이 합성이 되면서 위의 영상과 같은 효과를 만들어내는 것을 불 수 있다.

 


사실, constraint network가 이렇게 또 여러개 달리는 것이 썩 좋은 모양은 아니다.

하나의 관절에 대해 작업할 때는 하나의 constraint network에 constraint를 한번에 정리해주는 것이 훨씬 좋다. 

 

위의 작업내용을 con-con을 가지고 하나의 constraint network를 사용하는 형식으로 만들어보자.

초록색의 두 constraint 노드는 box가 회전할 수 있는 방향에 대해 세팅을 진행해준 것이었고, 붉은색의 노드는 복원력의 역할을 담당하고 있다.


이제 position에 대해 @condof 세팅을 활용해보자.

 

상하로 움직이는 용수철 저울과 같은 움직임을 만들어볼 것이다.

 

일단 필요한 조건을 적어보자.

1) 복원력과 관계없이 움직임에 대한 con-con 세팅이 position(const_pos)과 rotation(const_rot)에 필요하다.

  • v@condir은 {0, 1, 0} 으로
    • cosnt_pos 의 i@condof는 2(@condir 방향으로만 움직이는)이다.
    • const_rot의 i@condof는 3(회전은 고정)일 것이다.(v@condir은 의미가 없다.)
  • 이렇게만 세팅을 진행할 경우, 복원력이 따로 존재하지 않기 때문에, box는 아래로 쭈욱 떨어져내릴 뿐이다.

2) powerpos라는 이름의 복원력을 만들어준다.

  • i@condof 값은 3이 된다. (위치에 대해서 고정하겠다는 의미)
  • 고정을 해줘야지 복원력이 생긴다.


숙제는 두개!

회전문 만들기

복원력이 가미된 물체 세팅하기


회전문

축을 고정시키는 것도 이해를 했고,

문은 안부러지도록 glue constraint(strength -1)로 적용했다.

복원력이 컸기 때문에 계속 봉이 고정이 제대로 안된것일까... 암튼 복원력을 최대한 줄여줬더니 일단 큰 이탈 없이 돌아는 가지만, 약간의 아쉬움 및 불안한 포인트가 존재... 저걸 더 딴딴하게 잘 고정시키면서 돌아가게 하려면 어찌해야할까... 하는 고민이 생기는 밤(23.04.18 완료)


복원력이 없는 판자떼기 체인

복원력이 있는 판자떼기 체인


리깅이라... 관심이 있던 또 다른 재미난 녀석을 배울 수 있는 때가 왔다 :)