https://www.twahoudini.com/course/rigidbody1
지금까지 배운 내용을 훑고 지나가겠다.
우리는 RigidBody Simulation을 배우기 위해서 Bullet 엔진을 활용한 Simulation을 활용할 것이다.
Rigid Body Solver를 씀에 있어 밖에서 물체를 부를 때 이제부터 Packed Object를 쓸 것이다. 즉, 충돌 조건을 쉬운 조건으로 바꿔서 빠르게 계산하겠다는 것이다.
Packed Object로 Dop Network에 자료를 부르면 기본적으로 주어지는 세팅이 있다. P, Rotation, Velocity, Angular Velocity와 같은 정보들을 Initial 정보라고 한다. 우리는 이러한 값을 Dop Network 밖에서도 만들어줄 수 있다.
또한 Bounce, Density or Mass, Friction와 같은 값들도 Dop Network 안에서 조절해주는 것이 아닌, 밖에서 물체마다 미리 설정해줄 수 있다. 각각의 Pack된 물체에 우리가 원하는 초기값과 물리값은 Point Attribute 저장할 수 있다.
오늘은 지난 시간에 만들려고 했던 예제를 이어서 진행하려 한다. 여기서 더 자연스럽게 Pack된 자료를 Simulation할 때 고려할만한게 무엇이 있는지 그리고 Pack을 어떻게 다루어야할지에 대한 여러 접근들이 나올 것이다.
이 방법을 작업에 쓰기 위해 외우는 것이 아닌, 여러 방법으로 접근하고 해결해가는 것을 쫓아가며 유연함을 기른다에 초점을 맞추어야 한다.
목차
1. Initial&Physics에 Random한 값 주기
2. s@name
3. Domino, Tangent
1. Initial&Physics에 Random한 값 주기
RigidBody04에서 만들었던 공이 날아와 Box에 부딪히는 Simulation을 랜덤하게 여러개 복제해주려 한다.
지난 시간 사용했던 Sphere와 어디에 색을 줄지에 필요한 Group을 가져와 사용하겠다. 그리고 색을 추가하지 않은 상태에서 Pack을 해주겠다.
그 다음 Copy to Points로 Sphere를 점에 붙여주도록 하겠다.
이제 Sphere가 어떠한 규칙에 의해서 복제가 되게 해주려한다. Copy Stamp를 Add에 연결해 x축으로 2만큼씩 이동하면서 5번 복제되도록 해준다.
다른 방법으로 Circle을 이용할 수도 있다. ZX Plane으로 두고 Add로 점만을 남긴다. 해당 점들을 가지고 Copy to Points를 한다면 둥글게 놓여진 Sphere들을 볼 수 있다.
Copy to Points 아래에 Null을 달아 pack_sphere라 하겠다.
일단은 Box를 만들지 않고 Simulation을 작동시켜 보겠다.
Dop Network 안에서 RBD Packed Object, Rigid Body Solver, Ground Plane, Gravity Force를 연결해준다.
Geometry 단계에서 만들었던 pack_sphere를 RBD Packed Object에 불러온다.
Add 아래에 Attribute Wrangle을 달아 위치를 바꿔보려 한다.
모든 위치 정보에 vector 값을 더해주어 위치를 변경해주겠다. y값을 높여 위에서 떨어지도록 해주겠다.
Simulation을 작동시키면 떨어진 다음 Bounce가 있고 약간 굴러가는 것을 볼 수 있다.
Dop Network 안으로 들어가서 우리가 이용하고 있는 Sphere의 충돌 조건을 바꿔주려한다.
Sphere의 Geometry Reprentation을 Convex Hull에서 Sphere로 바꿔 좀 더 가볍게 이용해주겠다.
Simulation을 작동시키면 기대한대로 떨어진 다음 Bounce가 있고 제자리에 멈추는 것을 볼 수 있다.
이번에는 각각의 Sphere가 지면과 충돌했을 때 서로 다른 높이로 튀어올랐으면 한다. Pack된 Sphere들이 서로 다른 @bounce를 가지게 해주겠다.
in_pos 아래에 Attribute Wrangle을 달아준다.
rand function으로 모든 점이 서로 다른 @bounce 값을 가지도록 해주겠다.
이제 Random한 @bounce 값을 가진 점들에 Pack된 Sphere를 붙여준다.
Simulation을 작동시키면 0~1 사이의 Random한 Bounce 값에 의해 랜덤하게 튀어오르는 Sphere들을 볼 수 있다. 이때 떨어지는 높이가 높아진다면 더 높이 튀어오르게 된다.
다음은 각각의 Sphere가 가지는 Bounce 값에 따라 서로 다른 색을 가질 수 있도록 해주겠다.
@bounce 값은 모두 0~1 사이의 값으로 구성되어 있다. chramp를 이용하여 해당 값들을 색으로써 표현해주겠다.
Infra-Red를 이용하여 무지개색을 가지도록 해주겠다. 이때 0이 붉은색 1이 보라색을 띠게 해준다.
Simulation을 작동시키면 붉은색에서 보라색으로 갈 수록 점점 더 높이 튀어오르는 Sphere를 볼 수 있다.
방금 Bounce 값에 따라 적용된 색이 띠의 형태로 Sphere에 적용되게 해주겠다. 지난 강의에서 가져온 Group을 이용하겠다.
이번에는 작업 방식이 조금 달라질 예정이다. 지금까지는 이미 Pack된 Object에 필요한 정보를 덧씌워주는 느낌이었다면, 이번에는 Pack을 하기 전에 색을 서로 다르게 주고 그 뒤에 Pack을 해주겠다.
일단은 점을 하나만 떼어내서 따로 작업해보도록 하겠다.
Copy to Points를 이용해 점이 가진 Cd 정보를 Sphere에 넘겨준다. 그런데 지금의 결과는 띠처럼 묘사되지 않았다.
여기서 주목할 것이 있다면 우리가 앞서 만들어둔 Group은 Primitives 그룹이다. Point로써 색이 활용되는 것이 아니라 Primitives로써 색이 들어가주어야 올바르게 묘사될 것이다. 그래서 점이 가진 Cd 정보를 다르게 이용할 필요가 있다.
@Cd로 색을 넘기면 바로 적용되기 때문에, v@tempCd로 색을 넘겨주도록 하겠다. Copy to Points에 의해 @tempCd가 넘어갔지만 색으로 표현되지 않을 것을 볼 수 있다.
이제 Attribute Promote로 Point 정보로 넘어온 @tempCd를 Primitive 정보로 넘겨주겠다.
Primitive Wrangle을 생성해 @Cd가 @tempCd가 되도록 해주겠다. 이때 Wrangle에 Group을 선택해주면 띠 부분에만 색이 들어오게 된다.
미리 Pack을 하고 이와 같은 결과를 얻고자하면 어려움이 있다. 지금과 같은 작업 뒤에 마지막에 Pack을 해주도록 한다.
하나의 점에 대해서 작업을 마쳤다면, 이제 For-Each Point로 여러개의 점에 대해서 해당 작업이 반복되도록 해주겠다.
결과를 보면 기대했던 것처럼 여러 개의 Sphere에 띠의 형태로 서로 다른 색들이 들어간 것을 볼 수 있다.
해당 결과를 pack_sphere에 연결해준 다음 Simulation을 작동시켜준다.
그런데 색이 잘 들어온 것과는 달리 앞서 만들어두었던 Random한 Bounce가 적용되지 않은 것을 볼 수 있다.
이 원인을 보기 위해선 pack_sphere의 Geometry Spreadsheet을 볼 필요가 있다.
원래라면 Point Attributes로 가지고 있어야 할 @bounce 정보가 없는 것을 볼 수 있다.
그 이유는 우리가 Pack하는 과정이 이전과는 다르기 때문이다.
아까의 방식에서는 Initial, Physics 정보를 넘기기 때문에 @bounce와 같은 Attributes가 Pack된 물체에 Point Attributes로 달리는 것을 볼 수 있었다.
그런데 왜 지금의 방식에서는 @bounce가 결과로 나오지 않았는지 생각해 볼 필요가 있다.
Instancing을 위해 만든 Point들이 Initial 값과 Physics 값을 가지고 있다. 그런데 Pack이 되지 않은 Sphere를 Copy to Points에 붙혔기 때문에 Sphere가 가진 많은 Points와 Primitives에 Initial 값과 Physics 값이 붙게 된다. 그리고 그 후에 Pack을 해주면서 모든 Points와 Primitives에 Initial 값과 Physics 값이 붙은 상태로 한번에 압축이 된다. 이에 더 이상 Initial 값과 Physics 값이 이용되지 않게 된다. Initial 값과 Physics 값을 이용하고 싶다면 Unpack을 해야만 할 것이다.
그런데 이때 Simulation을 하기 위해선 Packed Object를 이용해야하기 때문에 Unpack된 물체는 의미가 없다. Pack된 물체가 @bounce를 가지고 있어야하는 것이다.
Copy to Points의 Geometry SpreadSheet을 보면 @tempCd와 @bounce가 들어와 있는 것을 볼 수 있다.
그 다음 과정에서는 @tempCd를 Primitive로 변환해 색의 정보로 옮기는 과정이 있었다. 이때 모든 Points는 @bounce의 정보를 가지고 있는 것을 볼 수 있다. 그리고 Packing이 되면서 @bounce 정보가 사라지게 되었다.
이를 Pack node의 Transfer Attributes에서 bounce를 입력해 해결해주도록 하겠다.
Geometry Spreadsheet을 보면 우리가 원래 가지고 있던 @bounce 정보가 가져와 쓰인 것을 알 수 있다.
Simulation을 작동시키면 다시 Random한 Bounce에 의해 공들이 튀어오르는 것을 볼 수 있다.
2. s@name
RigiBody Simulation을 작동시키 위해서 필요했던 것들
1. 각각의 조각별로 Pack이 되어 있어야 한다.
2. Pack된 자료가 Point Attributes로써 Initial&Physics 값을 가지고 있어야 한다. 만약에 Initial&Physics 값을 따로 설정하지않는다면 Dop Network 안에서 기본 값으로 세팅이 될 것이다.
3. 지금까지는 @name에 대한 정보를 이용할 필요가 없었다. 한 그릇에 한 물체 위주로 작업을 해왔기 때문에 그릇 자체로써 물체를 구분지을 수가 있었다. 그런데 이제는 한 그릇에 여러 물체가 들어올 예정이기에 물체들을 이름별로 정의해줄 필요가 있다. Sphere0,1,2,3...과 같이 이름을 지어줄 예정인데, 이러한 이름 체계가 나중에 Constraint를 배울 때에도 굉장히 중요해질 것이다. @name의 정보는 Point Attributes 정보로 들어가게 될 것이다.
먼저 쉬운 Object에서 연습을 해본 뒤 본 내용으로 가져가도록 하겠다.
Pack된 Sphere를 Copy to Points로 한 점에 붙여주도록 하겠다. Copy Stamp를 이용해 점을 복제해준다.
Copy to Points를 이용하면 Input2에서의 Attributes를 Input1으로 넘겨줄 수 있다. 그렇기에 Input2에서 @name에 대한 정보를 생성해주도록 하겠다. Initial, Physics 정보를 만드는 것과 같다고 볼 수 있다.
string 정보인 @name을 만들어준다. "sphere"라는 문자 뒤에 @ptnum에 따라 숫자가 붙게 될 것이다. 이때 @ptnum에는 itoa function을 이용해주는데 이는 integer to alphabet이라는 뜻이다.
Copy to Points의 Geometry Spreadsheet을 보면 Point 정보로써 @name이 추가된 것을 볼 수 있다.
본 내용에 @name의 정보를 추가해주도록 하겠다.
Position에 대한 정보 아래에 Attribute Wrangle을 생성해 @name에 대한 정보를 만들어주겠다.
Copy to Points에 정보가 잘 추가된 것을 볼 수 있지만 Pack에 의해 @name의 정보가 사라진 것을 볼 수 있다.
Transfer Attributes에 name을 추가해준다. @name 정보가 끝까지 잘 들어와 있는 것을 볼 수 있다.
이제 Sphere가 충돌할 Box를 만들어주고 무게별로 충돌에 어떻게 차이가 나는지 보겠다.
Box를 생성해 사이즈를 변경하고 Pack 해준다. Add로 점을 생성한 후 Sphere와 규칙을 같게 하기위해서 Copy Stamp를 생성해 Sphere의 Copy Stamp와 연동해준다. Copy to Points로 Pack된 Box를 복사해준다.
이제 점들에 대해서 Box에 대한 @name 정보를 만들어준다. f@density 정보를 생성해 무게를 높여 준다.
Dop Network 안으로 들어가 새로운 RBD Packed Object에 Box에 대한 정보를 불러들인다.
결과를 보면 Dop Network 안에서 Box가 잘 생성되어 있는 것을 볼 수 있다.
이제 Sphere가 Box로 날아가 부딪히게 해주려 한다. Sphere에 초기속도를 만들어주겠다.
이때 Geometry 단계에서 Initial_velocity를 잡아주었다면, Pack node의 Transfer Attributes에 v를 추가하고 Dop Network 안에서 Sphere의 Inherit Velocity from Point Velocity를 체크해주어야 한다.
Simulation을 작동시켜보면 Sphere가 날아가 Box에 부딪히지만 Box가 무거워 넘어뜨리지 못하는 모습을 볼 수 있다.
다음은 Box가 서로 다른 무게와 그 무게에 따른 색을 가지도록 해주겠다.
f@density에 rand function을 이용해 모든 점에 대해 Random한 무게를 가지도록 해주겠다. 이때 @density가 0~1 사이의 값이 되어 너무 가벼워지기에 뒤에 높은 수의 float 값을 곱해준다.
chramp로 @density 값의 색을 조절할 수 있도록 해준다. 이때 @density에 float 값을 곱해주어 0~1 사이의 값이 아니기에, fit function을 활용해 @density를 0~1 사이의 값으로 표현해준다. 가장 무거울 때는 보라색 가벼울 때는 붉은색으로 표현되도록 해준다.
Simulation을 보면 가벼운 것들은 쉽게 넘어지고 무거운 것들은 넘어지지 않는 것을 볼 수 있다.
이번엔 @name을 이용해 원하는 정보를 따로 분리해볼 예정이다.
먼저 Dop import로 Dop Network에서의 정보를 Geometry 단계로 불러온다. 이때 우리는 Pack된 Geometry를 이용하고 있기 때문에 Import Style을 Fetch Packed Geometry from Dop Network(deprecated)를 이용해준다.
Dop import를 두 개 생성해 하나는 Box, 다른 하나는 Sphere와 Box를 모두 볼 수 있도록 해준다.
먼저 Box에서 @name에 따라 Box3를 떼어내보려한다. Attribute Wrangle을 달아 만약 Box2가 아니라면 나머지는 제거해주도록 하겠다.
해당 내용을 좀 더 간편하게 다루기 위해서, "box3"의 내용을 chs("name") + itoa(chi("number"))의 식으로 파라미터로 만들어주도록 하겠다.
똑같은 방식으로 Sphere에도 설정해주고 둘의 number를 연동시킨다면 원하는 point number의 충돌 Simulation을 볼 수 있다.
3. Domino, Tangent
새로운 예제로 Domino 효과를 만들어보려 한다.
이때 가장 중요한 포인트는 경로를 따라 Domino가 올바른 방향으로 나열돼 있어야 Domino와 같이 넘어지는 Simulation이 완성될 것이다.
먼저 Box를 만들어 Transform해 Domino처럼 납작하게 만들어준 뒤 Pack해준다.
Add로 위치가 다른 점을 다섯 개 생성한 뒤 Copy to Points로 해당 점에 Box를 붙여준다.
결과를 보면 세로로 세워진 Domino가 5개 있는 것을 볼 수 있다.
이번에는 점 5개가 아닌 Cirlce을 이용해보겠다. ZX Plane의 Circle을 생성해 Add로 면을 제거해 점만을 남겨준다.
Copy to Points에 연결해 결과를 보면, Domino가 Cirlce에서의 점의 위치에 잘 붙은 것을 볼 수 있다.
하지만 아쉬운 점은 Domino들이 회전하며 배치된 것이 아니라 모두 한 방향을 바라보고 있다는 점이다.
Copy to Points로 Instancing을 할 때 방향 설정에 대한 내용은 굉장히 중요하다.
Instancing을 할 때 방향 혹은 회전을 결정지어주는 세 가지 종류의 Point Attributes가 있다.
1. N : 바라보는 방향을 정하는 방법
2. @N & @up : 바라보는 방향과 머리를 어느 방향으로 세울지를 동시에 이용하는 방법
3. @orient : 방향을 정하고 그 방향을 축으로 회전하는 방법
이 세 가지 개념이 Instancing을 자유롭게 하는데에 도움을 줄 것이다.
이제 Circle에서부터 다시 보도록 하겠다.
지금 우리가 원하는 건 각각의 Point가 가지는 Normal을 새롭게 정의내려주는 것이다.
Box가 바라보는 방향을 쉽게 파악하기위해서 Box의 0번 Primitive의 색을 바꿔준다.
결과를 보면 Point가 가지는 Normal 방향에 맞게 Box의 한쪽 면에 색이 들어간 것을 볼 수 있다.
일단은 Normal과 관계 없이 Circle이 가지는 Point에 바로 Box를 붙여보겠다.
결과를 보면 Box의 파란색 면이 아래로 향하는 이전과는 다른 결과를 볼 수 있다.
Circle을 새로 생성해 Attributes Wrangle로 Normal 정보가 Copy to Points에 미치는 영향을 확인해보겠다.
Copy to Points의 Input2에 Attribute Wrangle을 연결해 보면 v@N에서 정해준 vector 방향과 Box가 바라보는 방향이 같은 것을 볼 수 있다.
이때 v@N 방향이 {0,-1,0}인 것과 Circle에 Box를 바로 연결한 결과가 같게 나온다.
그 이유는 ZX Plane으로 생성된 Circle의 앞면이 아래를 바라보고 있기 때문에 그에 맞춰 Point들의 Normal 방향도 아래를 바라보게 된 것이다.
Circle에 Reverse node를 달아준다면 Box가 위를 바라보게 된다.
몇 가지 실험을 더 해보겠다. 이번에는 Cirlce에 Attribute Randomize로 N의 방향을 Random하게 만들어주겠다.
결과를 보면 Box들이 랜덤한 방향을 바라보며 붙여진 것을 볼 수 있다.
그 다음은 모든 Point의 Normal이 원점을 바라볼 수 있도록 만들어보려한다.
@P와 원점의 차이를 이용해보려 한다. 이때 원점은 {0,0,0}이기에 빼주거나 더해주어도 @P의 변화가 없기에 생략하도록 하겠다. 이에 @N는 @P와 같다고 해주면 된다.
이때 @P는 방향으로서 정보를 행하기엔 그 값이 너무 크다. normalize function으로 @P가 방향으로서의 가치를 가질 수 있도록 해주겠다.
결과를 보면 모든 Box가 원점으로부터 바깥 쪽을 바라보고 있다.
이번에는 앞에서 만든 Randomize한 결과와 원점으로부터 바깥을 향하고 있는 결과를 섞어보려한다.
Blend Shapes로 Input1에 원점으로부터 바깥을 향하고 있는 결과를, Input2에 Randomize한 결과를 넣어 섞어주었다.
이때 Blend Shapes에서 N의 정보만 섞어주겠다고 지정해주어야 한다. 또한 Attribute Randomize에서 Distribution을 Inside Sphere로 변경해주도록 한다.
이렇게 여러가지 실험을 통해 Normal 값이 Instancing에서 방향을 잡는데에 쓰인다는 것을 확인할 수 있었다.
이제 본론으로 들어가겠다. Domino가 둥글게 배치되어 다음 Domino를 바라보고 있는 모습을 만들어주려한다.
일단은 Circle의 형태를 Open Arc로 변경해준다. 면보다는 선으로 묘사해주는 것이 작업에 용이하기 때문이다.
그런데 이때 Circle을 Open Arc로 변경해줌으로써 시작점과 끝점이 겹치게 된다. 이 부분은 나중에 Blast로 떼어낼 것이기에 무시하고 다음 작업을 해준다.
이제 Poly Frame을 이용해 방향 정보를 구해줄 것이다.
방법은 간단하다. Tangent Name에서의 이름을 N로 변경해주면 된다. 이는 Poly Frame이 구할 Tangent 방향은 선이 향하고 있는 방향을 뜻한다. 이때 이 방향 정보를 N에 저장한 상황이다.
그 다음 Blast로 0번 점을 떼어내준다. 둥글게 Domino가 잘 배치된 것을 볼 수 있다.
이제 Domino에 @name을 달아준다.
Copy to Points에 의해 이름 정보가 잘 넘어온 것을 볼 수 있다.
Dop Network에 Rigid Body Solver 세팅을 해준다. RBD Packed Object에 Domino의 내용을 담아준다.
이제 Simulation이 작동됨에 따라 Domino가 넘어지도록 설정해주려 한다.
그러기 위해서 0번 점의 Domino를 따로 떼어내 해당 Domino의 기울기를 기울여 Simulation이 시작됨에 따라 자연히 쓰러지도록 해주겠다.
이때 Transform에서 Move Centroid from Origin을 눌려줌에 따라 물체의 위치와 Pivot Translate의 정보가 바뀌게 된다. 물체의 위치를 Translate을 수정해 다시 {0,0,0}으로 되돌려 준다면, 우리는 Pivot Translate의 값만을 얻게 되는 것이다.
Pivot Translate의 값이 변경됨에 따라 Rotation에 있어 Geometry 안에서 회전하게 된다. 여기서 x축 값을 살짝 기울여 준다면, 원하는 결과를 얻을 수 있다.
Simulation을 작동시켜보면, 기울어진 Domino를 시작으로 Domino들이 차례로 쓰러지는 것을 볼 수 있다.
같은 방식으로 Circle을 S의 line으로 변형시켜서 사용할 수도 있다.
이번엔 Tangent 값을 Poly Frame이 아닌 Resample에서 얻어주도록 하겠다.
시작 점의 Domino의 Tranform을 다시 S자 형태에 알맞게 변형시켜주면 S자 형태로 쓰러지는 Domino를 완성할 수 있다.
'TWA Houdini1 > Rigidbody' 카테고리의 다른 글
TWA 후디니 1 RIGIDBODY_07 : Custom SOURCING + Solver 복습 (0) | 2023.03.27 |
---|---|
TWA 후디니 1 RIGIDBODY_06 : Simulation 데이터 부르기 + 총알 모델 (0) | 2023.03.25 |
TWA 후디니 1 RIGIDBODY_04 : Initial Data & Physical (1) | 2023.03.25 |
TWA 후디니 1 RIGIDBODY_03 : RBD, Bullet Solver 그리고 RIGID BODY SOLVER (1) | 2023.03.21 |
TWA 후디니 1 RIGIDBODY_02 : PACK 훈련 & 나무플랭크 시스템 만들기 (0) | 2023.03.21 |