TWA Houdini1/Rigidbody

TWA 후디니 1 RIGIDBODY_06 : Simulation 데이터 부르기 + 총알 모델

yiss09 2023. 3. 25. 22:20

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

 

HOUDINI1_ RIGIDBODY

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

www.twahoudini.com

 

RigidBody06부터 앞으로 3개의 강의는 매우 중요하다.

지금까지는 RigidBody를 배우고 사용을 시작하기위한 너무 당연한 이야기들을 해온 것이고, 앞으로의 내용부터는 어떻게 하면 RigidBody Solver를 마치 Particle이나 Smoke Solver처럼 자유롭게 활용하고 쓰느냐에 집중하는 시간이 될 것이다.

 

 2주차에서는 3가지 정보의 예제를 진행하고 새로운 카테고리로 넘어갈 예정이다.

이번 2주차에서 얻어갈 개념들이 전체 RigidBody Solver에서 가장 중요한 개념이 될 것이다. 여기서 길을 잃으면 뒷 내용들에서 길을 잃을 수도 있다. 다음 Constraint 내용에 들어가기 전, 이번에 배울 내용에 대해 스스로 확신하지 못한다면 계속 불안할 것이다. 전부 다 이해할 각오로 수업을 듣도록 하자.

간단하게 수업 진행 순서와 핵심 스킬들을 설명하겠다.

먼저 수업 진행 순서이다. 이러한 과정들을 3번 반복할 것이다.

1. Object 자료 준비(직접 모델링)

2. Simulation Set-up

3. Simulation 결과 분석 & Instancing

4. 출력(Render)

 

그 다음은 해당 과정 동안 배워나갈 핵심 스킬들이다. 첫 예제에서는 새롭게 배울 스킬들을 가볍게 쓰게 될 것이고, 반복이 되면 될수록 복잡하고 생각할 것이 많아질 것이다.

1. Object Merge로 Simulation 결과 부르기 & Geometry Spreadsheet 이해하기

지금 까지는 RigidBody Simulation이 작동하느냐 하지 않느냐가 중요했다. 이제부터는 Simulation 결과를 Geometry Spreadsheet과 대조하여 보고 이해하고 추가적인 후작업을 할 줄 알아야한다. 근데 Dop Network에서의 Spreadsheet은 좀 다르게 생겼기에 알아보기 어렵다고 느껴질 것이다. 한 Simulation 결과에서 제공받을 수 있는 정보가 다양하게 존재하기 때문이다.

앞으로의 훈련을 통해 겁먹지 않고 Geometry Spreadsheet을 볼 줄 알아야하고, Simulation 결과 중에서 원하는 내용을 말로 표현해서 쓸 줄도 알아야한다. 해당 내용들이 Constraint에서도 중요하게 다루어진다.

그런데 막상 Constraint에서 처음 이 내용을 다루게 되면, 높은 확률로 감당하기 어려울 것이다. 이 때문에 미리부터 쉬운 내용을 접하며, 감각을 길러나갈 예정이다.

2. Dop Nework 안에서 Sourcing 하기 (Sop Solver & Sop Net)

이 내용은 첫 번째 스킬을 다룰줄 알아야 올바르게 할 수 있는 내용이다. 지금까지는 물체를 그릇에 직접 불러왔다.

그런데 이제는 Dop Network 안에서 그릇만 꺼내두고 올리고 싶은 물체를 우리가 원하는 규칙에 따라 Custom하게 올릴줄 알아야한다. 즉, 마치 Particle에서 Pop Source를 쓰는 것처럼 물체를 그릇에 load할 줄 알아야 한다는 것을 뜻한다.

이 부분을 할 줄 아느냐 모르느냐의 차이로 RigidBody Simulation을 얼마나 다양하게 쓸 수 있냐 없냐로 나뉘게 될 것이다.

3. Transform Pieces

쉬운 물체로 빠르게 Simulation 마치고 해상도가 높은 자료로 전환하는 과정에서 쓰일 node이다.

우리가 원하는 장면을 빠르게 찾으려면 시간 절약을 위해서라도 반드시 Transform Pieces를 이용하게 될 것이다.

 

