본문으로 바로가기

오일러 변환 (Euler Transformation)

category Graphics/이론 2022. 10. 31. 20:51

오일러 각 (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}  $$

 

이를 곱하면 하나의 오일러 변환을 얻을 수 있다.