https://www.twahoudini.com/course/rigidbody1
HOUDINI1_ RIGIDBODY
3️⃣ 출동 SIMULATION 기초 이론부터 심화된 내용을 공부합니다. 또한 자동차를 이용한 리깅 시뮬레이션 BASIC을 훈련합니다.
www.twahoudini.com
RigidBody07에서 배울 핵심 내용은 RigidBody Simulation에서 쓸 물체를 Sourcing하는 방법이다.
물체를 그릇에 올리는 법, 쉽게 말해서 Object Sourcing 방법이 앞으로의 수업에서도 뼈대로서 활용될 핵심 기술 중 하나이게 되도록 몇 강의 안에 RigidBody Sourcing에서 자유로워져야 한다. 한번의 수업만으로는 기술을 익히기에는 난이도가 있다. 그래서 몇 강의 동안 난의도를 올려가면서 동일한 핵심 과정을 반복할 예정이다. 이 과정을 통해 좀 더 복잡한 상황에서도 올바르게 문제를 해결할 능력을 기를 수 있게 될 것이다.
지난 시간에 핵심 기술을 2개 배웠었다.
1. Geometry Spreadsheet 이해하고, 원하는 자료 Object Merge로 불러내기
2. Tranform Pieces
지난 시간에 배운 내용에서는 어려울게 없었기 때문에, 고려할 것이 특별히 많지 않았다. 오늘 새롭게 배울 Sourcing하는 법을 쫓아가다보면 지난 시간에 배운 2가지 기술들을 좀 더 다양한 상황에서 어떤 판단을 내려야할지 감이 설 것이다.
오늘의 핵심은 그릇에 물체를 올리는 방법이다. 여기서 그릇은 RBD Packed Object 자체를 뜻한다.
RBD Packed Object에 쓰고 싶은 물체를 어떻게 로드하느냐를 배울 것이다.
그런데 이 과정을 올바르게 수행하려면, Houdini Starter에서 겪은 고난주간의 감각이 필요하다. 즉, Solver node를 다룰 줄 알아야한다.
목차
1. Switch node를 활용한 스킬
2. Sop Network, Sop Solver, Enable Solver
3. 예제 1
4. 예제 2
1. Switch node를 활용한 스킬
먼저 Dop Network 없이 Solver만 가지고 시간에 따라 물체를 등장시키는 작업을 해보겠다.
Play를 해줌에따라 어떤 규칙에 의해 Box들이 등장하고, 색의 차이 때문에 잔상이 남는 듯한 효과가 있다.
생성될 Box들은 Pack이 되어 있어야하고, 생성되는 Box들마다 각각의 고유한 이름을 가지고 있어야 한다.
일단은 무언가가 Solver에 의해 등장하느냐 하지 않느냐가 중요하다.
Solver 작동의 핵심은 이전 Frame의 결과를 바탕으로 Solver 안에서 한 싸이클이 시작되고, 해당 싸이클의 결과를 Solver의 결과로 쓰는것이다.
지금 해주고 싶은 것은 15 Frame이 되었을 때 점 하나가 생성되었으면 한다.
Switch node를 생성해 Null과 Add를 연결해준다.
Switch node에 $F==15를 입력하여, 15 Frame이 되었을 때 Switch node가 1의 값을 가져 Null에서 Add로 변경되도록 해주었다.
Switch를 Merge로 Prev_Frame의 내용과 연결해주면서 15 Frame에서 point가 선택되었을 때 point가 생성되는 결과가 나오도록 해주었다.
만약에 24 Frame에 다른 점이 하나 더 추가되기를 원한다면, 해당 Switch 시스템을 하나 더 생성해 Merge에 연결시켜준다.
그 다음 Switch 값을 $F==24로 변경해 24 Frame일 때만 point가 생성되도록 해주었다.
이제 본론으로 들어가겠다.
Solver를 하나 생성해 그 안에서 Prev_Frame node를 제외한 쓰지 않는 Input node들을 제거해주도록 하겠다.
어떤 시간 결과에 의해 Box가 추가되기를 원한다.
한 싸이클이 돌 수 있도록 Null을 달아주고, 결과로 보기 위해 Box를 생성해 Pack해준다.
특정 타이밍에 Box가 Solver의 결과로서 등장할 수 있게 만들기 위해서 Switch를 사용하겠다.
Null을 생성해 원하지 않는 타이밍에는 내용이 존재하지 않도록 해주겠다.
Null을 Switch의 첫번째 순서로 넣어준다. 두 번째 순서로 방금 만들어둔 Pack된 Box를 넣어준다.
Switch에 $F==20의 값을 넣어 20 Frame에 Box가 생성되도록 해주겠다.
Solver의 Geometry Spreadsheet을 보면 Pack되어 한 점으로 묘사된 Box 하나가 20Frame에 생성되는 것을 볼 수 있다.
Box에 s@name으로 이름을 지어줄 수도 있다. 이는 나중에 여러 물체를 생성할 때 꼭 필요한 내용이다.
이제 물체를 합류시키는 규칙을 바꿔보겠다. 하나의 Frame에서만이 아닌, 매 Frame에 한번씩 Box가 선택되도록 해주겠다.
Switch에 $F%4==0을 넣어 Frame을 4로 나누었을 때 나머지가 0인 순간마다 Box가 선택되도록 해주겠다.
Solver의 Geometry Spreadsheet에서 결과를 확인해보면, 매번 4 Frame마다 Box가 하나씩 생성되는 것을 볼 수 있다.
이제 등장하는 위치가 서로 다르게 나타나 겹쳐지지 않도록 해주겠다.
Box가 Switch에 합류되는 시점에 Copy to Points로 위치를 바꿔서 등장시켜 보겠다.
Add로 점을 하나 생성해 시간에 따라 XY Plane에서 원운동을 할 수 있도록 position을 세팅해준다.
Copy to Points의 Input1에 Box의 내용을, Input2에는 원운동하는 점을 넣어 준다. 그 다음 Copy to Points를 Switch의 Input2에 연결해준다.
Simulation을 돌려보면, Box가 한 곳에 겹쳐지지 않고 원운동하는 point의 궤적에 매 4 Frame 마다 생성되는 것을 볼 수 있다.
이번엔 Box에 색을 넣어 잔상을 만들어보려한다.
Box가 Pack이 되어 색의 정보를 가지고 있지 않기 때문에, 먼저 Copy to Points 아래에서 @Cd 값을 {1,1,1}로 정의해준다.
이제 시간이 지날 때마다 Box에 색이 빠지는 세팅을 만들어주겠다.
Prev_frame 아래에 Attribute Wrangle을 달아, 이전 결과에 대해서 @Cd 값이 0.8씩 곱해지도록 식을 써준다. Prev_frame 아래에서 작업을 해줌으로써 첫 Box는 색이 빠지는 효과를 받지 않게 된다.
지금까지 만들어본 Box가 등장하는 세팅이 RigidBody에서 물체를 Sourcing할 때 쓰는 핵심 기술이다. 이 기술을 자유롭게 다룰 수 있다면, RigidBody를 다룰 수 있는 실력이 훨씬 풍성해질 것이다.
이번에는 Dop Network 밖에서처럼 미리 상자와 상자가 붙을 점을 만들고 Object Merge로 필요한 정보를 불러서 Solver 안에서 작업을 하는 것처럼 묘사해보겠다. 보기 좋게 정리하겠다는 뜻이다.
이미 정보를 가지고 있는 점이 Copy to Points의 과정에서 정보를 넘긴다는 느낌으로 연결을 바꿔주겠다.
Name과 Cd 정보를 Add 밑으로 옮겨준다.
Pack된 Box를 Geometry 단계로 옮겨준 다음, Solver 안에서 Object Merge로 불러온다. Add도 같은 작업을 해준다.
Object Merge들을 다시 Copy to Points에 연결해준다.
결과를 보면 Simulation이 잘 작동하고 있는 것을 볼 수 있다.
2. Sop Network, Sop Solver, Enable Solver
이제 Dop Network 안에서 RigidBody Solver로 이와 같은 작업을 해보겠다.
방금 배운 스킬을 활용해서 허공에서 계속해서 물체가 생성되는 RigidBody Simulation을 만들 예정이다.
RigidBody 강의 초반에 RigidBody Solver에는 Sourcing을 위한 node가 마련되어 있지 않은 것이 특이사항이라 언급했었다.
우리가 Particle이나 Volume 세팅을 할때는 Input3에 Source에 대한 정보가 들어갔었다. 하지만 RigidBody에는 이와같이 Source를 활용한다에 대한 node가 없다. 이것을 Custom하게 직접 만들어줄 예정이다.
지금까지는 RBD Object의 SOP Path에 물체를 지정해주는 방법으로 링크를 걸어줬었다. 그리고 그 물체는 Dop Network 밖에서 미리 준비해주는 방법이었다.
그런데 지금 배울 과정에서는 굳이 RBD Packed Object에서 물체를 연결해줄 필요가 없다. Solver를 이용해서 직접 그릇에 물체를 올릴 것이기 때문이다.
일단은 이때 필요한 새로운 node들을 전부 꺼내 설명해보겠다.
우리는 이 세 node들을 이용하여 마치 RBD Packed Object에 물체를 올리는 Source 제공 node처럼 이용해볼 예정이다.
1. Sop Network : Sop Solver와 엮어서 물체를 등장시켜줄 것이다.
2. Sop Solver : Sop Network 없이 Sop Solver 하나만으로도 물체를 등장시켜줄 수 있다. 하지만 Sop Solver를 다룸에 있어 어려움을 느낄 수 있는 부분이 있기에 Sop Network와 같이 사용해주겠다.
또한 Sop Solver는 Geometry 단계의 Solver와 기능이 같기 때문에 출력 결과가 하나라는 점 또한 아쉽기에 Sop Network와 같이 사용된다.
3. Enable Solver : 어떤 그릇에 대해 물체를 올리는 과정을 수행할지를 정해주는 node이다. 물체를 담는 그릇이 늘어나면 이에 따라 Enable Solver 또한 더 많이 필요하게 될 것이다.
Enable Solver의 또 다른 역할로는 연결된 Sop Solver의 작동 여부를 정해줄 수 있다.
Rigid Body Solver 계산을 하다가 마지막에 하나만 더 계산을 추가해준다는 느낌으로 Rigid Body Solver의 Input3 Post-Solver에 Sop Solver를 연결해주겠다.
Sop Solver 안을 보면 미리 네 가지 node가 준비되어 있는 것을 볼 수 있다. dop_geometry를 제외한 당장은 쓰지 않는 세 개의 node를 먼저 지워주고 시작하겠다.
우리가 그냥 Solver에서 물체를 등장시킬 때, Solver 세팅을 이전 Frame의 결과에 특정 타이밍에 원하는 물체를 Merge로 합류시켜 주었었다.
지금 남아있는 dop_geometry는 그냥 Solver의 Prev_Frame과 똑같다. 그래서 우리가 원하는 Solver 세팅을 Sop Solver로 Rigid Body Solver 뒤에 후작동시킬 수 있다.
이전처럼 20 Frame에 Box가 등장하는 시스템을 Sop Solver에서 만들어보겠다. 이때 비교를 위해 그냥 Solver에도 똑같은 시스템을 적용시켜주겠다.
Ground Plane을 끄고 Dop Network에서의 결과를 보면, 20 Frame에 Box가 생성되어 중력에 의해 아래로 계속 떨어지는 것을 볼 수 있다.
그냥 Solver에는 중력 세팅이 없어, 20 Frame에 그냥 Box만 생성된 것을 볼 수 있다.
이로인해 Sop Solver에서의 작업이 그냥 Solver에서의 작업과 동일하다는 것을 알 수 있다.
이번에는 40 Frame에 새로운 물체가 추가될 수 있도록 해주겠다.
Null, Switch, PlatonicSolids를 연결해 40 Frame에 PlatonicSolids가 선택되도록 세팅해주었다. 그 다음 Switch node를 Merge에 연결해주었다.
결과를 보면, 20 Frame에는 Box가 40 Frame에는 피라미드가 생긴 것을 볼 수 있다.
만약 Sop Solver를 쓰지 않고 20 Frame에는 Box가 40 Frame에는 피라미드가 생기는 것을 묘사하려면 어떻게 해야 할까?
먼저 필요한 Pack된 Box와 Platonic Solids부터 Geometry 단계에서 만들어준다.
그리고 Dop Network 안에서 물체의 수에 맞게 RBD Packed Object를 두 개 만들어준다. 그릇마다 하나씩 물체를 링크해준다.
이제 각각의 물체가 등장하는 타이밍을 변경해주기 위해서 Creation Frame을 이용해볼 예정이다.
11 Frame에 물체가 생성되는 것을 원하지 않는다면 Creation Frame에 Delete Channel을 해준 다음, 원하는 등장 Frame을 입력해주도록 한다.
20, 40을 각각 적어주고나서 결과를 보면 아까와 같은 결과가 나타난 것을 볼 수 있다.
만약 매 4 Frame마다 물체가 생성되기를 원한다면, 여러 RBD Packed Object를 생성할 수도 있을 것이다. 그러나 생성될 물체의 수가 많아질수록 이러한 단순 작업은 어려워지기 때문에, Sop Solver가 필요한 것이다.
Sop Solver 안에서 Box가 선택될 횟수를 %(modulo)를 이용해 4 Frame마다 생성되도록 해준다.
결과를 보면 4 Frame마다 생성돼 중력에 의해 떨어지는 Box들을 볼 수 있다.
이때 RBD Packed Object의 그릇이 두 개이기 때문에 결과를 본다면 Box가 중복으로 생성되는 결과가 나오게 된다.
Geometry Spreadsheet을 보면 A, B 둘 다 똑같이 Box의 정보가 들어와 있는 것을 볼 수 있다.
그래서 중복이 되지 않고 우리가 원하는 그릇에 원하는 Box를 올바르게 넣기위해서 Sop Solver와 함께 Sop Network, Enable Solver가 필요하게 된다. 해당 node들이 통째로 Sourcing의 용도로써 이용되는 것이다.
먼저 Sop Network와 Sop Solver를 다루어보도록 하겠다.
우리는 Sop Solver 안의 dop_geometry가 어떠한 정보를 어떻게 불러오고 어디에 물체를 추가해서 더해주는지 확신이 서지 않는다.
그렇기 때문에 구체적으로 원하는 정보를 써서 불러오고, 새로운 것을 추가해줄 예정이다. 이 작업을 Sop Solver가 아닌 Sop Network에서 해주도록 하겠다.
A 그릇의 Geometry 내용은 Object Merge로 불러온다. Object Merge에 주소를 쓸 때 Dop Network 바로 뒤에는 /가 아닌 :를 써야 한다. 지금 불러온 Object Merge의 내용이 Sop Solver에서의 dop_geometry와 같다고 보아도 좋다.
Output의 위치에 Null을 만들어 이름을 A_update라 해주겠다.
그 다음 20 Frame에 Box가 합류되도록 세팅을 잡아준다.
지금 결과를 보면 작동하지 않는 것을 볼 수 있다. 그 이유는 Sop Solver에서 세팅을 한 것이 아니라, Sop Network에서 작업을 해주었기 때문이다.
이때 우리는 Sop Network에서 준비한 시스템을 마치 Solver인 것처럼 작동하게 만들 수 있다. 이를 위해서 Sop Solver node의 파라미터를 보아야한다.
Sop Solver의 파라미터에서 Use External SOP를 체크해준다. 그 다음 SOP Path에 방금 만든 Sop Network에서의 Output 역할을 하는 A_update의 주소를 입력해준다.
결과를 보면 20 Frame에 새로운 Box가 생성되면서 중력에 의해 떨어지는 것을 볼 수 있다.
이제 우리가 A 그릇에 대해 작업했다는 쐐기를 박아줄 예정이다. 이 작업을 Enable Solver에서 해주도록 하겠다.
Enable Object의 오른쪽 화살표를 누르면 선택할 수 있는 그릇이 나온다.
이때 A 그릇을 선택해준다면, Box가 합류되는 작업이 A 그릇에 대해서만 이루어질 것이다.
만약 B 그릇에 대해 작업하기를 원한다면, Enable Object를 B로 선택해준 뒤 Sop Network 안의 Object Merge의 주소를 B로 변경해주어야 할 것이다.
이 말은 즉슨 A와 B를 따로 작업해줄 수 있다는 뜻이다.
이번에는 방금 전과 같은 세팅을 하나 더 만들어서 B에 Box 대신 피라미드를 올려보겠다.
Object Merge에 B의 Geometry 정보를 불러와주었다.
$F==36일 때 Pack된 피라미드가 합류되도록 해주었다.
Enable Solver의 Enable Objects에 B를 입력해주었다.
Geometry Spreadsheet을 보면 A의 20 Frame에 Box가 생기지만 36 Frame에는 피라미드가 생기지 않고, B의 20 Frame에 Box가 생기지 않지만 36 Frame에는 피라미드가 생기는 것을 볼 수 있다.
오늘 배운 셋업의 특징
1. RigidBody를 Sourcing하는 형태로 만든다.
2. Dop Network 안에서 Sop Solver를 쓴다.
3. Geometry Spreadsheet의 구체적인 정보를 가져와서 쓴다.
3. 예제 1
오늘 배운 셋업을 구체적인 예제 목표를 잡고 만들어보겠다.
1. 지면보다 높은 곳에서 새로운 Box들이 합류된다.
2. 4 Frame에 한번씩 Box가 등장한다.
3. 등장과 함께 위로 날아오른다.
4. 날아오르면서 회전하는 것을 볼 수 있다.
5. Box들은 각각의 고유한 이름을 가지고 있어야한다. 그래야 RigidBody Solver가 계산함에 있어서 헷갈려하지 않을 것이다.
6. 모든 Box들을 한 그릇에 넣어준다.
Dop Network에서 기본세팅을 해준다. RBD Packed Object의 이름을 plate라 하겠다.
plate 그릇에 어떠한 시간 규칙에 따라 물체가 합류되도록 해주겠다.
Sop Network에서 Object Merge로 plate의 Geometry 정보를 불러온다. Null을 달아 plate_update라 해준다.
Switch로 10 Frame마다 Pack된 Box가 생성되도록 해주겠다.
Sop Solver의 SOP Path에 plate_update를 연결해준 다음 결과를 보겠다.
중력에 의해 아래로 떨어지는 Box를 볼 수 있다.
Box에 Copy to Points로 점의 정보를 붙여주도록 하겠다.
이때 Add의 position을 y축으로 5만큼 높여 Box가 생성될 위치를 변경해준다.
그 다음 Add 밑에 name에 대한 정보를 붙여준다. 이때 Frame에 따라 name이 달라지도록 해준다.
다음은 Attribute Wrangle로 초기 속도(v)에 대한 정보를 생성해준다. y축으로 7의 속도로 시작하게 해주었다.
초기 회전속도(w)도 추가해주었다. 전체 방향으로 2씩 회전하도록 해주었다.
이때 Initial Value 값을 적용시키기 위해서는 RBD Packed Object의 Inherit Velocity from Point Velocity를 체크해주어야 한다.
결과를 보면 Box가 생성될 때 씹히는 부분이 있다고 느껴진다. 이러한 점을 수정하기 위해서 vel에 Random한 값을 주겠다.
vel에 대한 정보 아래에 Attribute Randomize를 달아준다.
원래 가지고 있는 v에 대한 정보에 Add Value 해줌으로써 Random 값을 쓰도록 하겠다. Distribution을 Inside Sphere로 변경해준다. 그리고 Options에서 Global Seed를 매 Frame 다른 결과를 얻을 수 있도록 설정해준다.
결과를 보면 다양한 방향으로 Box가 생성되는 것을 볼 수 있다.
이때 Box가 생성되는 방향의 폭이 마음에 들지 않는다면 Global Scale을 수정해주도록 한다.
다음은 Box의 Size를 Random하게 만들고 색도 변경해보겠다.
Box 아래 Pack 위에 Color를 달아 색을 입혀준다.
이제 points가 가지는 pscale 값을 매 순간 Random하게 만들어주려한다.
w에 대한 내용 아래에 Attribute Randomize를 달아 pscale에 대해 Random한 값을 주겠다. 이때 Operation은 Set Value로 해주겠다.
pscale 값이 0이 되면 Box가 사라져 보이기 때문에, Min Value를 0.2로 두도록 하겠다. 이때 더 큰 Box를 원한다면 Max Value 값을 높여주도록 한다.
Options에서 Global Seed 값을 Frame에 따라 달라지게 해준다.
이때 좀 더 빠르게 Box들이 나오길 바란다면, Switch node의 값을 변경해주면 된다.
결과를 보았을 때 같은 위치에서 Box가 생성되어 씹히는게 아쉽기 때문에 위치에도 변화를 주겠다.
Add node 아래에 Attribute Randomize를 달아 원래의 P 정보에 Random한 값을 Add Value 해준다.
Distribution을 Inside Sphere로 변경해주고, Global Seed에 $FF를 입력해준다.
이때 Point가 생성되는 위치의 범위를 변경해주고 싶다면, Global Scale을 조절해주면 된다.
4. 예제 2
다음 예제이다.
1. 두 개의 시작점에서 서로 다른 Box가 나타나 충돌하고 상호작용한다.
2. Box들 아래에는 Rubbertoy가 있다.
3. 노란 Box, 파란 Box, Rubbertoy가 각각 다른 그릇에 담긴다.
Dop Network 안에서 RBD Packed Object를 3개 생성하여 Merge한다.
그릇에 갯수에 맞게 Sop Network, Sop Solver, Enable Solver를 3세트 생성해준다음 Merge하여 Rigid Body Solver의 Input3에 연결해준다.
각각의 Sop Network 안에서 Object Merge로 각각의 정보를 불러온다.
Box의 합류 조건을 설정해주고, 색을 입혀준다.
각각의 P, name, v, w를 설정해주고 P와 v값에 Random한 값을 준다.
Sop Solver의 Sop Path에 Sop Network에서의 Output을 연결해준다.
각각의 Enable Solver에 내용이 담길 그릇을 입력해준다.
Toy의 경우도 똑같이 작업해준다.
사이즈가 작은 경우 Pack node 위에 Transform을 달아 Size를 조절해준다.
예제 2의 결과이다.
https://youtu.be/1wRUOh3o76M?t=64
마지막으로 오늘 배운 것들을 이용해 데드풀2의 예고편에 나온 총알이 쏟아져 나오는 효과를 간단하게 만들어 보았다.
'TWA Houdini1 > Rigidbody' 카테고리의 다른 글
TWA 후디니 1 RIGIDBODY_09 : 총알+레고+플랭크 소싱으로서 시뮬레이션하기 (0) | 2023.03.31 |
---|---|
TWA 후디니 1 RIGIDBODY_08 : Procedural lego modeling (0) | 2023.03.31 |
TWA 후디니 1 RIGIDBODY_06 : Simulation 데이터 부르기 + 총알 모델 (0) | 2023.03.25 |
TWA 후디니 1 RIGIDBODY_05 : 기본훈련 Domino Simulation (0) | 2023.03.25 |
TWA 후디니 1 RIGIDBODY_04 : Initial Data & Physical (1) | 2023.03.25 |