클래스선언.html

듀얼 넘버(dual number)는 복소수(complex number) $a+bi$ 와 비슷하게 하나의 실수 $z$ 와 하나의 듀얼 연산자(dual operator) $\epsilon$ 로 구성되는 수 $z + d\epsilon$ 를 정의합니다.

듀얼 연산자(dual operator) $\epsilon$ 는 허수 $i$ 와 비슷한 컨셉으로, $\epsilon^2 = 0 \;(\epsilon\ne0)$ 이며 $z+d\epsilon$ 에서 $z$ 를 실수부(real), $d$ 를 듀얼부(dual)라고 부릅니다. 여기서 DualQuaternion 은 실수부(real)와 듀얼부(dual)가 사원수 $q_r,\;q_d$ 로 되어있는 듀얼 넘버(dual number)이기에, 듀얼 사원수(dual quaternion)이라고 부르는 것이지요.

Quaternion 이 회전(Rotation)을 다뤘다면, DualQuaternion 은 거기에 추가로 이동(Translation) 변환이 추가됩니다. 다시말해 $T\cdot R$ 변환(Rigid transformation)을 나타내는 트랜스폼(Transform)이라는 의미입니다.

RendererJS 에서 DualQuaternionDeformer 에서 DLB (Dual quaternion Linear Blending) 방식을 구현하기 위해 사용됩니다. 듀얼 사원수는 회전과 이동을 분리해서 다루기에, 정규화를 시켜준다는 가정 하에 blending 의 결과가 항상 강체 변환(rigid transformation)임이 보장되기 때문입니다.

반면 기존의 Linear blend skinning 방식은 Matrix4x4 의 스칼라곱(scalar multiplication)과 행렬덧셈(addition)으로 이루어지기에, blending 을 거친 행렬은 더이상 강체 변환(rigid transformation)을 의미하지 않게 됩니다. 행렬덧셈을 거치면, 행렬의 기저벡터 $\vec{basisX}, \vec{basisY}, \vec{basisZ}$ 이 서로 직교하지 않게 될테니까요!

이외에도 몇가지 이유가 더 있으며, 자세한 내용은 Deformer.#dualQuaternion() 을 읽어보시길 바랍니다. 듀얼 넘버(dual number)는 $\hat{a} = z + d\epsilon$ 처럼 표기하기에, 듀얼 사원수 또한 $\hat{q} = q_r + q_d\epsilon$ 처럼 표기합니다. 다만 이 문서에서는 듀얼 사원수를 나타내는 기호로 $\hat{q}$ 처럼 쓰지 않고, 대신 $dq = q_r + q_d\epsilon$ 처럼 씀에 유의하시길 바랍니다. 즉 따로 언급이 있지 않는 한, 듀얼 사원수는 항상 $dq$ 라고 표기하겠습니다.

Static methods

<aside>

DualQuaternion.rotateTranslate()

$rotate$ 만큼 회전한 후에, $\vec{translate}$ 만큼 이동시키는 트랜스폼(transform)을 나타내는 DualQuaternion 을 out 에 담아 돌려줍니다

</aside>

<aside>

static DualQuaternion.mulDQ()

</aside>

Static properties

<aside>

DualQuaternion.identity

듀얼사원수 곱의 항등원(identity)을 나타내는 DualQuaternion 을 생성하여 돌려줍니다.

</aside>

Constructor

<aside>

DualQuaternion()

$(q_r, \;q_d)$ 인 DualQuaternion 을 생성합니다. 인자로 준 Quaternion 은 복사되며, 인자를 주지 않으면 $(1, 0)$ 으로 초기화됩니다.

</aside>