바로 이전 포스트에서 우리는 회전목마와 상자의 운동을 행렬곱으로 표현해보았다.
그러나 해당 방식은 물체가 회전목마에서 닿았다 떨어졌다 하는 상황에서 동적으로 변경해줄 수 없다는 문제가 있다.
즉 게임 내의 회전하는 원판 장애물 등으로는 활용할 수 없다는 이야기다.
이번 포스트에서는 Move parents라는 개념을 사용해 이를 개선해보자.
사실 지난 포스트에서 다룬 회전운동을 표현하는 수학적 원리는 전부 동일하다.
단 이제부터는 각 오브젝트가 Move parents를 가질 수 있고, 만약 Move parents가 있을 경우 이 오브젝트의 transform은 Global transform 대신 Local transform을 통해 표현한다.
이를 회전목마 운동에 대입시켜보자.
우선 회전목마는 move parent가 없으므로(정확히는 우주 공간 자체가 Move parent이므로) 우리는 회전목마의 global transform을 사용한다.
반면 회전목마 위에 놓인 object는 현재 회전목마의 transform에 의해 자신의 transform이 영향을 받으므로 회전목마가 자신의 move parent가 되고, move parent가 존재하기 때문에 우리는 이 오브젝트의 transform을 표현할 때 global 대신 local transform을 사용한다.
물체의 local transform은
(move parent의 global transform의 transpose) * (물체의 global transform)
으로 나타낼 수 있고
이를 회전목마와 상자에 대입해 생각하면 L = M^-1 * B로 나타낼 수 있다. 자세한건 이전 포스트 참고.
반대로 물체의 global transform은
이걸 거꾸로 해준 것, 즉
(move parent의 global transform) * (물체의 local transform)
이고
이는 B = ML 로 나타낼 수 있다.
사실 지난 포스트에서 다룬 내용과 동일하기 때문에 전혀 어려운 내용이 없다.
이걸 이제 코드단에서 다음과 같은 형태로 표현이 가능하다.
어떤 오브젝트의 Move parent가 설정되었을 경우 local transform을 업데이트해주고,
반대로 move parent가 삭제되었을 경우(nullptr) global transform을 업데이트한다.
그 후 매 프레임마다 회전목마에 물체가 닿아있는지를 확인하고 닿아있을 경우 Move parent로 설정해주는 코드를 추가하면 이제 물체가 접촉해 있을 때만 회전목마의 영향을 받는, 우리가 원하는 결과를 얻을 수 있다.
'mathematics > game mathematics' 카테고리의 다른 글
[Mathematics] 27. 기준점을 중심으로 한 원형 회전 (0) | 2022.08.07 |
---|---|
[Mathematics] 26. Camera view transformation matrix (0) | 2022.06.23 |
[Mathematics] 25. Local vs Global Coordinate System(3D) (0) | 2022.06.23 |
[Mathematics] 24. Fast TR Matrix Inversion (0) | 2022.06.23 |
[Mathematics] 23. Eigenvectors, Eigenvalues (0) | 2022.06.06 |