오늘 RigidBody06에서는 첫 번째 예제로 총알을 직접 모델링해서 Simulation에서 쓰도록 하겠다.

앞으로의 두 번째 예제에서는 레고 블럭을 Procedure하게 모델링할 예정이다.

세 번째 예제에서는 지난번에 만들어둔 나무 plank를 사용할 예정이다.

 

목차

1. 총알 모델링하기

2. 총알의 Simulation 세팅 잡기

3. 새롭게 배울 기술들

 

 


1. 총알 모델링하기

 

총알에 대한 모델링 자료를 만들고 나서, Initial 값에 따라 위로 튕겨져 올라가면서 지면에 떨어지도록 만들어줄 예정이다.

먼저 총알에 대한 모델링부터 해주겠다. 총알은 디테일을 기준으로 hard, easy, proxy의 퀄리티로 만들어질 예정이다.

총알은 Head, Body, Tail로 분리해 만들어주겠다.

 

일단은 Head부터 만들어보겠다.

Transform으로 Sphere의 길이를 늘려준다.

Boolean node로 A에서 B(Input1에서 Input2)를 빼주려 한다. Boolean의 Input1에 Sphere를 Input2에 Box를 넣어준다. Box의 위치와 크기를 변경해가며, Sphere가 반이 잘려 총알의 Head처럼 보이도록 해준다.

 

Body를 만들 차례이다. Tube를 하나 생성해 End Caps 해준다.

Tube의 위치를 Head와 맞춰준다. 그리고 Columns 값 또한 맞춰준다.

 

Tail를 만들기 위해서 Tube를 생성해준다.

End Caps로 위아래를 막고 높이를 줄여준다. Sphere와 Columns 값을 맞춰준다.

 

셋을 Merge 해주면 기본 골격이 완성된다. 지금까지의 결과가 앞으로 Simulation에서 쓸 총알의 충돌 Data이다.

Node Info를 보면 용량이 굉장히 작은 것을 볼 수 있다.

 

이제  Detail을 살릴 수 있게 각각의 파트를 Group으로 분리해주겠다. Head, Body, Tail 세 그룹으로 나누어 주겠다.

그룹들을 다시 Merge해준다. 이때 Head에 대해서만 디테일을 작업하고 싶다면 Blast로 떼어내어 작업할 수 있다.

 

이제 총알의 Detail을 살리고자 그룹들을 각각 떼어내어 작업해주도록 하겠다.

먼저 Head부터 작업해보겠다.

Head의 경우 Body와 Head가 맞닿는 부분의 모서리에 약간의 Bevel이 들어갔으면 한다.

Edge Type의 Group node를 Blast 아래에 달아준다. Include by Edges로 아래쪽 모서리만 따로 떼어내준다. Group의 이름을 edges로 해준다.

 

Polybevel을 생성해 구체적으로 edges에만 bevel을 주려한다. Distance 값과 Edges 값을 적당히 올려 모서리를 부드럽게 만들어준다. Head 부분의 Detail이 완성되었다.

 

그 다음은 Body를 작업해준다.

Body의 경우 Head와 똑같은 Detail 작업을 거치게 되는데, 이에 Blast로 둘을 동시에 떼어내 한번에 작업해주도록 하겠다.

결과를 보면 Head와 Body 둘 다 Bevel이 잘 들어간 것을 볼 수 있다.

 

마지막으로 Tail 작업이다. Tail의 경우는 움푹 패인 부분이 있어 약간 다르게 작업해줄 것이다.

Blast로 Tail을 떼어낸 뒤 Group으로 윗 면의 Edge만을 따로 선택해주겠다. 해당 그룹을 upedges라 하겠다.

그 다음 Polybevel로 upedges에 대해 bevel을 주겠다.

이때 아무리 Bevel을 주어도 바깥쪽으로 휘어 원하는 모양이 나오지 않는다. 이는 Convexity 파라미터를 -1로 해준다면, 바깥쪽이 아닌 안쪽으로 Bevel이 들어가는 결과를 만들어낼 수 있다. 

다시 Group을 꺼내 새롭게 Edge 그룹을 지정해주겠다. 이번에는 Include by Edges로 Bevel이 들어간 부분의 위 아래 Edge line을 선택해주도록 하겠다. 이름을 edges라 하겠다.

