오일러 각 (Euler angle)
오일러 각은 3차원 공간에서 물체가 놓인 방향을 3개의 각을 사용해 표시하는 방법이다.
각 방향을 표시할때는 표준기저벡터를 사용한다.
그래서 오일러 각은 표준기저벡터를 중심으로 회전하는 각의 크기로 지정된다.
소프트웨어마다 x, y, z 축은 다르다.
예를 들어 언리얼 엔진에서의 x, y, z 축의 회전과 유니티 엔진에서의 x, y, z 축의 회전은 다르다.
(언리얼엔진은 z-up 이고, 유니티는 y-up 이다.)
이렇기 때문에, 언리얼 엔진에서의 각 정보를 유니티 엔진으로 넘겨 사용할 수 없는데
이를 해결하기 위해 x, y, z 축 대신 회전의 움직임으로 회전 동작을 구분하고 각을 지정하는 방법을 사용한다.
표준기저벡터를 축으로 하는 회전의 움직임은 방향에 따라 yaw, roll, pitch로 불린다.
오일러 각을 사용해 3차원 공간의 회전을 표현할 수 있게 되었지만, 렌더링 과정에서는 회전을 사용하기 위해선 어쩔 수 없이 회전행렬을 생성해야 한다.
'오일러 각은 표준기저벡터를 중심으로 진행되는 세 번의 연속적인 회전을 의미한다.'
예를 들어, x축 회전은 yz 평면의 회전을 의미하는데, 이 경우 x 값은 변하지 않고 오직 y축과 z축의 값만 변한다.
따라서 x축의 회전행렬은 다음과 같이 설계할 수 있다.
$$Rx = \begin{bmatrix}1 & 0 & 0 & 0 \\0 & cos \theta & sin \theta & 0 \\ 0& -sin \theta & cos \theta & 0 \\ 0&0&0&1 \end{bmatrix} $$
동일한 방법으로 y, z축의 회전행렬도 설계할 수 있다.
$$Ry = \begin{bmatrix}cos \theta & 0 & -sin \theta & 0 \\0 &1 & 0 & 0 \\ sin \theta & 0& cos \theta & 0 \\ 0&0&0&1 \end{bmatrix} $$
$$Rz = \begin{bmatrix}cos \theta & sin \theta & 0 & 0 \\-sin \theta &cos \theta & 0 & 0 \\ 0 & 0& 1 & 0 \\ 0&0&0&1 \end{bmatrix} $$
( dx를 기준으로 설명하고 있으므로, 일반적인 수학의 회전행렬과는 좀 다르다는것을 알아두자 )
여기서 알아야될 부분은 y축의 회전행렬이다. 다른 행렬은 모두 우측 상단의 sin함수가 양의 부호인 반면, Ry만 좌측 하단의 sin함수가 양의 부호를 가진다. 이는 순환치환에 대해서 알아야 하는데 설명은 생략한다.
간단하게 말하면 x -> y -> z -> x -> y 순으로 세 축이 순환되기 때문에 y축에 직교하는 평면은 xz 평면이 아닌, zx 평면이다.
(즉, z에 써야할 회전 함수를 x에 썼다고 간단하게만 생각해 두자)
각 기저 축의 회전행렬을 구했다면, 이를 순선대로 적용해 최종 회전행렬을 만들어야 한다.
세 번의 연속적인 회전으로 구성된 오일러 각 회전 방법은 6가지의 경우수가 발생하는데, 이는 작성하는 본인이 직접 선택하면 된다.
예를 들어 z -> x -> y의 순서를 갖는 회전 행렬 곱을 계산해보자
(설명을 간단하게 하기 위해 3x3으로 계산한다. 이에서 1차원을 추가하여 동차좌표계로 변환하기만 하면 된다.)
$$ R_{yaw} \cdot R_{pitch} \cdot R_{roll} =
\begin{bmatrix}cos \alpha & 0 & -sin \alpha \\0 & 1 & 0 \\ sin \alpha & 0 & cos \alpha \end{bmatrix}
\begin{bmatrix}1 & 0 & 0 \\0 & cos \beta & sin \beta \\ 0 & -sin \beta & cos \beta \end{bmatrix}
\begin{bmatrix}cos \gamma & sin \gamma & 0 \\-sin \gamma &cos \gamma & 0 \\ 0 & 0 & 1 \end{bmatrix} $$
이를 곱하면 하나의 오일러 변환을 얻을 수 있다.
'Graphics > 이론' 카테고리의 다른 글
아핀 결합 ( Affine Combination ) (0) | 2022.12.21 |
---|---|
원근 투영 변환 - 깊이값( Perspective projection transformation - Depth ) (1) | 2022.11.17 |
원근 투영 변환 ( Perspective projection transformation ) (4) | 2022.11.14 |
뷰 변환 ( View Transformation, Camera Transformation ) (0) | 2022.11.08 |
월드 변환 ( World Transformation ) (0) | 2022.10.23 |