본문 바로가기

Houdini/Houdini1_Rigidbody

RIGID BODY_16 CONSTRAINT의 변형


Ep16_Part01. Constraint 데이터 부르기 (Vis Data 활용)


  1. Constraint 정보 부르기
    1. Object merge로 정보 빼오기 & Constraint 저장위치 변경
    2. Dop network 밖에서 Constraint 시각화하기
  2. Constraint의 변형 & 조건 만들기 연습
    1. 시간을 Constraint 변형의 조건으로 쓰기
    2. 위치를 Constraint 변형의 조건으로 쓰기
  3. Constraint 종류에 따른 활용가능한 info(Attributes)
    1. Hard Constraint Relationship, Soft Constraint Relationship
    2. Glue Constraint Relationship
    3. 실습 : 활용 가능한 정보를 Constraint 변형의 조건으로 쓰기

이와 같은 세팅을 만들어준다.


Constraint를 Dop network 밖으로 어떻게 불러낼 수 있을까?

 

Dop network 안에서는 Constraint를 눈으로 보면서 작업이 가능하다.

하지만 Geometry 단계에서는 현재는 연결관계를 볼 수가 없다.

 

Geometry 단계로 불러오는 방식은 Object merge로 그릇에 담긴 물체를 불러오는 것과 방식이 같다.

 

constraint에 대한 정보는 Geometry spreadsheet의 Relationships에 저장되어있다.

multisolver3_rigidbodysolver1...

  • 현재 사용하고 있는 rigidbodysolver1를 의미한다.

merge1 / merge2

  • 현재 세팅 중 rigidbody solver에 연결된 merge1, merge2를 의미한다.
  • 'rigidbody solver에 의해서 충돌할 관계가 있다.' 라고 생각하면 된다.

constraintnetwork1

  • box의 연결관계를 정의내려주는 노드

이름을 좀 더 직관적으로 바꿔줬다.

그렇다면, cnt 까지의 주소를 적는다면 어떻게 적을 수 있을까?

  • /obj/a01/sim:Relationships/cnt

그 아래로 내려가다보면, constraintnetwork 안의 Geometry 정보가 우리가 사용하게 될 정보이다.

Geometry 까지의 주소를 적어보자.

  • /obj/a01/sim:Relationships/cnt/constraintnetwork/Geometry

 

Geometry 단계에서 object merge를 사용해서 불러와보자.

생각한 것처럼 꺾이질 않는다.

포인트 정보를 봐도 시간의 흐름에 따라 변화가 발생하지 않는다.

변하고 있는 것은 primitive 정보이다.

 

constraint의 조작은 친절하지 않다.

dop network 안에서는 실질적인 연결관계를 보면서 작업하는 것은 고맙지만, geometry 단계에서 보고 있는 진짜 정보, constraint 정보 자체는 위의 이미지처럼 초기 위치를 기준으로 위치가 고정되어 있고, 부가적으로 유용하다싶은 다른 값들만 주어지고 있다.

 

이번에는 dop network 안에서 보고있는 visualization된 정보를 Geometry 단계에서 불러와보도록 하자.

  • /obj/a01/sim:Relationships/cnt/constraintnetwork/Visualization

 

현재 constraint가 저장된 위치는 Relationships 아래에 저장되어 있다.

이것은 좀 불편한 상황이 있다.

  • 식도 길고
  • constraint가 어느 물체에 귀속된 연결인지 구분짓는것이 어려운 순간이 존재한다.
    • 특히나 물체가 많으면 많을수록 constraint를 각각 케어하는것이 어렵다.

 

그래서, 본인이 해당되는 그릇의 아래로 constraint를 저장할 위치를 바꿔줄 수 있다.

방법은

  1. dop network의 constraint network 노드로 간다.
  2. 노드의 마지막 탭, Relationship으로 가서 Attach Internal Constraints to Object를 체크해주면 된다.

체크를 해주면... Relationships 아래의 constraintnetwork(cnt) 항목이 사라진걸 확인할 수 있다.

대신에 물체(box) 아래 항목을 살펴보면 ConstraintGeometry 라는 항목이 생긴 것을 확인할 수 있다.

이곳의 주소를 기입해야한다면 다음과 같다.

  • /obj/a01/sim:box/ConstraintGeometry

그리고 물체 아래로 옮겨진 constraint에 대한 visualization을 확인하고 싶다면, object merge로 불러올 주소는 다음과 같다.

  • /obj/a01/sim:box/ConstraintGeometry/Visualization

 

위와같이 물체의 아래에 constraint를 저장해두는 방식을 사용할 때, constraint도 sourcing처럼 사용하기가 쉽다.


A / B를 나눠서 작업해준 뒤, 각각의 constraint에 대해 visualization과 함께 불러봤다.

 

constraint는 움직이지 않는다. 움직이는 것은 시각정보인 visualization일 뿐이다.

이 방식의 장점은 연결관계 확인이 훨씬 명료하다는 점이다.

 

그렇다면 조건을 하나 더 추가해보자.

  • A / B 박스의 윗단을 서로 연결해줘보자.

그렇다면, 방금 만들어준 constraint도 다른 constraint 처럼 Relationship tap의 attach... 항목을 체크해주면 어떻게 될까?

연결관계 생긴것부터 이상하다.
문제가 발생했다.

서로 다른 그릇에 담긴 물체에 대한 constraint를 만들어줄 때는, 특정 물체 아래로 constraint 정보를 넣는 것이 아니고, 글로벌하게 sim:Relationships 아래에 constraint 정보를 저장해주는 것이 맞다.

 