여기서 Polybevel로 edges에 Bevel을 주도록 하겠다. Head, Body와 똑같은 Bevel 양을 줌으로써 전체적인 느낌을 통일시킨다.

 

세 결과를 Merge하여 완성된 총알에 Subdivide를 해주게되면 좀 더 매끄러워져 더 예쁜 총알을 얻을 수 있다.

모델링이 끝났기에 이제 자료를 세 개로 정리해주겠다.

Simulation에서 사용할 가장 가벼운 proxy, Detail이 준비된 easy, Subdivide가 된 hard로 정리해주겠다.

Detail을 주기 전 Merge를 기준으로 proxy를 만들어주겠다. 해당 결과를 Convex Hull로 랩핑해주도록 하겠다. 용량이 낮아 가벼운 proxy가 준비되었다.

Detail이 완성된 Merge에 Null을 달아 easy로 해주겠다.

해당 Merge에 Subdivide를 단 결과를 hard로 해주겠다.

 

이제 불필요한 정보들을 제거해줄 차례이다.

Head, Body, Tail에 대한 Group들은 추후 Rendering에 사용될 수도 있기에 남겨둘 필요가 있다. 그러나 작업 과정에서 이용했었던 edges와 upedges는 그 필요를 다 했기에 지워주도록 하겠다.

먼저 proxy 정보를 보면 Convex Hull로 랩핑을 해주는 과정에서 모든 Groups와 Attributes가 사라진 것을 볼 수 있다. proxy는 충돌 조건으로만 쓰이며, Rendering에서는 사용되지 않기 때문에 이 부분에서는 문제가 없다.

 

easy의 Node Info를 보면 Head, Body, Tail의 Primitive Groups와 Edges Groups이 있는 것을 볼 수 있다.

Clean node를 이용하여 사용하지 않는 Edge Groups만을 지워주겠다.

hard의 경우는 Subdivide의 과정에 의해 Edge Groups이 사라졌기에 Clean 작업이 필요하지 않게 되었다.

 

이후 Group으로 proxy, easy, hard로 재분류해준다.

Merge를 달아주어 해당 결과를 prep_bullet이라 하겠다.

마지막으로 prep_bullet 위에 Transform을 달아 총알의 사이즈를 줄여주고 모델링을 마무리하겠다.

 

 


2. 총알의 Simulation 세팅 잡기

 

이제 새로운 Geometry에서 RigidBody Simulation을 잡아주겠다.

Object Merge로 prep_bullet을 불러온다. RigidBody Simulation에 이용될 proxy만 떼어내어 사용하도록 하겠다.

RBD Packed Object를 사용할 예정이기에 해당 Geometry를 Pack해주도록 한다.

 

이제 총알에 Initial Value를 줘보려 한다.

지금까지 해왔던 것처럼 점에 Initial Value를 저장하여 Copy to Points로 옮겨주는 방법, Pack된 Geometry에 바로 Initial Value를 주는 두 가지 방법이 존재한다. 두 방법을 모두 사용해 차이를 비교해보겠다.

Copy to Points를 쓸 때에는 물체가 복사되면서 방향이 바뀔 수도 있다. 예를 들어 @N, @up, @orient와 같은 값들이 instancing 과정에서 방향을 잡는 역할을 한다. 그래서 종종 신경을 써야하는 순간들이 생기게 된다. 

이와는 달리 이미 Pack된 자료에 추가적으로 Initial 값들을 다는 경우는 방향이 바뀌지 않는다. 어떠한 계산 없이 단순히 추가적으로 Attributes가 늘어나는 것이기 때문이다. 

 

먼저 총알의 높이를 올려주도록 하겠다. 두 방법 모두 @P의 높이를 동일하게 높여준다.

두 결과가 동일한 것을 볼 수 있다.

 

그 다음은 초기 속도값을 준다. 위쪽으로 올라가면서 시작하도록 y축에 양수 값을 준다.

결과를 보면 둘의 결과가 차이가 나는 것을 볼 수 있다. 

Copy to Points로 Initial Value를 옮겨준 결과를 보면, 총알이 옆으로 누워진 것을 볼 수 있다.

