Processing math: 100%
본문으로 바로가기

오일러 변환 (Euler Transformation)

category Graphics이론 2년 전

오일러 각 (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=[10000cosθsinθ00sinθcosθ00001]

 

동일한 방법으로 y, z축의 회전행렬도 설계할 수 있다.

 

Ry=[cosθ0sinθ00100sinθ0cosθ00001]

 

Rz=[cosθsinθ00sinθcosθ0000100001]

 

( dx를 기준으로 설명하고 있으므로, 일반적인 수학의 회전행렬과는 좀 다르다는것을 알아두자 )

 

여기서 알아야될 부분은 y축의 회전행렬이다. 다른 행렬은 모두 우측 상단의 sin함수가 양의 부호인 반면, Ry만 좌측 하단의 sin함수가 양의 부호를 가진다. 이는 순환치환에 대해서 알아야 하는데 설명은 생략한다.

간단하게 말하면 x -> y -> z -> x -> y 순으로 세 축이 순환되기 때문에 y축에 직교하는 평면은 xz 평면이 아닌, zx 평면이다.

(즉, z에 써야할 회전 함수를 x에 썼다고 간단하게만 생각해 두자)

 

각 기저 축의 회전행렬을 구했다면, 이를 순선대로 적용해 최종 회전행렬을 만들어야 한다.

세 번의 연속적인 회전으로 구성된 오일러 각 회전 방법은 6가지의 경우수가 발생하는데, 이는 작성하는 본인이 직접 선택하면 된다.

 

예를 들어 z -> x -> y의 순서를 갖는 회전 행렬 곱을 계산해보자

(설명을 간단하게 하기 위해 3x3으로 계산한다. 이에서 1차원을 추가하여 동차좌표계로 변환하기만 하면 된다.)

 

RyawRpitchRroll=[cosα0sinα010sinα0cosα][1000cosβsinβ0sinβcosβ][cosγsinγ0sinγcosγ0001]

 

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