오늘의 목표
- 진자 운동
구현을 위해 필요한 내용
- sphere의 충돌 : RBD Packed Object로 구현 가능
- 추가 어디엔가 메달려 있는 것 : 이게 문제
- 선을 고정해주는 다른 물체가 존재한다.
위 이미지를 기준으로 물체 - 물체 간의 관계를 유추해보자면...
- 위에 고정해주는 두 점과 아래 무거운 추, 그것들을 이어주는 선
- constraint로써 선을 활용
sphere가 올라갔다가 내려가는 이유 : 중력 때문
위에 두 점은 움직이지 않는다. > 시뮬레이션에서 오브젝트로써 역할은 하지만, 움직이지는 않는다.(고정되어있다.)
- 새로운 어트리뷰트를 알아야한다.(i@active)
오늘 새로 배울 어트리뷰트
- i@active
- RBD Packed Object에 올린 물체가 시뮬레이션의 영향을 받는지 안받는지 설정해주는 어트리뷰트
- i@active = 1; // 시뮬레이션의 영향을 받는다. 시뮬레이션 적용시 default 값은 1이다.
- i@animated
- i@deforming
진자 운동을 만드는데 있어서는 @active만 알아도 충분하다.
컨디션이 조금이라도 좋을 때 한꺼번에 뚫어보자
물체에 대해 transform 적용 후 packing 해주는것과, packing 후 transform 해주는 것은 다르다. 순서가 다른만큼, 결과 또한 다르다.
또한 @active, @animated, @deforming을 다룸에 있어서도 순서에 따른 차이가 존재한다.
일단 기본 애니메이션을 위해 transform 노드를 사용해서 애니메이션부터 줘보자.
겉보기에는 차이가 없다.
하지만 데이터 상으로는 완전히 다른 것들이다.
물체가 animated 되는 것인지, deforming 되는 것인지 확인하는 방법
- Geometry spreadsheet > primitive의 intrinsics:transform 을 확인해보면 된다.
- 물체가 이동하는동안 intrinsics:transform이 조금이라도 변화가 있다면, 그것은 animated 된 것이고, 아니라면, deforming 된 것이다.
위의 경우는 그럼 deforming인가? animated인가?
intrinsics:transform의 값이 변하는 것으로 보아 animated 된 것이지만, scene view를 보면 물체의 외형이 계속 바뀌고 있다. 따라서 위의 경우는 animated 이면서 deforming 인 것이다.
일반적으로 따로 설정을 해주지 않는다면,
- i@active 의 default 값은 1이다.
- i@animated 의 default 값은 0이다.
- i@deforming 의 default 값은 0이다.
지금까지 rigid body 시뮬레이션에 사용된 물체는 움직이는 물체가 아니었다.
- i@animated / i@deforming을 고려할 이유가 없었다.
지금의 상황은 i@active = 1 / i@animated = 0 / i@deforming = 0 이기 때문에, 중력만이 적용되어서 물체가 바닥에 떨어지게 된다.
또한 dop network 밖에서 만들어줬던 attribute noise로 인한 물체의 변형 또한 일어나지 않는다.
i@animated / i@deforming 이 0이 아닌, 1이라면, dop network 안에서 물체는 dop network 밖에서 준비한 애니메이션이나 모양의 변형이 반영될 수도 있다.
일단, 공중에 떠있는 movingbox는 중력에 영향을 받지 않는다. 그리고 dop network 밖에서 준비된 움직임을 충실히 쫒아오면서 wall과 충돌이 발생한다.
wall 이 movingbox와 충돌하고 바닥에 떨어지는 것은, i@active가 1이라서 시뮬레이션의 영향을 받아서 중력이 적용되기 때문이다.
active가 0이기 때문에 시뮬레이션의 영향을 받지 않고, deforming이 0이기 때문에 물체의 변형 또한 일어나지 않는다. 애초에 movingbox는 저 순서에서는 animation이 없다(intrinsics>transform의 변화가 없다)
그렇기 때문에 movingbox는 그냥 공중에 떠있는 것이다.
움직이지 않는다...?
animated 는 없다 하더라도, deforming이 1일때는 움직여야 하는 것 아닌가!? 할 수 있지만,
애초에 i@animated / i@deforming이 동시에 1로 설정되는 옵션은 옳은 옵션이 아니다.
i@animated가 1이라면, i@deforming은 0으로, i@deforming이 1이라면, i@animated는 0으로 설정하는 것이 좋다.
이 두 값이 모두 1이면, 오류가 나는 느낌이 들 수 있다.
i@animated와 i@deforming은 커버 가능한 영역이 다르다.
- i@deforming이 좀 더 많은 부분을 커버해줄 수 있다.
이 경우, movingbox는 deforming도 되고 있고, intrinsics:transform의 값도 변하면서 animated도 되고 있다.
movingbox는 dop network 밖에서 만들어준 transform 노드에서 제공받고 있는 intrinsics:transform의 데이터를 활용해서 dop network 안에서 움직이고 있다.
하지만, 우리가 attribute noise로 만들어줬던 박스의 꿀렁거리는 움직임은 표현되고 있지 않다.
그렇다면, 물체의 변형은 deforming이니까 deforming을 1로 바꾸면 해결될까?
역시나 움직이지 않는다.
i@animated = 1 / i@deforming = 1 로 설정하는 것은 옳은 선택은 아닌듯 싶다.
그렇다면, i@deforming만 사용하면 어떻게 될까?
movingbox의 꿀렁거림도 잘 묘사되고 있다.
정리
i@active가 0으로 시뮬레이션 적용을 받지 않고 있을 때,
물체는 중력의 영향을 받지 않더라도 충돌이 가능하다.
i@deforming을 이용한다면, 물체가 deform / animation 정보를 모두 제공할 때, i@animated를 사용하지 않고서도 정보를 읽어들일 수 있다.
i@animated보다 i@deforming이 좀 더 많은 부분을 커버할 수 있다는 의미
이제 i@active가 1일 때는 어떻게 될까?
몇가지 경우의 수가 존재한다.
- deform O / animation X / i@animated = 1 / i@deforming = 0
- deform O / animation X / i@animated = 0 / i@deforming = 1
- deform O / animation O / i@animated = 1 / i@deforming = 0
- deform O / animation O / i@animated = 0 / i@deforming = 1
현재 movingbox에 animation 정보는 없다. 그렇기 때문에 i@animated가 1이어도 활용할 정보가 없고, deform 정보는 있지만, i@deforming이 0으로 설정되어있기 때문에(deform 정보는 있지만, deform되지 않는다), movingbox는 중력의 영향만 받아서 바닥에 툭 떨어진다.
i@deforming이 1로 설정되어있기 때문에 movingbox의 deform 정보(꿀렁거림과 위치변화)가 반영된다. 그런데, i@active가 1이므로 중력의 영향도 받게 된다.
이번에는 정보를 바꿔서 deform 과 animation 모두 제공되는 경우를 확인해보자.
deforming에 대한 정보가 있지만, i@deforming이 0이므로, deform 정보는 사용하지 않는다.
그리고 animation 정보를 제공하고 있기 때문에 i@animated 가 1로 설정되면 올바르게 작동해야하는데 그렇지 않다.
애니메이션 정보가 제대로 전달되지 못하고 중력의 영향만 받아서 바닥으로 떨어진다.
- deform O / animation X / i@animated = 1 / i@deforming = 0 (이때의 결과와 같다)
deform 때문에 movingbox가 꿀렁거리는 것도 있고, animation 정보도 잘 불러온 것을 확인할 수 있다.
진자운동을 만들어보자.
일단 하나의 진자만 만들어보자.
- 두 pivot의 name은 달라야한다.(pivot_A / pivot_B)
- sphere와 pivot 사이에는 constraint type이 position인 관계가 형성되어야한다.
이제 constraint 세팅을 잡아보자.
이제 이 sphere가 24프레임에 어떠한 힘을 받아서 움직일 수 있도록 해주자.
현재 sphere는 RBD Packed Object(sphere)에 담겨있다. 특정 시간에 임의의 속도가 주어지면 sphere는 가만히 있다가 움직이는 것처럼 보이게 될 것이다.
이제 진자의 수량을 늘려보자.
procedural modeling을 계속 해보는 이유?
- 나중에 조각이 많아졌을 때 수량때문에 멘탈 터지지 말라고 지금부터 단련하는 것!!
추가 놓일 위치(sphere의 위치)가 메인 정보, sphere를 위치정보에 붙여준다.
그리고 그 위치를 기반으로 해서 pivot의 위치를 잡아준다.
이제 point를 기반으로 pivot의 위치를 잡아보자.
각각의 point에 대해 작업할 것이므로, for each point를 사용해준다.
각각의 sphere 포인트에 대해서 pivot 위치에 점을 두개 만들어준다. 그리고 metadata를 활용해서 각 포인트 뒤에 넘버링해줌으로써 이름이 겹치지 않도록 해준다.
그리고, sphere를 붙일 점과 pivot을 붙일 점에 대해 grouping해주고, constraint를 만들 line을 생성한 뒤, 그것 또한 grouping해준다.
그룹으로 묶어준 것에 대해서 sphere와 pivot에 적당한 크기의 sphere를 붙여주고, 각각 @active / @animated / @deforming 정보를 달아준다.
- sphere : @active 1 / @animated 0 / @deforming 0
- pivot : @active 0 / @animated 0 / @deforming 0
line은 measure 노드를 활용해서 길이를 구해준 뒤, restlength 값으로 사용한다.
여러개의 진자 중, 0번 진자에 대해 임의의 프레임에 속도를 추가해주는 것으로 그 타이밍에 슬쩍 움직일 수 있도록 해준다.
Deforming과 Animated에 대해서 살짝 아리송 할뻔...
사실 아직 완벽하게 deforming이 무엇이다! 라고 정의를 못내리겠다...
좀 곱씹어봐야할듯 한 부분이다.