그 이유는 Copy to Points로 Instancing을 할 때 여러가지 요소들에 의해 방향이나 위치가 정해지는데, 방향을 뜻하는 @N, @up, @orient가 없을 때에는 Initial Value로 만들어준 @v 값이 방향에 영향을 주기도 한다. 

그래서 Copy to Points로 위치만 바꾸고 싶은데 속도를 주어야 하는 상황에는 방향의 기본 Normal 값을 주는 것이 도움이 된다. 여기서 쓰이는 기본 Normal 값은 {0,0,1}으로 특이사항이라 외워두도록 하자.

@N에 {0,0,1}의 값을 주면, Pack에서의 결과와 같은 모습을 보이게 된다.

이때 Copy to Points의 Geometry Spreasheet을 보면 @N 값이 존재하지 않는 것을 볼 수 있는데, Copy to Points에서 방향으로써 쓰임을 다한 후 지워지기 때문이다.

 

이제 초기 회전력도 만들어주도록 하겠다. 모든 축으로 10만큼 돌도록 해주었다.

Simulation을 작동시켜보면 두 방식 모두 똑같은 결과인 것을 볼 수 있다.

Pack에서 바로 Initial Value를 준 결과에 Null을 달아 RBD Packed Object에 들어갈 내용으로써 이용해주겠다.

 

Dop Network를 생성해 RigidBody Solver 세팅을 잡아준다.

Object에 방금 만든 pack_proxy_bullet의 정보를 담아준다. Inherit Velocity from Point Velocity를 체크해준다.

Simulation 결과를 보면 총알이 위로 튀면서 회전하다가 바닥에 충돌한 다음 굴러가는 것을 볼 수 있다.

 

 


3. 새롭게 배울 기술들

 

이제 배워볼 기술에 대해 설명하겠다.

1. Dop Network의 Geometry Spreadsheet 이해하고 Object Merge로 원하는 결과 부르기

2. Transfom Pieces로 물체 대체해주기

3. 원하는 타이밍에 물체 등장시키기

 

먼저 Geometry Spreadsheet에 대해 이야기해보겠다.

방금 얻어낸 Simulation 결과를 Geometry Spreadsheet으로 같이 보겠다.

Geometry Spreadsheet을 보면 Start Frame 이전에는 내용이 없다가, Start Frame이 됐을 때 추가적으로 생성된 두 가지 정보를 볼 수 있다. 하나는 ground, 다른 하나는 proxy_bullet이다.

이는 Dop Network가 작동되면서 Simulation에 이용할 그릇이 생성되는 것이다. 이때의 그릇의 이름은 우리가 Object Name에서 정해주었던 이름과 동일하다. 

이름이 배치되는 순서는 Relationship 아래부터 알파벳으로 놓이게 된다. proxy_bullet의 이름을 z로 변경하면 ground 아래에 놓이게 된다.

 

이제 Geometry Spreadsheet의 반응이 어떻게 다른지 보도록 하겠다.

Geometry 단계에서는 node를 선택해줌에 따라 즉각적으로 다른 Geometry Spreadsheet을 볼 수 있다.

그러나 Dop Network 안에서는 각각의 node마다 따로 Geometry Spreadsheet을 보여주지 않는데, 그 이유는 Dop Network 안에서 쓰인 모든 Object 혹은 관계에 필요한 Solver, merge, gravity가 모두 한번에 동시에 작동하고 있기 때문이다.

그래서 오직 Output 또는 Flag가 켜진 node를 기준으로 전체 결과를 한번에 받는 방법 밖에 없다. 이는 한번에 Dop Network 안에서의 모든 내용을 다 본다는 것을 뜻한다.

 

우리가 Dop Network 밖에서 결과를 볼 때 Dop Network에서 이름을 따로 정해주었다. 이제 이렇게 따로 정해서 보는 방법을 여러 방식으로 해보도록 하겠다.

먼저 Dop Network에서 결과를 보도록 하겠다. 우리가 앞서 총알의 그릇의 이름을 z로 변경해두었기에 총알에 대한 결과를 보려면 z를 입력해주어야 한다.

 

