TWA Houdini1/Rigidbody

TWA 후디니 1 RIGIDBODY_16_01 : Constraint 데이터 부르기 (Vis Data 활용)

yiss09 2023. 4. 23. 21:37

https://www.twahoudini.com/course/rigidbody1

 

HOUDINI1_ RIGIDBODY

3️⃣ 출동 SIMULATION 기초 이론부터 심화된 내용을 공부합니다. 또한 자동차를 이용한 리깅 시뮬레이션 BASIC을 훈련합니다.

www.twahoudini.com

 

앞으로 배우게 될 Constraint 이론에 대한 큰 틀이다.

1. Constraint 정보를 부르는 방법과 시각화 하기

2. Constraint의 변형 그리고 조건 만들어주기

3. Constraint 종류에 따른 활용 가능한 정보와 Attributes에 대해, 그리고 특정 정보를 Constraint 변형 조건으로 활용하기

 

목차

1. 기본 세팅

2. Constraint 불러내기

3. 서로 다른 그릇간의 Constraint

 

 


1. 기본 세팅

 

Constraint의 변형이 주된 이야기 될 것이다.

그리고 이를 위해 기본적인 Rigidbody 세팅과 Constraint 세팅이 필요하다.

두 개의 바를 만들어줄텐데 한쪽 바는 충돌에 의해 탄성을 가지고 움직이고, 다른 하나는 연결이 되어 있는 상태로 쓰러지는 움직임으로 만들어줄 것이다.

 

먼저 Box를 만들어 Pack 해준 뒤 0.5만큼 y축으로 올라간 점에 붙여주겠다.

해당 point를 Copy with Stamp로 y축으로 1만큼씩 10개 복사해준다.

그리고 point number에 따라 다른 이름이 붙도록 @name을 지정해주겠다.

이렇게 만든 object를 box라고 저장하겠다.

 

이제 Constraint를 만들어줄 차례이다.

Add로 Copy with stamp로 복제된 점들을 모두 선으로 이어준다.

그 다음 PolyCut으로 모든 points를 Cut 방식으로 끊어주겠다. Primitive number를 보면 0번부터 8번까지 있는 것을 볼 수 있다.

Primitive Properties로 선들의 길이를 줄여주겠다.

그 다음 constraint type과 name을 정해주겠다. type은 all이다.

Measure로 @restlength를 측정해주면 Geometry 단계에서 필요한 세팅이 완료된다.

 

Dop Network 안에서 Soft Constraint Relationship 세팅을 해주겠다.

그리고 충돌할 물체를 Sop Network에서 만들어주겠다.

20 Frame에 빠른 속도로 날아오는 Sphere를 만들어 box와 충돌하도록 해주겠다.

결과를 보면 Sphere에 충돌하면서 멀리 날아가는 box를 볼 수 있다.

 

바닥이 고정되도록 @active에 대한 조건을 만들어주도록 하겠다.

@P.y가 chf 값보다 작은 녀석만 @active 값이 0이 되고, 나머지는 1이 되도록 해주겠다.

chf 값을 1을 주고 결과를 보면, 가장 아래의 box만 고정이 되고 나머지는 Simulation의 영향을 받는 것을 볼 수 있다.

 

이번에는 비교하면서 실험하기 좋게 Box를 두 줄로 만들어주겠다.

Copy with Stamp 아래에 name에 대한 정보를 하나 따로 빼어 이름을 다르게 지정한 뒤, Transform으로 x축으로 4만큼 움직여주겠다.

그리고 그 아래는 constraint_name에 대한 세팅만 변경해주겠다.

object에 대한 세팅은 Transform으로 위치가 옮겨진 정보와 원래 연결되있던 정보를 Merge로 합쳐준 뒤 Copy to Points에 연결해주면 된다.

Dop Network 안에서도 Bullet Soft Constraint Relationship을 하나 더 생성해주겠다.

Sop Network 안에서도 생성될 물체를 복사해 x축으로 4만큼 옮겨주고 @name에 대한 정보를 변경해주겠다.

 

두 Soft Constraint의 복원력을 다르게 한다면 비교되는 결과를 볼 수 있다.

지금까지 이론 설명을 위한 기본세팅이었다.

 

 


2. Constraint 불러내기

 

오늘 처음 배울 이론은 Constraint를 어떻게 불러내는가이다.

우리가 Dop Network 안에서는 Constraint를 눈으로 보면서 작업할 수 있는데 반해, Geometry 단계에서는 Constraint를 눈으로 확인할 수가 없다.

그래서 Geometry 단계에서 Constraint를 불러오는 방법에 대해 배워보겠다.

이는 Object Merge로 그릇에 담긴 물체를 부르는 것과 방식이 같다.

Dop Network안에서 만들어진 NodeTree에 대한 정보는 Geometry Spreadsheet 안에 존재한다.

이때 물체의 관계에 대한 정보는 Relationships에 저장되어 있다. Merge, Rigidbody Solver, Constraint Network에 대한 정보가 Relationship에 있는 것을 볼 수 있다.

이때 Rigidbody Solver의 이름을 변경해주면, Relationships에서의 Rigidbody Solver의 이름도 바뀌는 것을 볼 수 있다.

col과 연결된 Merge는 main으로 먼저 들어온 box에 대해서 col과 함께 충돌하고 싶다는 것을 의미한다. 이름을 변경해주면 Relationships에서도 정보가 변경되는 것을 볼 수 있다.

 