하나의 물체에서 같은 성질을 공유하는 constraint에 대해서는 본인의 그릇에 constraint 정보를 저장해도 문제가 없다.

 

예를 들어, 자동차에 대해 시뮬레이션을 할 때, 각각의 재질에 따라 constraint를 만들게 된다. (유리와 철이 같은 constraint로 깨지고 찌그러진다면 어색할 것이다.)

유리에 대한 constraint를 만들었다면, 그 constraint 규칙은 유리가 담긴 그릇에 저장해주는 것이 좋을 것이다.

마찬가지로 철에 대한 constraint를 만들었다면, 철이 담긴 그릇에 저장해주는 것이 좋을 것이다.

그리고 여기에 더해서 유리와 철의 constraint 또한 필요하다. 이렇게 서로 다른 그릇에 담긴 물체를 연결하는 constraint는 글로벌하게 Relationships에 저장해주는 것이 맞다.

 


Ep16_Part02. 시간에 따른 Constraint의 변화


시간에 따른 Constraint의 변형을 다뤄보자.

 

기본 세팅을 준비한다.

 

일단 세팅을 좀 바꿔주자.

Glue 대신 Stiffness 값이 각기 다른 soft constraint를 네개 연결해줬다.

첫번째, Stiffness 1000의 결과이다.

너무 출렁거린다. for each primitive를 사용해서 각각의 primitive 길이를 줄여준다.

결국 절대 휘거나 부러지지 않도록 glue constraint(strength : -1), soft constraint 3개를 세팅하였다.


이번해 해볼 것은 sourcing 과정을 활용해서 constraint에 변화를 가해볼 것이다.

 

sop network / sop solver / enable solver 노드를 가지고 위의 이미지와 같이 구성해준다.(보라색 부분이 constraint에 대한 세팅이다.)

 

주의할 점은 sop solver 세팅의 Data Name을 ConstraintGeometry로 바꿔주는 것이다.(default는 Geometry이다.)

enable solver 또한 마찬가지로 Enable Data에 ConstraintGeometry를 기입해줘야 안전하게 돌아간다.(default는 공란이다)


이제 constraint 쪽 sop network에 들어와서 constraint에 변형을 가해보자.

참고로, 현재 sop network 안에서 확인할 수 있는 constraint 정보는 초기 정보일 뿐이다.

이런 휘어진 정보를 볼 수 없기에 최대한 논리적으로 머릿속으로 그려가면서 작업해야한다.

일단 Geometry Spreadsheet를 확인해보자.

알만한 것들만 view에서 켜두었다.

일단, 시간이 조건이 되어서 constraint name이 바뀌었으면 좋겠다.

  • ex) 72f 이후에는 constraint name이 c 에서 b 로 바뀌었으면 좋겠다.

 

tip)

작업을 한 뒤 시뮬레이션 결과를 확인하기 전에 그 결과를 미리 예측해보고 확인해보는 습관을 기르는 것이 좋다.

 

이번에는 초기 constraint를 b(stiffness : 200)로 하고, 72f 이후에는 d(stiffness : 3)로 constraint name이 바뀌도록 해보자.

이번에는 초기 constraint를 d(stiffness : 3)로 하고, 72f 이후에는 b(stiffness : 200)로 constraint name이 바뀌도록 해보자.

 

이번에는 glue constraint 를 활용해보자.

  • 참고로 glue constraint가 발생시키는 attribute와 soft / hard constraint가 발생시키는 attribute가 서로 다르다. 이 부분은 일단 참고로 알아두자.

일단 glue constraint에서 soft constraint로 넘어갈 수 있도록 세팅해보자.

 

거꾸로도 해보자.

  • 내 예상은 위에서 이야기하셨던 것이 있던지라(발생시키는 attribute의 차이) 약간의 의구심을 가졌지만 어쨌든 휘리릭 하고 처음 담장 모양으로 나올 줄 알았다.
예상이 또 틀렸구나 중생아~

움직이던 그대로 고정되어버렸다.

 

이번에는 glue constraint(strength : 10000)를 하나 더 사용해서 soft constraint 에서 glue constraint로 넘어갈 수 있도록 해보자.


이번에는 solver의 성질을 적극적으로 활용해서 시간에 따라 soft constraint의 stiffness 값이 지속적으로 올라가도록 세팅해보자.

 

tip)

dop network에서 작업 중, 노드 중 노란색 느낌표가 떠있다면, 캐시를 날려주자.

 

dop network 밖에서 f@stiffness 가 정해져서 시뮬레이션이 진행될 경우, 사용자가 정의한 f@stiffness 값에 dop network 안의 soft constraint 노드의 parameter로 있는 stiffness가 곱해져서 작동을 하게 된다.

일단 dop network 밖의 stiffness는 1로 세팅한다.

그리고 dop network 안의 sop network 안에서 @stiffness가 사이클이 지날 때 마다 일정 값이 증가하도록 세팅해준다.


처음에 몰랐을 때, 선생님이 이런게 가능합니다! 했을 때는 와... 저걸 어찌 잡나? 했는데

역시 빌드업의 중요성...

sop 세팅으로 이 부분에 변화를 주는 것이라는걸 알게 되면서 오... 저거 잘만하면 왠지 움직이는 물체가 점점 얼어붙다가 굳은 상태에서 충격에 팡~ 하고 박살나는 그런 느낌도 표현이 되겠네 싶었다.

 

혹은 물체가 녹아내리다가(이건 melt 쪽을 공부해봐야겠지만...) 점점 굳는다던가 하는 상태의 변화도 이런 느낌이지 않을까 하는 생각을 하는 밤이다.

 

soft > glue(-1) > glue(20000)