Transform
은 비례(Scaling), 회전(Rotation), 이동(Translation) 변환을 통해, 캐릭터에게 강체 변환(rigid transformation)을 적용합니다. Transform
은 전단 변환(shear)은 지원하지 않으며, 비균등한 스케일링(Non-uniform scaling)은 자식(children)을 가지지 않는 리프 트랜스폼(leaf-transform)만 지원함에 유의하시길 바랍니다.
강체변환(rigid transformation)을 나타내는 다른 수단으로는 DualQuaternion 이 있지만, 듀얼 사원수는 오직 DLB (Dual quaternion linear blending)에서만 사용됩니다. 듀얼 사원수는 비례(scaling)를 나타내지 못하며, 오직 회전(rotation)과 이동(translation)만 다루기 때문입니다. 또한 계층구조(hierarchy)에 대한 정보가 없으므로 일반적인 상황에서는 사용하기 적절하지 않습니다.
대신 듀얼 사원수 $dq$ 는 Transform
에 비해 적은 저장공간(8개의 number
)을 사용하며, $dq_1 \cdot dq_0$ 처럼 곱해주는 것으로 강체변환 $T\cdot R$ 들의 결합순서를 기억할 수 있습니다. 고로 IK (Inverse Kinematic) 연산 등에서 사용하기에 적절합니다. 물론 Transform
또한 Transform.inverse(), Transform.mulTransform() 을 지원하긴 합니다만, 계층구조가 있다면 자식들의 월드 트랜스폼(world transform)을 재계산하는 비용이 추가됩니다.
Transform
은 Transform.toDualQuaternion() 함수를 통해 DualQuaternion
으로 변환할 수 있으며, 해당 함수는 Bone.skinningDQ() 를 구현하는데 사용됩니다. 이외의 경우에는 Transform
을 쓰는 것을 권장합니다.
<aside>
Transform 을 생성합니다.
</aside>
<aside>
$this.world = (parent.world\cdot this.local)$ 임을 이용해, 자신의 world transform 을 계산합니다.
</aside>
<aside>
$this.world = (parent.world\cdot this.local)$ 임을 이용해, 자신의 local transform 을 계산합니다.
</aside>
<aside>
Transform.#calculateChildrenWorld()
자식들의 world transform 을 재계산합니다. 이 함수는 자신의 world transform 이 변경되었다면 반드시 호출해야 합니다.
</aside>
<aside>
Transform 을 나타내는 string 을 얻습니다.
</aside>
<aside>
Transform 을 DualQuaternion 으로 변환한 결과를 얻습니다.
</aside>
<aside>
</aside>
<aside>
트랜스폼의 역(inverse)을 나타내는 Transform 을 out 에 담아 돌려줍니다.
</aside>
<aside>
$TRS = (world \;translation\cdot world \;rotation\cdot world \;scaling)$ 을 수행하는 Matrix4x4 를 돌려줍니다.
</aside>