TWA Houdini1/Rigidbody

TWA 후디니 1 RIGIDBODY_14_02 : 한땀 한땀 컨스트레인트 구하기

yiss09 2023. 4. 8. 01:36

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

 

HOUDINI1_ RIGIDBODY

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

www.twahoudini.com

 

"앞으로는 물체들의 조각들이 점점 많아질 것이다. 조각이 많아질수록 많은 아이디어를 가지고 있어야 한다. 하나의 아이디어로 모든 상황을 커버할 수 없기 때문이다."

 

Rigidbody14_part2에서는 복잡한 구조물에서 Constraint를 하나하나 얻어내보는 과정을 해내보겠다.

 

목차

1. Rigidbody Simulation 세팅

2. 여러 조각에서 Constraint 구하기

 

 


1. Rigidbody Simulation 세팅

 

먼저 지난 시간에 만든 chair modeling을 Object merge로 불러온다.

이때 의자는 Simulation을 위한 세팅이 되어 있지 않다.

이를 위해서 의자의 각각의 부분을 떼어내어 이름을 지어준 뒤, 다시 합쳐주도록 하겠다.

이러한 과정을 연습하는 이유는 앞으로 여러 작업들을 해보다보면 모델링 파일에서 준비된 정보가 하나도 없거나, 이름이 폴더처럼 되어 있어 쓰기 곤란한 경우도 생길 것이다. 이러한 상황을 대비해 연습해보고자 한다.

 

Select mode로 들어가서 3D Connected Geometry로 선택해준다. 이제 연결된 조각끼리 한번에 선택이 가능하다.

준비되어 있는 모든 조각들을 선택해 Delete로 하나씩 전부 떼어내어 주겠다.

 

전부 떼어내었다면 각각 Packing해준 뒤 Attribute Wrangle을 달아 @prep_name을 지어주도록 하겠다.

이름은 전부 다르게 지정해준다.

여기서 @name이 아닌 @prep_name을 이용하는 이유는 이후에 있을 Simulation 작업에서 Transform Pieces를 이용해 proxy를 고화질 물체로 변환해줄 때를 대비해주는 것이다.

 

이제 Attribute Wrangle을 새로 만들어 @name을 @prep_name과 같다고 지정해주겠다.

Dop Network에서는 @prep_name이 아닌, @name을 쓰기 때문에 @name을 준비해준 것이다.

의자의 @active 값을 1로 주었다. @animated와 @deforming은 당장은 쓰지 않기에 준비하지 않겠다.

 

Dop Network를 생성해 그 안에서 Rigidbody Simulation 세팅을 잡아주겠다.

chair 그릇의 Initial State에서의 Position을 높여준다.

결과를 보면 중력에 의해 떨어지면서 조각조각 흩어지는 의자를 볼 수 있다.

 

 


2. 여러 조각에서 Constraint 구하기

 

Geometry 단계에서 Constraint 세팅을 잡아줄 차례이다.

시작하기에 앞서 실제로 물체들 사이에 연결이 될 곳이 어디인지 생각해보아야 한다.

지금까지의 작업에서는 각각의 물체의 중앙에 대변될 위치를 만들어주고 그 점들을 이어준 다음 길이를 줄여 둘이 만나는 위치를 새롭게 대변될 위치로 만들어주었었다.

하지만 지금과 같은 조각이 많은 모델링에서는 이전처럼 작업하면 안된다.

seat와 legA 사이에 경첩을 만들어주고 싶다면, 둘이 맞닿는 부분의 중앙에 경첩을 만들어주면 될 것이다. seat와 legA이외에도 각각의 물체마다 접하는 면의 중앙에 연결 관계가 만들어져야 할 것이다.

또한 그 접하는 면에 생기는 연결 관계에 이름을 각각의 물체의 이름으로 지어주어야 할 것이다.

 

예시로 들었던 seat와 legA 먼저 작업해주도록 하겠다.

Blast로 두 pack된 물체를 각각 떼어내어 준다.

seat와 legA 둘 중 무엇이 더 접합면을 얻어내기 쉬운가에 따라 legA에서 작업해주겠다.

legA를 Unpack해준 뒤 Blast로 seat와 접합되는 면을 떼어내준다.

그 다음 Bound와 Add로 면의 중앙에 있는 점을 구해준다.

 

이제 얻어준 point가 legA를 대변한다는 것을 명확하게 하기 위해서 Attribute Wrangle에서 이름을 지어주겠다.

point function으로 Input2로 들어오는 @prep_name의 정보를 활용해주겠다. seat도 똑같이 작업해준다.

둘을 Merge 해준다면 같은 위치, 다른 이름을 가진 point를 두 개 얻게 된다.

Constraint로 이용하기 위해서 Add로 두 점을 Primitive로 만들어준다. 

 

Primitive Wrangle에서 @constraint_type과 @constraint_name을 지정해준다.

이때 type은 물체끼리 딱딱하게 고정되길 원하기 때문에 "all"로 하겠다.

Measure로 @restlength 값까지 정의해준다.

 

얻어준 Primitive 정보를 Constraint 정보로 이용하기 전에 @name을 정의내려주겠다.

앞서 가져온 @prep_name 정보는 Dop Network 안에서 의미 없는 정보이기에 @prep_name이 @name 정보라고 정의내려 준다.

 

이제 Dop Network 안에서 Constraint에 대한 세팅을 해주겠다.

Hard Constraint Relationship, Bullet Soft Constraint Relationship, Glue Constraint Relationship을 모두 꺼내어 비교하면서 작업하도록 하겠다.

Simulation 결과를 보면 Constraint가 잘 작동하고 있는 것을 볼 수 있다.

 

이제 나머지 Constraint 작업도 해주겠다.

방법은 간단하다. 방금까지 만들어주었던 seat & legA 시스템을 그대로 복사해 legA의 위치에 다른 leg 물체를 넣어주도록 한다.

 

back의 경우는 seat과의 연결 관계를 얻어내는 것은 맞지만, Unpack 후 Blast로 접합된 면을 얻어내는 부분에서 수정이 필요하다. 확인 후 알맞은 면을 떼어내어 준다.

 

이런식으로 back과 mid 사이의 작업도 마무리 해준다.

 

hard, soft, glue의 결과이다.

chair에 vel 값을 주어 던져지는 것과 같이 묘사해준 뒤 Simulation을 실행시켜보겠다.

Hard, Soft, Glue 각각의 느낌이 잘 표현된 것을 볼 수 있다.