이번에는 Dop Network의 결과를 Dop Import로 불러서 보도록 하겠다. Dop Network가 제공해주고 있는 Geometry 결과를 있는 그대로 보기 위해서 Import Style은 Fetch Geometry from Dop Network로 해준다.

Dop Import의 결과에서는 Geometry Spreadsheet에서의 반응이 Dop Network에서와 다르게 나타나고 있다. 여태 우리가 봐온 익숙한 Geometry Spreadsheet이다.

Fetch Geometry from Dop Network의 경우 Pack된 내용이 있다면 그대로 Pack이 된 상태로 불러오고, Pack이 되지 않은 내용이 있다면 그대로 Pack이 되지 않은 상태로 정보를 불러온다.

 

이제 Fetch Packed Geometry from Dop Network를 선택해 앞선 결과와 차이를 보도록 하겠다.

Dop Import의 Node Info를 보면 Pack이 되어 있지 않았던 Ground Plane 마저 Pack이 된 상태로 정보가 가져와진 것을 알 수 있다.

 

다음은 Fetch Unpacked Geometry from Dop Network를 비교해보겠다.

Node Info를 보면 Pack이 되어 있던 bullet의 정보마저 Unpack이 되어 가져와진 것을 볼 수 있다.

 

이번에는 Object Merge를 이용해 자료를 읽고 불러오는 방법을 배워보도록 하겠다.

우선은 다시 Dop Network의 Geometry Spreadsheet을 볼 필요가 있다. 모든 Dop Network에서의 정보가 한번에 들어있어 Geometry Spreasheet으로 모든 것이 파악 가능하다.

먼저 gr(Ground Plane)를 열어보면 지면에 대한 필요한 결과들이 모두 준비되어 있는 것을 볼 수 있다.

Dop Network의 gr의 Geometry를 보면, Dop Import에서 Ground Plane을 불러냈던 것과 같은 것을 볼 수 있다.

그런데 Dop Network 결과가 너무 많은 정보를 가지고 있기에 우리를 힘들게 하는 부분이 있다. 그리고 제공된 다른 정보들이 바로 쓰기에 좋은 정보가 아닌 경우가 많다.

이 때문에 지금 수준에서는 다른 정보들에 의해 어려워하지말고 그릇과 Geometry에만 집중하도록 하자.

 

이제 Dop Network이 줄 수 있는 Geometry 결과를 Object Merge로 불러오도록 하겠다.

Dop Network의 z 그릇에 있는 Geometry를 Object Merge에 불러오려한다.

Object Merge node에서 불러올 정보의 경로를 써준다.

평소와 같은 방식으로 경로를 작성하면 내용이 불러와지지 않을 것이다. 이때 중요한 점은 Dop Network 안에 있는 자료를 처음 부를 때는 Dop Network 뒤에 / 가 아닌 : 를 사용해야 한다.

: 을 사용하였더니 정보가 잘 들어온 것을 볼 수 있다.

이 기술은 이후 Dop Network 안에서 Sourcing 할때 필요하기 때문에 반드시 알고 있어야 한다.

 

이번에는 proxy 총알을 hard 총알로 바꾸는 작업을 해보도록 하겠다.

먼저 Object Merge로 Dop Network에서 총알 자료를 불러온다.

그리고 Object Merge로 Bullet Geometry에서 미리 준비해두었던 총알 정보도 가져오도록 하겠다. 그 다음 Blast로 hard의 내용만을 떼어내준다.

이제 Transform Pieces로 proxy 총알을 hard 총알로 변경해주는 작업을 해보겠다.

Transform Pieces node에는 Input이 총 3개가 있는데, 이 중 Proxy로 얻은 결과는 Input2로 넣어준다. 그리고 전환하고 싶은 고화질 결과를 Input1에 넣어주도록 한다.

결과를 보면 마치 고화질로 Simulation이 된 것과 같은 효과를 볼 수 있다.

 

그런데 여기서 불만인 점은 우리가 구해주었던 Proxy 결과는 Packing 되어 있는 반면에 Transform Pieces로 고화질로 전환한 결과는 전부 Unpack되어 있는 것을 볼 수 있다.

