$\vec{X} = (1,0,0)$ 기저에 대해 시계방향으로 $x^\circ$ 도 회전, $\vec{Y} = (0,1,0)$ 기저에 대해 시계방향으로 $y^\circ$ 도 회전, $\vec{-Z} = (0,0,-1)$ 기저에 대해 시계방향으로 $z^\circ$ 도 회전하는 회전을 나타내는 Quaternoin
을 out
에 담아 돌려줍니다.
회전 순서는 RotationOrder
열거형을 참고하시길 바랍니다. 기본 순서는 $yaw ⇒ pitch ⇒ roll$ 을 나타내는 RotationOrder.EulerYXZ
입니다. Quaternion.euler()
로 생성한 회전은 오일러각(euler angles)을 사용했기 때문에 여전히 짐벌락(gimbal-lock) 현상이 존재함에 유의하시길 바랍니다.
Quaternion.euler(x,y,z);
Quaternion.euler(x,y,z,order);
Quaternion.euler(x,y,z,order,out);
x
$pitch$ 회전에서 사용할 각도(degree)를 나타내는 number
. 회전축은 $\vec{X} = (1,0,0)$ 입니다.
y
$yaw$ 회전에서 사용할 각도(degree)를 나타내는 number
. 회전축은 $\vec{Y} = (0,1,0)$ 입니다.
z
$roll$ 회전에서 사용할 각도(degree)를 나타내는 number
. 회전축은 $\vec{-Z} = (0,0,-1)$ 입니다.
order
$q_{yaw}, q_{pitch}, q_{roll}$ 들의 결합 순서를 나타내는 RotationOrder
열거형.
RotationOrder.EulerXYZ
: $result = (q_{roll}\cdot q_{yaw} \cdot q_{pitch})$RotationOrder.EulerXZY
: $result = (q_{yaw}\cdot q_{roll} \cdot q_{pitch})$RotationOrder.EulerYZX
: $result = (q_{pitch}\cdot q_{roll} \cdot q_{yaw})$ 기본값.RotationOrder.EulerYXZ
: $result = (q_{roll}\cdot q_{pitch} \cdot q_{yaw})$RotationOrder.EulerZXY
: $result = (q_{yaw}\cdot q_{pitch} \cdot q_{roll})$RotationOrder.EulerZYX
: $result = (q_{pitch}\cdot q_{yaw} \cdot q_{roll})$out
결과를 담을 Quaternion
. 인자를 주지 않으면 임시 변수를 생성합니다.
오일러각(Euler angles)을 사용한 회전을 나타내는 Quaternion
. out
인자를 주었다면 결과를 out
에 저장하고 out
을 그대로 돌려줍니다.
RendererJS 는 왼손좌표계(left-hand coordinate system)를 사용하며, 모든 회전은 회전각 $\theta^\circ$에 대해서 시계방향(clockwise)으로 회전합니다. 이는 Quaternion.mulVector() 에서 회전공식을 설계할때 그렇게 설계했기 때문입니다. $roll$ 회전이 $\vec{-Z}=(0,0,-1)$ 를 회전축으로 사용하는 이유 또한 $(\vec{Y}\times\vec{X})=\vec{-Z}$ 이기 때문입니다. 즉 Quaternion.euler()
의 회전을 그림으로 확인하면 다음과 같습니다:
RendererJS 가 사용하는 좌표계(coordinate system). 왼손좌표계일때 오일러각(Euler angles) 회전을 보여줍니다.