https://www.twahoudini.com/course/rigidbody1
Rigidbody09에서는 앞선 강의들에서 만들었던 Bullet, Plank, Lego를 Sourcing으로 이용하여 Simulation을 작동시켜보도록 하겠다. 이 중 핵심은 Sourcing이다.
오늘부터 앞으로의 필기에서는 어느정도 익숙해진 내용들은 생략하도록 하겠다.
먼저 Bullet에서는 proxy, easy, hard로 디테일의 단계를 나누어 자료가 준비되어 있다.
Lego에서는 원하는 규격을 입력하면 그에 맞게 자동으로 레고가 제작되는 시스템을 만들어뒀었다.
Plank에서는 하나의 Box를 여러 과정을 거쳐 여러개의 나무조각으로 만들어주었었다.
이때 Lego, Plank의 경우는 Bullet처럼 딱 하나의 결과만 있는 것이 아니라 여러가지 서로 다른 형태의 결과가 준비되는 시스템이기 때문에 추가적으로 Simulation을 고려한 작업을 해주어야 한다.
수업의 진행 순서이다. 1번부터 4번까지의 동일한 과정을 Bullet, Lego, Plank의 순서로 작업할 것이다. Bullet에서 Plank까지 점점 작업 난이도가 높아질 것이다.
1. Dop Network 밖에서 자료정리 (name, prep_name 등)
2. Sourcing
3. Proxy Simulation
4. High Detail ↔ Proxy (치환)
목차
1. Bullet
2. Lego
3. 나무 Plank
1. Bullet
먼저 Bullet부터 작업해보겠다.
우리가 준비해주었던 총알은 총 3가지 형태로 한번에 묶여 있었다.
Simulation에서 쓸 proxy를 부르기 위해 세 형태가 Merge된 prep_bullet을 가져가 proxy를 Blast 해주겠다.
새롭게 Geometry를 하나 생성해주겠다. 이름은 sim_bullet으로 한다.
sim_bullet에서 Object Merge에 prep_bullet을 불러온다. 그 다음 Blast로 proxy와 hard의 자료를 각각 떼어내어준다.
이제 Simulation에서 불러온 자료들을 쓰기 위한 세팅을 만들어줄 예정이다.
먼저 우리가 이용할 그릇이 RBD Packed Object이기 때문에 Pack해주어야 한다. 이때 마지막 치환 과정을 고려해주어야 하기 때문에 Pack을 하되 방식을 달리 해보겠다.
바로 Pack의 파라미터에서 Pivot Location 부분을 바꾸어주려 한다.
proxy가 Dop Network 안에서 계산이 될 때 어디를 중심에 두고 회전과 움직임을 기록할 것인지이에 쓰이는 중심이 바로 Pivot이다.
지금까지는 물체의 Bounding Box를 기준으로 Pivot을 만들어주는 Centroid 방식을 이용했었다.
그런데 오늘 작업에서는 Origin 방식을 이용함으로써 Pivot(중심)을 {0,0,0}에 두도록 하겠다.
우리가 아무리 비슷한 형태로 proxy와 hard를 따로 만들었다 할지라도, Bounding Box를 기준으로 Pivot을 찾으면 그 중심이 서로 다르다. 여기서 발생하는 오차가 크면 클수록 proxy에서 hard로 전환할 때 물체가 이상하게 움직이는 것처럼 보일 수 있다. 이 때문에 Pivot을 동일하게 {0,0,0}에 둠으로써 이러한 문제를 해결해주려 한다.
이렇게 두 물체의 회전 중심이 달라서 발생할 문제는 미리 잡아두었다.
이제 두 물체가 나중에 치환되기 쉽도록 이름을 정해두도록 하겠다.
보통 이름을 정한다고 하면, @name 정보를 만들어준다고 생각해도 좋다. 그런데 이후에 이름이 충돌할 문제를 예방하기 위해서 @name 말고도 @prep_name, @ori_name과 같은 방식으로 이름을 준비해주겠다.
Rigibody Simulation에서 Dop Network가 물체를 구분하는 방식이 몇 가지 있는데, 그 중에 가장 대표적인 것이 바로 이름(@name)이다.
이름이 다르다면 서로 다른 물체라고 Dop Network가 인지할 것이고, 만약 이름이 같다면 같은 물체로 인식하게 될 것이다.
그래서 만약 한 그릇에 이름이 같은 Object가 동시에 있다면, Houdini가 이것들을 올바르게 구분하지 못하는 상황이 올 수도 있다. 아니면, 동일한 물리 규칙을 따라야한다고 생각할 수도 있다. 그래서 기왕이면 @name은 물체마다 다르게 설정해주는 것이 좋다. 이건 이후에 배울 Constraint에서도 마찬가지이다.
@name이 만들어져 구분 가능한 상태가 되도록 Sourcing 단계에서 작업해주도록 하겠다. 대신 Simulation에 들어가기 전에는 @prep_name 또는 @ori_name과 같은 Attributes로 이름을 만들어서 Sourcing 과정까지 데리고 가도록 하겠다. 그래야 나중에 치환 과정에서 작업이 쉬워진다.
Pack 아래에서 proxy와 hard의 @prep_name을 "bullet"으로 정의해주었다.
첫 번째 순서인 Dop Network 밖 자료 준비가 완료되었다.
Dop Network를 생성해 RigidBody Simulation에 필요한 기본 세팅을 해주도록 하겠다.
이후에 Object Merge에 불러오기 쉽게 각각의 node에 이름을 지정해준다.
이제 Sop Network 안에서 Simulation 세팅을 잡아준다.
한 점에 Random한 v(속도)와 w(회전속도)를 주어 proxy_bullet에 붙여주도록 하겠다.
Geometry Spreadsheet을 보면, proxy_bullet이 @prep_name의 정보를 가지고 있는 것을 볼 수 있다.
우리가 준비한 이름인 @prep_name은 Dop Network에서 공식적으로 이름으로 인정해주는 Attributes가 아니다.
구체적으로 @name이 있어야 Dop Network가 이해하기에 구분 가능한 이름이 되는 것이다.
예시를 들자면, 우리가 @vel이라는 정보를 가지고 있다고 @vel이 @v로써 작동하지는 않는 것과 같은 이유이다.
이제 Dop Network 안에서 필요한 s@name을 준비해보도록 하겠다.
@name을 만들 때 앞서 우리가 Geometry 단계에서 가져온 @prep_name을 이용해주도록 하겠다.
Attribute Wrangle의 Input2에 proxy_bullet을 연결하여 @prep_name의 정보를 가져온다.
@name은 @prep_name에 "_"와 문자 정보로써 @Frame 정보가 들어가도록 해주겠다.
Geometry Spreadsheet을 보면, 매 Frame 마다 다른 이름이 들어오는 것을 볼 수 있다.
이제 Sop Network에서 만든 Source가 Sop Solver로써 작동할 수 있도록 해준다. 그 다음 Enable Solver로 해당 내용을 Bullet의 그릇에 담아주도록 하겠다.
결과를 보면 10 Frame에 한번씩 총알이 떨어지는 것을 볼 수 있다.
이렇게 세번째 Proxy Simulation까지의 과정이 완료되었다.
이제 proxy 결과를 바탕으로 hard 결과와 치환해주도록 하겠다.
Proxy Simulation 결과를 Geometry 단계로 불러주도록 하겠다. 이때 Dop Impot나 Object Merge를 사용해주겠다.
proxy 결과를 hard 결과를 치환해주기 위해서 Transform Pieces를 생성해준다. Input1에 고화질의 결과를, Input2에 Simulation Data를 넣어준다.
그런데 지금 이 상태로 바로 연결해준다고 해서 우리가 원하는 결과가 바로 나오진 않는다.
결과를 보면, 총알이 잘 치환되었지만 결과로 단 하나의 총알만을 보여주고 있다.
이를 위해서 여러 총알에 대해 각각 치환해주기 위해서 For-each Primitive를 사용해주도록 하겠다.
proxy에 For-each Primitive를 연결해준다.
먼저 Single Pass로 보았을 때, 각각 하나씩 총알에 대해 작업해주게 된다. 이때 Transform Pieces를 이용한다면 모든 총알에 대해서 교환이 가능해질 것이다.
그리고 Transform Pieces에서 name이 아닌 prep_name으로 치환하도록 설정해준다. 그 이유는 우리가 Dop Network 안에서 작업한 Proxy Simulation에는 name 정보가 있지만, hard의 경우는 prep_name 정보만을 가지고 있다.
지금은 1대1 치환이라 Transform Pieces가 작동이 되지만, 조금 더 안전하게 하기위해서 prep_name을 이용해주도록 하겠다.
결과를 보면 고화질 자료로 치환이 완료된 것을 볼 수 있다.
2. Lego
Simulation을 하기 위해서 Lego_Build에 어떤 내용이 준비되어 있어야 할까?
마지막 순간에 proxy 자료를 고화질 자료와 치환하기 좋게 자료를 준비해야할 것이다.
그래서 이번에는 prep_name보다도 더 원초적인 느낌이 드는 ori_name으로 Lego의 이름을 미리 저장해두도록 하겠다. 이러한 이름들은 단지 @name에서 쓰일 Attributes를 준비하는 것이라 어떻게 이름을 정할지는 본인 나름이다.
다만 Simulation에 최종적으로 쓰일 @name은 모든 물체가 단 하나라도 똑같으면 안된다는 것을 염두에 두고 작업하도록 하자.
일단은 Simulation에 들어가기 전에 @ori_name의 규칙을 정해두도록 하겠다.
레고 블럭을 보면 가로 세로의 Stud 갯수가 전부 다르게 구성되어 있다. 이를 이용하여 @ori_name의 규칙을 잡아주도록 하겠다.
이때 레고 블럭의 Detail x,y,z 값들이 이용된다.
레고를 Simulation에서 쓰기 위해서는 Packing을 해주어야 한다.
그런데 지금의 레고는 사이즈가 너무 크다. 미리 사이즈를 줄여준 다음 Pack(Origin)해주도록 하겠다.
이후에 다시 설명할텐데 Pack을 한 뒤에 사이즈를 변경해주는 것보다는, 사이즈를 먼저 변경한 뒤에 Pack해주는 것이 Transform Pieces의 치환 과정에서 올바르게 작동될 것이다.
그리고 LEGO_BUILD 안에서 Pack을 해줌으로써 필요가 없어진 밖의 Pack 과정을 제거해준다.
이제 Simulation에 이용될 예정이기에 굳이 블럭간의 간격을 나눌 필요가 없다. 해당 Attributes를 제거해 레고 블럭을 전부 겹쳐두도록 하겠다.
다시 LEGO_BUILD 안에서 작업해주겠다.
Pack 아래에 Attribute Wrangle을 달아주고 Input2에 Detail의 정보가 들어있는 node를 연결해준다.
Detail에 들어있는 x,y,z 정보를 Points Attributes로 가져와준다.
가져온 x,y,z 정보를 @ori_name의 규칙으로써 이용해주겠다.
Geometry Spreadsheet을 보면 points 마다 다른 이름의 @ori_name이 들어와 있는 것을 볼 수 있다.
이제 가장 아래에 Null을 달아 이름을 prep으로 해준다. 그 다음 Style SubNetwork로 가서 proxy로 output을 변경해준다.
sim_lego Geometry로 넘어와 작업해주겠다.
Object Merge로 prep을 불러와준다. 이때 불러온 prep이 자료가 많기 때문에 File Cache로 저장해주겠다. 자료 자체로 저장해줄 것이기에 Time Dependent Cache와 Version을 꺼준다음 Save to Disk 해준다.
proxy 내용이 저장되었다면, 다시 LEGO_BUILD로 가서 스타일을 bevel_logo로 변경해준다. 해당 자료도 sim_lego에서 Object Merge로 불러와 File Cache로 저장해주겠다.
Simulation을 위한 Geometry 안에서 proxy와 high 자료가 준비되었다.
이제 Dop Network 기본 세팅을 해주도록 하겠다.
Sop Network 안에서 그릇의 Geometry 정보와 proxy 자료를 불러와 세팅해준다. proxy를 통해 ori_name이 Dop Network 안으로 잘 들어온 것을 볼 수 있다.
만약 이 상태에서 Switch에 조건을 넣어 proxy 자료를 합류시킨다면, 한 Frame에 동시에 모든 조각이 동시에 들어오게 될 것이다. 이는 원하는 결과가 아니다. 그래서 어떤 녀석을 골라 쓸지에 대한 작업을 해주어야 한다.
지금의 상황에서는 한 블럭을 콕 집어 사용하는 것이 아니라, 랜덤하게 조각을 골라서 이용하려 한다. 이에 Sort와 Blast를 이용해 Random하게 점 하나를 떼어내어 주겠다. 만약 Sort의 결과가 항상 다르기를 바란다면 Seed에 $FF를 넣어주면 된다.
그 다음은 이름을 만들어줄 차례이다. 이번에는 Copy to Points로 점에서부터 정보를 받아오는 것이 아니라 Object 바로 아래에서 작업해주도록 하겠다.
@name은 @ori_name에 @Frame 정보를 더해주어 모든 물체가 다른 @name을 가지도록 해주겠다.
이번에는 한 위치에 레고가 계속 생성되는 것이 아니라 움직이면서 계속 생성되도록 해보겠다.
Copy to Points로 XZ Plane에서 원운동하는 점의 @P 정보를 레고 블럭에 넘겨주도록 하겠다.
Frame이 진행됨에 따라 레고 블럭이 원을 그리며 생성되는 것을 볼 수 있다.
이제 Random한 초기 속도와 초기 회전속도를 Attribute Randomize를 이용해 생성해주겠다.
그리고 Switch에서 2 Frame마다 블럭이 생성되도록 해주었다.
또한 기준이 되는 @v 값을 만들어 레고가 바닥으로 바로 떨어지는 것이 아니라 등장할 때 위쪽으로 잠시 튀어 올라가도록 묘사해주겠다.
이번엔 레고 블럭이 생성되는 수를 두 가지 방법으로 늘려보겠다.
먼저 간단하게 Switch 시스템을 복사해 Merge해서 두 시스템이 동시에 작동되도록하여 갯수를 늘려주는 방법이 있다.
그런데 이 방법에서는 @Name, @v, @w가 겹치는 부분이 생기기 때문에 한쪽의 모든 node의 Seed 값을 변경해주고 @name을 구분지어 주어야 한다.
두 번째 더 유용한 방법을 설명해보겠다.
이번 시스템에서는 몇 개를 등장시켜줄 것인가?라는 뉘앙스가 핵심이 된다.
여기서 "몇 개"에 대한 내용을 정해주기 위해서 Add로 점 하나를 생성한 다음 Attribute Wrangle을 달아 작업해주도록 하겠다.
몇 개에 해당하는 정보인 i@count를 만들어준다. 여기서 @count에 6이 쓰인다면 6개의 정보만이 출력될 수 있도록 작업해주겠다.
Attribute Wrangle을 생성해 Input1에는 proxy 정보, Input2에는 @count의 정보가 연결되도록 해준다.
proxy 정보에서의 0~5번까지의 정보만을 남기고 나머지를 지워준다면 6개의 정보만이 남게될 것이다.
만약에 point number가 (count-1)보다 큰 경우에 해당하는 모든 점들을 지워주도록하겠다.
이제 @name을 정해주려 한다.
@ori_name에 @Frame 정보와 @ptnum 정보를 모두 더해주도록 하겠다.
이 정도로 분류해주면 웬만하면 겹치는 이름이 없는 것을 Geometry Spreasheet에서 확인 가능하다.
이제 우리가 골라준 레고를 @v, @w의 정보가 있는 점에 붙여주려 한다.
그런데 이때 바로 Copy to Points로 정보를 옮겨주게 된다면 상당히 아쉬운 결과가 나오게 된다.
모든 레고가 딱 붙어서 조금 떼어내야하고 @P, @v, @w 값이 모든 points에서 동일하게 나오는 것을 볼 수 있다.
경로에 붙이되 전부 각각 다른 위치, 속도, 회전 속도를 가지게 하기 위해서 For-Each Primitive를 이용해주겠다.
Single Pass의 값을 변경해주었을 때, 블럭들이 계속 변하는 것을 보아 각각 작업이 가능하다고 판단된다.
이제 Copy to Points로 Initial Value 값을 Block에 제공해주려 한다.
이때 For-each Block의 싸이클이 돌 때마다 다른 값을 주기위해서 Metadata의 Iteration 값을 이용해주도록 하겠다.
Iteration 값은 Attribute Randomize의 Global Seed 값에 detail function으로 불러짐으로써 이용될 것이다. @P, @v, @w 모두 적용해준다.
결과를 보면 전부 다 다른 @P, @v, @w 값을 가지고 있는 것을 볼 수 있다.
Simulation 결과에서 레고 블럭이 조금 더 뭉쳐져 나오길 원한다면 Attribute Randomize(P)의 Global Scale을 낮춰주면 된다.
또한 @count 값에 Animation을 줌으로써 레고가 특정 순간에 많이 생성되었다가 어느순간 생성되지 않도록 만들 수도 있을 것이다.
이제 proxy 자료에서 고화질 자료로 치환하는 과정을 해보겠다.
Dom Import나 Object Merge로 레고의 Proxy Simulation 결과를 불러와준다.
Proxy Simulation에서의 각각의 조각에 대해 고화질 자료의 치환 과정이 필요할 것이다. For-each Primitive를 불러온다. Single Pass로 각각 한 조각씩 어떤 일이 발생하는지 확인할 수 있다.
proxy를 고해상도 자료로 변환하기 위해서 @ori_name의 정보를 들여다 보겠다.
현재 Single Pass로 선택되어 있는 proxy에서의 @ori_name의 정보와 같은 정보가 고해상도에도 필요하다.
핵심은 이러하다. 우리가 미리 준비해두었던 고화질 자료 중에 proxy 싸이클에 쓰인 @ori_name과 동일한 정보를 제외하고는 전부 제거해주도록 하겠다.
Attribute Wrangle의 Input1에 고해상도 자료, Input2에 Proxy Simulation을 연결해 앞서 말한 작업을 해주도록 한다.
이렇게 얻어진 결과를 Transform Pieces의 Input1에 넣어주고 Input2에는 Proxy Simulation을 연결해주도록 한다.
그리고 name 대신 ori_name을 치환 정보로 이용해주도록 하겠다.
결과를 보면 레고 블럭들이 고화질 자료로 잘 치환된 것을 볼 수 있다.
이번 예제에서 얻게 된 내용이다.
1. 이전에는 Sourcing에서 몇 Frame 단위로 물체의 등장을 조절했다면, 이제는 몇 개나 등장할지 능동적으로 조절할 수 있는 방법을 배웠다.
2. 여러 방식으로 조각들을 준비하고 활용하는 것이 가능해졌다.
3. 나무 Plank
이제 나무 Plank를 작업해보겠다.
이번에 눈여겨볼 것은 준비된 자료의 상황에 따라 조금씩 필요한 세팅이 다르다이다.
우리가 앞서 모델링해둔 나무 Plank 자료를 가지고 Simulation을 하려 한다. 이에 하나씩 시스템에 수정해주려 한다.
1. 불필요하게 나열된 Plank들을 모두 {0,0,0}의 위치 정보로 옮겨준다.
2. Pack하는 과정에서 Origin 방식을 선택해 원점을 기준으로 Pivot이 생기게 해준다.
3. Transform과 Pack이 놓이는 순서를 수정해준다.
4. @name을 준비해준다.
일단은 어디까지가 proxy이고 어디까지가 고화질 결과인지 확인해보겠다.
해당 작업의 순서는 이러하다. 서로 다른 모양의 Box들을 만들어주고 그 Box들의 갯수만큼 고화질 결과가 출력되게 시스템을 준비해주었다. 그리고 마지막에는 처음에 제공한 Box와 고화질 자료의 Bouding Box 크기까지 맞춰주었다.
여기서 서로 다른 모양의 Box까지의 결과를 proxy로 이용해주겠다. 그리고 마지막 결과를 high라고 해주겠다.
이전의 Bullet, Lego 작업에서는 지금 순서에서 이름에 대한 작업을 해주었었다.
그러나 Plank에서는 이름보다 먼저 Box의 크기 조절에 대한 부분을 건드려보려 한다.
원래 처음에 제공된 Box의 크기는 정육면체이다. 이 정육면체를 Pack해준 뒤 Copy to Points에서 Size의 내용이 활용되면서 Pack된 Box의 모양이 랜덤하게 바뀌게 된다. 그리고 For-each에 들어가면서 Unpack 과정을 거치게 된다.
여기서 Unpack을 한 이후 나중에 다시 Packing되는 과정에서는 문제가 없다. 그런데 처음에 정육면체를 이용해서 Packing한 다음 모양을 바꿔준 것이 문제가 될 수 있다. 이에 대해 설명해보겠다.
우리는 proxy의 형태에서 hard로 치환되기를 바란다. Transfom Pieces가 쓰일 것이고, 두 녀석 모두 Pack이 된 상태이다.
그런데 여기서 중요한 것은 이 proxy가 최초로 Packing된 상태여야 한다.
Packing된 어떤 물체를 변형해서 proxy로 쓰면 올바르게 치환이 안될 수도 있다.
우리는 proxy와 같이 직육면체의 물체를 Pack한 것이 아니라, 처음에 정육면체를 Pack하여 이용하였었다. 이미 Pack된 정육면체의 모양을 바꾸면서 proxy와 같은 모양을 잡은 것이었다.
이때 Houdini는 proxy를 정육면체에서의 가로 2배, 세로 3배의 물체로 인식하게 된다.
우리는 Transform Pieces로 proxy와 hard를 바꾸려고 한다. 이때 hard로 교환하기 위한 비교대상으로 proxy가 아닌 Pack된 정육면체가 기준이 된다.
그래서 proxy가 가지고 있는 가로 2배, 세로 3배의 내용이 치환 과정에서 hard로 넘어가면서 hard의 사이즈가 커지게될 수도 있다.
요점은 proxy로 쓰일 내용이 Original 자료여야 한다. 실제 기준이 있고 크기변환을 하여 만든 자료는 치환 과정에서 사이즈에 문제를 줄 수 있기 때문에 proxy로 쓰기가 곤란하다.
다시 후디니로 돌아가 proxy로 쓰인 부분을 두 가지 방법으로 수정해보겠다.
먼저 쉬운 방법부터 하겠다.
Copy to Points에서의 결과를 기준으로 각각의 결과에 대해 Unpack으로 압축을 풀어준 뒤 다시 Pack해주겠다.
Unpack을 해준 뒤 다시 Pack해줌으로써 마지막에 Pack된 시점이 기준으로 잡혀 이제 치환을 할 때 문제가 되지 않을 것이다.
만약 여기에 이름을 만들어주고 싶다면 Pack 아래에 Copy to Points로 이름의 정보를 옮겨주면 될 것이다.
우리가 핵심적인 문제로 보는 것은 Pack된 이후에 새롭게 크기를 바꿔주었다는 점이다. 그래서 Packing의 시점을 뒤로 미루어주도록 하겠다.
먼저 Pack을 지워준다. Pack이 되어 있지 않은 상태에서도 Size가 잘 변경된 것을 볼 수 있다.
이제 Assemble node를 Copy to Points 아래에 달아 이어져 있던 물체들을 각각 따로 구분지어주도록 하겠다.
Create Packed Primitives를 체크해주겠다. Primitives에서 piece의 정보가 사라지고, 여러개의 piece로 이어져있던 조각들이 모두 따로 Packing된 것을 볼 수 있다.
Geometry Spreadsheet의 Points를 보면, piece의 정보가 @name에 저장되어 있는 것을 볼 수 있다.
이때 우리는 @name을 Geometry 단계에서는 이용해주지 않을 예정이기에, Attribute Delete로 @name의 정보를 지워주겠다.
그리고 새롭게 Attribute Wrangle로 @ori_name과 @prep_name을 만들어주겠다.
새롭게 만들어준 @ori_name과 @prep_name을 Attributes Copy로 Plank에 넘겨주도록 하겠다.
이렇게 만들어진 자료를 proxy로 사용하겠다.
이때 고화질의 결과를 보면 앞의 작업으로 인해 @Cd의 내용이 빠진 것을 볼 수 있다.
당장은 색의 정보가 필요 없다. 이에 색 없이 작업을 모두 마친 뒤에 마지막에 Color Palette를 가지고 조각별로 색을 줄 수도 있을 것이다.
이러한 이유로 proxy 단계에서도 색을 쓰지 않겠다. color에 관여한 Attributes Wrangle을 꺼준다.
이제 모든 Plank의 위치를 한 점으로 겹쳐주고 Pivot 또한 원점으로 통일시켜주겠다.
Copy Stamp에서 Translate의 x값을 0으로 변경해준다.
그리고 모든 Pack node의 Pivot Location을 Origin으로 변경해주겠다.
proxy에서의 Bounding Box와 고화질 결과에서의 Bounding를 맞추는 과정에서 Scale에 변화를 주는 부분이 있다.
혹시 모를 오류를 방지하기 위해서 마지막에 Unpack 해준 뒤 다시 Pack해주겠다.
이때 다시 Pack해주면서 @ori_name과 @prep_name의 정보가 사라져버렸다. 다시 Attribute Copy로 정보를 받아와준다.
Geometry Spreadsheet을 보면 high에서와 proxy에서의 정보가 같아진 것을 볼 수 있다.
이제 새롭게 sim_plank Geometry를 생성해 Simulation 세팅을 잡아주도록 하겠다.
Object Merge로 proxy와 high 자료를 불러와 File Cache로 각각 저장해준다.
Dop Network와 Sop Network에서 기본 세팅을 해주겠다.
불러온 proxy 자료에서의 @prep_name 정보를 랜덤하게 하나만 뽑아서 사용하도록 하겠다.
Attribute Wrangle을 proxy 아래에 달아 @name 작업을 해주겠다.
@prep_name에 @Frame을 더해준 정보가 @name이 되도록 해주겠다.
그 다음 Copy to Points로 랜덤한 @P, @v, @w의 정보를 proxy에 넘겨준다.
Simulation이 잘 작동하는 것을 확인할 수 있다.
이제 Dop Import로 Proxy Simulation 자료를 불러와 고화질 자료로 치환해주도록 하겠다.
먼저 우리가 얻은 각각의 조각에 대해 @prep_name이 같은 고화질 조각이 어떤 것인지 알아낸다.
그 다음 얻어낸 고화질 조각을 Transform Pieces로 proxy에 치환해주도록 하겠다.
잘 치환된 나무 Plank를 볼 수 있다.
'TWA Houdini1 > Rigidbody' 카테고리의 다른 글
TWA 후디니 1 RIGIDBODY_12 : AAD 개념과 세팅 & 진자운동 (0) | 2023.04.07 |
---|---|
TWA 후디니 1 RIGIDBODY_11 : Constraint 기본 개념 (0) | 2023.04.06 |
TWA 후디니 1 RIGIDBODY_08 : Procedural lego modeling (0) | 2023.03.31 |
TWA 후디니 1 RIGIDBODY_07 : Custom SOURCING + Solver 복습 (0) | 2023.03.27 |
TWA 후디니 1 RIGIDBODY_06 : Simulation 데이터 부르기 + 총알 모델 (0) | 2023.03.25 |