이러한 이유로 hard  또한 Pack하여 교환해주도록 하겠다.

Transform Pieces의 결과를 보면 Pack이 됨으로써 총알에 선들이 사라지고 매끈하게 면만 남은 것을 볼 수 있다.

 

이제 Transform Pieces에서 어떤 기준으로 proxy와 고화질 정보를 바꿔주는 것인지 알아보겠다.

예시를 들기 위해 새롭게 Geometry를 만들어 세팅을 잡아준다.

ZX Plane에서 원운동하는 Pack Box와 Y축에서 위 아래로 왕복 운동하는 Pack Box를 두 개 만들어준다.

그리고 s@name으로 둘의 name 정보를 정해준다. 해당 Box들이 Input 2에 들어갈 proxy 내용이다.

 

그 다음은 서로 다른 Object를 4개 생성하여 색을 다르게 해준 뒤 Pack 해준다. 해당 Object들은 Input1으로 들어갈 고화질 내용이다.

 

먼저 하나의 Box만들 Input2로 넣어서 실험해보도록 하겠다. Input1에는 Pig_head를 넣어주었는데, 결과적으로 Box가 Pig_head로 교체되어 원운동하는 Pig_head가 되었다.

이렇게 Transfrom Pieces는 물체를 치환해주는 node인 것을 알 수 있다.

 

그러나 지금의 상황은 각 Input 마다 하나씩만 내용이 들어갔기 때문에 변환이 쉽게 이루어진 경우이다. 그리고 Attribute Name에 대한 Tranform Pieces의 어떠한 작업도 이루어지지 않았다.

이제 Transfrom Pieces에 대한 설명을 뉘앙스를 바꿔 말해보도록 하겠다. 지금까지는 proxy 자료를 고화질 자료와 바꾼다는 식으로 말했기 때문에 Transform Pieces의 가운데에 proxy를 넣는다가 핵심이 되는 순서 같았다.

그런데 지금부터는 우리가 이용 가능한 고해상도 자료가 여러개 준비되어 있는데, 고해상도 자료 중에 proxy 자료와 이름이 같은 녀석이 있다면, 앞으로 그 이름이 같은 proxy의 움직임을 고해상도 자료가 따르게 하겠다라고 표현하겠다.

이제 실험을 몇 가지 해보겠다.

proxy 자료의 이름을 a01, 고화질 자료의 이름을 순서대로 a01,a02,a03,a01로 지어주겠다.

그 다음 고화질 자료들을 Merge하여 한번에 묶어준 다음 Input1에 넣어주도록 한다.

결과를 보면 a01의 이름을 가진 고화질 자료만이 proxy에 대체되어 움직이는 것을 볼 수 있다.

 

만약 proxy 자료가 하나가 아니라 여러개인 경우는 어떠한지 보겠다.

proxy 자료의 이름을 a01, a02로 두겠다. 

결과를 보면 고해상도 자료 중 a01의 이름을 가진 Object는 a01 proxy에 대체되고, a02 Object는 a02 proxy에 대체된 것을 볼 수 있다.

 

만약 proxy 자료가 2개, 고화질 자료가 4개인 순간 모두 이름을 가지지 않았다면 어떻게 될까?

결과를 보면 Merge에 들어간 순서대로 고화질 자료가 proxy 자료에 대입되는 것을 볼 수 있다.

예를 들면 1번 proxy에 1,3번 고화질 자료가 들어가고, 2번 proxy에 2,4번 고화질 자료가 들어간다.

 

그렇다면 Transform Pieces가 작동하지 않는 경우는 언제일까?

바로 1대1 상황에서 둘 다 이름을 가지고 있는데도 불구하고 같은 이름을 가지고 있지 않다면 Transform Pieces가 작동하지 않는다.

 

오늘 각각의 과정에서는 아직 어려운 부분이 없었다.

바로 다음 수업부터는 아리까리한 순간들이 생길 예정이다. 고화질 자료가 많아질 것이며, 그에 따라 치환 과정에서 신경써야할 것이 늘어날 것이다.

다음 수업을 무리없이 따라가기 위해서는 오늘 내용을 확실히 알고 가야하기 때문에 충분히 복습해두도록 하자.