$(dq\cdot\vec{p}\cdot \overline{dq^*})$ 의 결과를 나타내는 Vector3
를 out
에 담아 돌려줍니다. 결과는 회전과 이동변환이 적용된 $R(\vec{p}) + \vec{t}$ 입니다. Transform.TRS() 처럼 행렬로 나타내자면 $(T\cdot R)\cdot\vec{p}$ 라는 의미입니다.
dq.mulVector(p);
dq.mulVector(p, out);
p
회전, 이동 변환을 적용할 점 $\vec{p}$ 를 나타내는 Vector3
.
out
회전, 이동 변환이 적용된 결과 $R(\vec{p}) + \vec{t}$ 를 담을 Vector3
. out
인자를 주었다면, out
에 결과를 담아 돌려줍니다.
회전, 이동 변환이 적용된 결과 $R(\vec{p}) + \vec{t}$ 를 나타내는 Vector3
.
듀얼 사원수 $dq = (q_r,\;q_d)$ 에서 실수부는 회전(rotational)을, 듀얼부는 이동(translational) 변환을 나타낸다고 했습니다. 즉 우리가 알던 Transform 처럼 생각한다면, 실수부와 듀얼부는 다음과 같이 생각할 수 있겠군요:
$$ q_r = (cos(\frac{\theta}{2}),\;sin(\frac{\theta}{2})\cdot \vec{n}) \\
q_d = (0, \vec{t}) $$
$q_r$ 는 회전사원수이며, $\vec{n}$ 을 회전축으로 $\theta$ 만큼 시계방향으로 회전시키는 회전 변환 $R$ 을 의미합니다. $q_d$ 는 이동벡터 $\vec{t} = (t_x, t_y, t_z)$ 만큼 점을 이동시키는 순허수 사원수(vector quaternion)이며, 이동 변환 $T$ 를 의미합니다.
사원수의 회전 원리가 로드리게스 회전 공식(Rodrigues’ rotation formula)이었듯이, 듀얼사원수 또한 크게 다르지 않습니다. $T\cdot R$ 변환을 나타내야 하므로, 그 원리는 Transform.TRS() 와 같겠죠. 즉 점 $\vec{p}$ 에 회전과 이동을 적용하면 $R(\vec{p}) + \vec{t}$ 를 얻게 된다는 거죠.
그럼 먼저 $dq\cdot \vec{p}$ 를 계산해볼까요? 점 $\vec{p}$ 는 여기서 $0^{\circ}$ 도 만큼 회전하며, 이동 벡터 $\vec{p}$ 만큼 이동시키는 트랜스폼 $(1, \vec{p})$ 을 의미합니다. 여기서 $1$ 은 사원수곱의 항등원(identity)을 의미합니다. 즉 순수하게 이동만 나타내는 트랜스폼(pure translational transform)인 것이지요:
$$ dq\cdot\vec{p} = (q_r,\;q_d)\cdot(1, \vec{p}) \\
= (q_r,\; q_r\cdot\vec{p} + q_d) $$
역시 $dq\cdot\vec{p}$ 자체가 $R(\vec{p}) + \vec{t}$ 를 의미하지는 않네요. 그렇다면 사원수에서 했던 것처럼 손을 봐줘야겠군요. 먼저 점 $\vec{p}$ 을 변환시켰는데, 실수부에 $q_r$ 이 있어 결과가 점(pure translational transform)이 아니네요. 그렇다면 실수부를 지워줘야겠군요. 회전 $q_r$ 의 역(inverse)을 나타내는 듀얼사원수 $(q_r^, 0)$ 을 곱해줍시다. 여기서 $q_r^$ 은 순수하게 회전만 나타내는 트랜스폼(pure rotational transform)입니다:
$$ dq \cdot \vec{p}\cdot q_r^* = (q_r,\; q_r\cdot\vec{p} + q_d)\cdot(q_r^*, 0) \\
= (q_r\cdot q_r^,\;(q_r\cdot\vec{p} + q_d)\cdot q_r^) \\
= (1,\;(q_r\cdot\vec{p}\cdot q_r^) + q_d\cdot q_r^) \\
= (1,\;R(\vec{p}) + q_d\cdot q_r^*) $$
실수부를 지워주자 놀랍게도 듀얼부에서 $R(\vec{p})$ 를 얻을 수 있었습니다. 그렇다면 $q_d\cdot q_r^$ 가 $\vec{t}$ 가 된다면 끝이겠군요. $q_d = \vec{t}$ 이므로, $q_d\cdot q_r^ = \vec{t}\cdot q_r^*$ 처럼 치환해줄 수 있습니다.