Constraint Network 또한 이름을 cnt 바꿔주면 Relationships 항목에서 이름이 변경된 것을 볼 수 있다.

cnt를 또 열어보면 constraintnetwork가 존재하고 그 안에는 Geometry와 Visualization이 존재하는 것을 볼 수 있다.

이때 Geometry가 우리가 사용하게될 Constraint에 대한 메인 정보이다.

이제 Geometry 단계에서 Object Merge로 해당 정보들을 불러내어 보겠다.

주소를 쓰는 방식은 그릇을 불러내는 방식과 동일하다.

불어들인 constraintnetwork/Geometry에 대한 정보는 우리가 처음 넣어준 Geometry 단계에서의 Constraint 정보와 같다는 것을 알 수 있다.

 

Point Attributes에서는 Simulation이 돌아가도 바뀌는 것이 없는 것을 볼 수 있다. 정보의 변화가 오직 Primitive Attributes에서 일어나고 있기 때문이다.

정보가 변하고 있음에도 Point의 정보가 변하지 않기 때문에 실질적인 위치가 변하고 있지는 않고 있다.

 

이번에는 우리가 Dop Network 안에서 보고 있는 Visualization된 정보를 밖에서 불러와보겠다.

결과를 보면 Geometry 단계에서도 연결 관계를 확인할 수 있다.

 

이렇게 Object Merge로 정보를 불러들일 수 있지만 그 경로가 너무 너저분하다고 느껴진다.

Constraint가 저장될 위치를 해당된 그릇 아래로 옮겨주는 기능을 이용해보겠다.

Constraint Network의 Relationship 탭에서 Attach Internal Constraints to Object를 체크해주겠다.

Geometry Spreadsheet를 보면 box 카테고리 안에 ConstraintGeometry가 생성된 것을 볼 수 있다.

 

이제 Geometry 단계에서 경로가 바뀐 정보를 불러와보겠다.

정보를 불러들일 경로가 훨씬 깔끔하게 쓰이는 것을 볼 수 있다.

Geometry 정보와 Visualization 정보가 둘 다 잘 불러지는 것을 볼 수 있다.

 

 


3. 서로 다른 그릇간의 Constraint

 

이번에는 두 줄의 Box를 하나의 그릇에 넣는 것이 아니라 A와 B로 나누어 담아주도록 하겠다.

두 그릇의 Constraint Network도 따로 세팅해준다.

이렇게 세팅하는 것의 장점은 연결 관계를 확인하는 것이 훨씬 명로하다는 것이다.

A를 위한 Constraint가 따로 조절이 가능하고, B를 위한 Constraint가 따로 조절이 가능해진다.

 

여기서 새로운 조건을 하나 더 추가해주겠다.

A와 B 사이에 한 줄의 Constraint를 만들어보겠다.

그렇게 되면 한쪽이 넘어지고 한쪽이 버티고 있을 때, 넘어지다가도 다시 당겨져 올라올 수 있을 것이다.

Box에서 필요한 point들을 가져와 Blast해 간단하게 선으로 만들어주겠다.

그리고 constraint type은 all, name은 A,B와 다르게 cnt로 설정해주겠다.

Dop Network 안에서도 새롭게 Constraint Network를 만들어주겠다.

 

결과를 보면 예상대로 충돌에 의해 넘어지던 box가 버티고 있는 box에 의해 다시 일으켜 세워지는 것을 볼 수 있다.

 

이때 새롭게 만든 Constraint Network에서 Attach Internal Constraints to Object를 체크해준다면 어떻게 될까?

결과를 보면 원래 작동되던 Constraint 마저 작동하지 않는 상황이 발생해버린다.

서로 다른 그릇에 담긴 물체에 대한 Constraint를 만들어줄 때는 지금처럼 Attach Internal Constraints to Object를 해주는 것이 아니라, Relationships에서 Constraint를 만들어주는 것이 맞다.

다시 말하자면 A 그릇에 담긴 box와 B 그릇에 담긴 box의 연결 관계는 누구 밑에 달아준다로써 해결이 되지 않는다.

그래서 Relationships라는 구역에서 연결 관계를 만들어주는 것이 맞다.

하지만 한 물체에서 같은 성질을 공유하는 Constraint에 대해서는 본인의 그릇에 Constraint를 달아주는 것이 훨씬 깔끔하게 확인이 가능해진다.

 

지난 시간에 배웠던 자동차 세팅은 움직임을 위한 Rigging에 초점을 맞춘 세팅이었다.

나중에 충돌을 발생시키고 부러짐이나 깨짐을 묘사할 때는 각각의 파트를 나누어 작업해주어야 한다.

자동차의 창문은 유리로 되어있고 문은 철로 되어있다고 하겠다.

이때 우리는 유리와 철의 깨짐에 대해서 조각을 미리 만들어주게 될 것이다.

이렇게 조각들이 각각 준비가 되었다면 이것들을 한번에 같은 규칙으로 Constraint를 주지는 않는다.

유리는 유리처럼 깨지고, 철은 철처럼 찌그러지도록 묘사해줄 것이다. 그리고 각자의 그릇에 Constraint가 저장될 것이다.

이때 유리와 철도 연결시켜 주어야 한다.

이렇게 유리와 철, 서로 다른 그릇에 존재하는 연결 관계에 대해서는 Relationships에 저장되어야 한다.

앞으로 다루게 될 내용을 위한 반드시 필요한 내용이 되겠다.