$rotate$ 만큼 회전한 후에, $\vec{translate}$ 만큼 이동시키는 트랜스폼(transform)을 나타내는 DualQuaternion
을 out
에 담아 돌려줍니다.
DualQuaternion.rotateTranslate(rotate, translate)
DualQuaternion.rotateTranslate(rotate, translate, out)
rotate
회전을 나타내는 Quaternion
. 항상 회전사원수이어야 하므로, 일반적으로 Quaternion.angleAxis() 또는 Quaternion.euler() 등을 기대하고 있습니다.
translate
이동벡터 $\vec{t}$ 를 나타내는 Vector3
. 순허수 사원수(vector quaternion) $\vec{t} = (0, \vec{t})$ 으로 변환하는 건 rotateTranslate()
함수가 내부적으로 수행합니다.
out
결과를 담을 DualQuaternion
. 인자를 주지 않으면 임시 변수를 생성합니다.
$(T\cdot R)$ 트랜스폼(transform)을 나타내는 DualQuaternion
. out
인자를 주었다면, out
에 결과를 담아 돌려줍니다.
트랜스폼(rigid transform)을 나타내는 듀얼 사원수는 다음과 같이 정의됩니다:
$$ dq = (q_r, \;q_d) $$
$$ q_r = (cos(\frac{\theta}{2}), \;sin(\frac{\theta}{2})\cdot\vec{n}) \\
q_d = \frac{\vec{t}}{2}\cdot q_r $$
실수부 $q_r$ 는 회전을 나타내며, 듀얼부 $q_d$ 는 이동을 나타냅니다. 실수부 $q_r$ 은 Quaternion.angleAxis() 의 회전사원수이며, 듀얼부 $q_d$ 는 이동벡터 $\vec{t} = (t_x,\;t_y\;t_z)$ 를 나타내는 순허수 사원수(vector quaternion)에 실수부 $q_r$ 과 스칼라 $\frac{1}{2}$ 를 곱해준 것입니다.
어째서 듀얼부를 $q_d = \frac{\vec{t}}{2}\cdot q_r$ 처럼 사용하는지에 대해서 DualQuaternion.mulVector() 를 읽어보시길 바랍니다.