TWA Houdini1/Rigidbody

TWA 후디니 1 RIGIDBODY_18_03,04 : 출력준비 (Brute & Car), 기둥+벽 박살내기

yiss09 2023. 5. 4. 20:23

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

 

HOUDINI1_ RIGIDBODY

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

www.twahoudini.com

 

앞으로의 세 개의 강의에서는 콘크리트를 부수는 작업을 진행하면서 트윅을 어떻게 하는지, 어떻게 다양한 물체를 가지고 상호작용을 시키는지에 대해 이야기해볼 예정이다.

큰 흐름은 이러하다.

1. Sourcing된 Sphere로 기둥과 벽 부수기

2. 캐릭터로 벽 부수기

3. 자동차로 벽 부수기

 

Rigidbody18_par13에서는 위와 같은 작업들을 위한 메터리얼 세팅을 해줄 것이다.

Rigidbody18_part4에서는 Sourcing된 Sphere로 벽과 기둥을 부숴보겠다.

 

목차

1. 출력준비 (Brute & Car)

2. 기둥, 벽 박살내기

 

 


1. 출력준비 (Brute & Car)

 

자동차와 Brute에 메터리얼 세팅을 해주었다.

 

메터리얼 세팅 과정에서 새롭게 Material Network node를 사용해주었다.

Material로 이동하지 않아도 Geometry 안에서 메터리얼 세팅을 해줄 수 있었다.

 

또한 Brute의 눈썹에 메터리얼을 주는 과정에서 Use Texture Alpha를 사용해 눈썹이 털과 같이 보이게 자연스러운 효과를 줄 수 있다.

이때 Use Texture Alpha를 사용하려면 반드시 Texture를 png 파일로 이용해야 한다.

 

자동차의 서스펜션 시스템과 지난 시간에 만든 콘크리트의 constraint 시스템을 준비해주었다.

추가로 constraint 시스템에서는 몇 가지 아쉬운 부분을 수정해주었다.

 

 


2. 기둥, 벽 박살내기

 

새로운 Geometry에서 작업해주도록 하겠다.

먼저 고대 신전에 쓰일 듯한 느낌의 기둥을 만들어주려한다.

Height 값을 높여주고 높아진 Height의 반 만큼 Center.y를 높여주겠다. 그리고 Column 값을 높여주고 Radius를 줄여주겠다.

그리고 Select mode에서 한 면씩 건너뛰어 옆면을 선택해 PolyExtrude 시켜주겠다.

 

그 다음 Edge Group을 만들어주겠다.

Minimum Edge Angle로 필요한 각진 부분만을 그룹화시켜주었다.

그리고 얻은 Edge Group에만 PolyBevel로 Bevel효과를 입혀주겠다.

만약 지금보다 조금 더 촘촘한 느낌을 원한다면, column 값을 높여주고 PolyExtrude에 쓰일 면을 다시 선택해주면 된다.

 

밖에 준비되어 있는 Constraint 시스템을 가져오겠다.

우리는 먼저 Just로 작업을 해줄 것이기에 Noise로 인한 불필요한 쿠킹이 필요하지 않다.

Subnetwork 안에서 Noise 시스템을 잠시 끊어두겠다.

Exploded View로 결과를 보면 조각이 예쁘게 난 것을 확인할 수 있다.

 

이제 Simulation 세팅을 잡아보겠다.

Subnetwork의 Ouput3을 Object로 쓰고 Output4를 Constraint로 쓰겠다.

Constraint에 대한 세팅을 잡아주기 전에 먼저 Object가 Dop Network 안에서 잘 작동하는지 확인해보겠다.

이때 Tube엔 각진 부분이 많기에 Collision Padding 값을 0으로 만들어 의도한 모양으로 충돌이 일어나게 해주겠다.

결과를 보면 중력에 의해서 무너져 내리는 조각들을 확인할 수 있다.

 

필요한 Constraint 세팅을 해주겠다.

Constraint_type은 all로 하고 Glue Constraint Relationship을 이용하겠다.

결과를 보면 대부분 잘 붙어있지만 몇 군데 조각들이 떨어지는 것이 보인다.

그 이유는 우리가 만들어둔 Constraint 시스템이 완벽하지 않기 때문이다.

고정력을 가지고 있으나 Constraint가 끊어져 부러진 것인지, Constraint 자체가 만들어지지 않은 것인지 확인해볼 필요가 있다. 이를 Glue Constraint의 Strength 값을 -1로 둠으로써 해결해주겠다.

딱딱하게 고정시켰음에도 조각이 떨어지는 것을 보면, 해당 조각엔 Constraint가 세팅되지 않았다고 볼 수 있다.

 

Null로 Subnetwork의 Output3의 정보를 빼오겠다.

그리고 Add로 면을 전부 제거하고 점만을 남겨주겠다.

그 다음 Connect Adjacent Pieces를 이용해 연결관계를 만들어주겠다.

Search Radius를 큰 값인 1로 고정해주고, Max Search Points에서의 값을 조절하여 적당한 만큼의 연결관계를 남겨주겠다.

그 다음 con_set을 달아주고 원래의 Constraint 세팅에 추가해주겠다. 이때 이름을 fix로 해주겠다.

 

Dop Network 안에서 Glue Constraint Relation을 하나 더 생성해 Data Name을 fix로 해주겠다. Strength 값은 -1로 둔다.

새로운 Glue Constraint로 결과를 보겠다. 조각들이 전부 딱딱하게 고정된 것을 기대했으나 연결되지 않고 떨어져 나온 조각을 확인할 수 있다.

이는 조각 하나당 하나의 이름을 가지고 있어야 하는데, 두 조각이 같은 하나의 이름을 가지고 있음으로써 발생하는 문제이다. 이렇게 이름 정보가 중복됨으로써 둘 중 하나는 연결 관계가 만들어지지 않아 떨어져 나가게 되는 것이다.

 

이 문제를 해결하기 위해서 이름이 중복되는 조각 중 크기가 더 큰 조각을 Object에 합류시켜주고 작은 조각에 대해서는  따로 작업해주도록 하겠다.

새롭게 For-each Named Primitive를 사용하겠다. 이는 같은 이름을 가진 것들끼리 반복을 시켜주는 기능을 한다.

이때 우리가 원하는 것은 중복된 이름이 없는 것이기에 대부분 하나로 작업이 될 것이다. 반대로 중복된 이름이 있다면 싸이클에 걸리게 될 것이다.

그리고 For-each Named Primitive는 Primitive 정보를 이용한다. 이에 Attribute Promote를 이용해 @name의 정보를 Point에서 Primitive로 넘겨주도록 하겠다.

 

For-each의 Single Pass값을 변경해주다보면 어느 순간에 primitive가 두 개인 것을 확인할 수 있다. 

이때 둘 중에 큰 조각을 판별해낼 수 있다면 작은 조각을 포기하는 것이 간단해질 것이다.

이제 For-each Primitive를 안에 만들어 중복된 조각에 대해서 각각 다시 작업해주도록 하겠다.

조각을 Unpack 해준 다음 Measure로 Area 값을 얻어주겠다. 그리고 Attribute Wrangle로 Area 값을 받아오겠다.

 

그 다음 For-each Primitive 밖에서 Sort로 방금 얻어준 Area 값에 대해서 큰 녀석부터 배치해주도록 하겠다.

Blast로 0번 점을 떼어내준다면 큰 조각을 얻을 수 있다.

떼어낸 큰 조각과 작은 조각을 각각 Group에 넣어준 다음 Merge해주겠다.

 

이제 다시 For-each Named Primitve 밖에서 Blast로 조각을 떼어내준 뒤 @name의 정보를 Primitive에서 Point로 넘겨주겠다.

큰 조각에서의 정보를 Object로 이용하겠다.

그리고 Attribute Wrangle로 작은 조각의 이름에 추가적인 정보를 달아주어 큰 조각과 겹치지 않게 해준 뒤 Object에 합류시켜 주었다.

이렇게 이름이 중복될 때 발생하는 문제를 해결해주는 시스템의 만들었다.

 

시스템이 바뀌었으니 Constraint 세팅도 다시 잡아주겠다. 간단하게 연결된 위치만 바꿔주도록 하겠다.

Dop Network 안에서 두 Glue Constraint를 동시에 사용하여 결과를 보면 cnt를 메인으로 활용하면서 부족한 부분은 fix로 메꿔지는 것을 확인할 수 있다.

 

이제 @area를 활용해 Glue Constraint에 Strength에 영향을 주려 한다.

그 전에 충돌에 필요한 col을 만들어주고, Object가 넘어지지 않도록 @active 세팅도 해주겠다.

 

이제 본격적으로 Constraint 세팅을 해볼 것인데, 핵심은 내가 원하는 만큼 부서지게 할 수 있는가 또는 원하는 만큼 딱딱하게 견디게 할 수 있는가가 될 것이다.

그리고 어떻게하면 Tweak에도 기준을 두고 작업을 할 것인가도 이야기해볼 수 있을 것이다.

딱딱함에 영향을 주지 않도록 fix의 Strength 값을 1로 주고 작업하겠다.

또한 Dop Network 안에서의 cnt의 Strength 값도 1로 줄 것인데, 이는 Dop Network 밖에서 따로 조절해줄 것이기 때문이다.

 

Dop Network 밖에서 cnt에 대한 @strength 값이 chf에 의해서 조절되도록 설정해주겠다.

우리는 이제 @area 값이 @strength에 영향을 주게 하려 한다.

그런데 이때 @area 값을 Ramp 파라미터로 조절하기 위해서 0~1 사이의 값으로 만들어주려 한다.

Sort로 @area를 큰 값부터 나열해주겠다. 그리고 Blast로 0번을 떼어내어 최댓값을 구해주겠다.

이 값을 가져와 fit function에서 pre_max 값으로 활용해주겠다.

 

@area 값을 0~1 사이의 값으로 fit 해주었다면 @area의 램프 파라미터를 생성해주겠다.

그리고 @area 값이 @strength 값에 영향을 주어 조각마다 다른 세기의 결합력을 가지도록 해주겠다.

Glue Constraint의 기본 Strength 값이 10000이기에, 얼추 1000을 곱해주어 우리가 조절할 파라미터의 값이 크게 커지지 않게 해주었다.

 

이제 Tweak을 해볼 차례이다.

Ramp 파라미터에서 0과 가까워질수록 작은 조각, 1과 가까워질수록 큰 조각의 세기를 다룰 수 있다.

0과 가까운 작은 조각의 Value 값을 높여줌으로써 작은 조각의 Strength를 높여줄 수 있다.

결과를 보면 수정하기 전보다 단단하게 고정된 기둥의 조각들을 볼 수 있다.

 

만약 그래프의 모양을 반대로 오목하게 바꾼다면 더 잘 부서지는 조각들을 확인할 수 있다.

 

우리는 조각의 갯수가 바뀜에 따라 다시 그에 맞는 적절한 Strength 값을 찾아주어야 한다.

지금 원하는 느낌은 너무 많이 부서지지도 너무 단단하지도 않은 적당한 Strength 값을 찾아주려 한다.

그리고 적당한 세기에서 램프 파라미터로 변화를 확인해보려 한다.

 

Noise에서의 결과도 보겠다. Object도 Tube에서 Box로 교체해주었다.

Subnetwork 안에서 끊어주었던 부분을 다시 연결해주고 밖으로 나와서 결과를 보겠다.

콘크리트 같은 느낌으로 잘 부서지는 것을 볼 수 있다.

후디니 실력을 늘리기 위해선 순간순간에 맞게 원하는 느낌으로 Tweak 하는 방법을 많이 연습해보아야 할 것이다.