[게임수학] 8-2. 오일러 각의 단점(짐벌락, 회전 보간)

2025. 10. 14. 19:52·게임수학
728x90

■ 오일러 각의 단점

오일러 각은 적은 용량으로 3차원 공간의 회전 정보를 기록할 수 있고(행렬을 사용하면 최소 9개의 실수 데이터 필요), 사용자 입장에서 물체의 회전 각도를 쉽게 설정하는 데 사용된다.

하지만 오일러각에는 명확한 단점이 존재한다.

 

1. 짐벌락(Gimbal lock) 현상

짐벌락은 오일러 각을 사용할 때 세 번째 회전축이 첫 번째 회전축과 일치하게 되어 동일한 방향으로 회전하게 되는 현상이다.

이 짐벌락은 두 번째 축의 회전값이 $90^{\circ}$혹은 $-90^{\circ}(270^{\circ})$일 때 발생한다.

  • 유니티는 오일러 각을 적용할 때 Z → X → Y 순서로 적용하여, X축이 90 혹은 -90일 때 짐벌락 현상이 발생한다.

유니티에서 짐벌락 현상을 재현하기 위해 오일러 각으로 물체를 회전시켜 보자.

[x축(pitch) -90도 회전]

x축을 기준으로 yz평면을 -90도 회전하면 비행기의 머리는 하늘을 바라보게 된다. 이제 이 상태에서 y, z 축 기준으로 yaw, roll 회전을 하면,

[y축(yaw) 회전]
[z축(roll) 회전]

y축과 z축 회전(yaw, roll) 회전이 같아지게 된다. 이렇게 짐벌락 현상이 발생하는 이유는 오일러 각은 부모-자식 관계를 가지기 때문이다.

  • Y(할아버지)
    • X(아버지)
      • Z(아들)

유니티에서 오일러 각은 위와 같은 계층 구조를 가지게 된다. 따라서 Y(할아버지)의 회전은 X, Z 축에 영향을 주고, X축의 회전은 Z 축에 영향을 주게 된다.

[x축 회전]

이때, 계층구조에서 중간축인 x축을 90도 회전하게 되면 Y와 Z가 같은 축으로 합쳐 “잠기게”된다. 이때 yaw와 roll이 구분되지 않고 동일한 효과가 되어 둘을 독립적으로 조절할 수 없게 된다.

 

🤔 회전행렬을 통한 짐벌락 현상 확인

짐벌락 현상을 회전행렬을 통해 알아보면 아래와 같다. 먼저, 유니티에서 오일러 각은 아래와 같이 계산된다.

 

$$ R_y \cdot R_x \cdot R_z = $$

\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}

[오일러 각 계산]

 

여기서 $R_x$를 90도 회전, 즉 $\beta = \pi /2$를 대입하면 $\cos \beta = 0$, $\sin\beta = 1$이 된다.

$$ R_y \cdot R_x \cdot R_z = $$

\begin{bmatrix}\cos\alpha & 0 & \sin\alpha \\0 & 1 & 0 \\-\sin\alpha & 0 & \cos\alpha\end{bmatrix}\begin{bmatrix}1 & 0 & 0 \\0 & 0 &- 1 \\0 & 1 & 0\end{bmatrix}\begin{bmatrix}\cos\gamma & -\sin\gamma & 0 \\\sin\gamma & \cos\gamma & 0 \\0 & 0 & 1\end{bmatrix}

 

[x축 90도 회전]

$$ R = R_y(\alpha)\,R_x(90^\circ)\,R_z(\gamma)  = \begin{bmatrix}\cos(\alpha - \gamma) & \sin(\alpha - \gamma) & 0 \\[4pt]0 & 0 & -1 \\[4pt]-\sin(\alpha - \gamma) & \cos(\alpha - \gamma) & 0\end{bmatrix} $$

[최종 회전행렬]

 

$x = 90^{\circ}$일 때, $y$와 $z$가 $\alpha - \gamma$형태로 묶여버린다. 그래서 회전 자유도가 3→2로 줄어들고 Yaw와 Roll이 같은 축으로 작용하는 “짐벌락 상태”가 되어버린다.

 

🤔 Y축이 90도 회전한 경우

반대로 이번엔 $\alpha = \pi/2$ 즉, y축으로 90도 회전한 결과를 계산해 보자.

$$ R_y \cdot R_x \cdot R_z = \begin{bmatrix}0 & 0 & 1 \\0 & 1 & 0 \\-1 & 0 & 0\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} $$

$$ R_y(90^\circ)\,R_x(\beta)\,R_z(\gamma)=\begin{bmatrix}\sin\beta\sin\gamma & \sin\beta\cos\gamma & \cos\beta \\[6pt]\cos\beta\sin\gamma & \cos\beta\cos\gamma & -\sin\beta \\[6pt]-\cos\gamma & \sin\gamma & 0\end{bmatrix} $$

[최종 회전행렬]

위의 경우 각 열(기저벡터)들이 여전히 서로 선형 독립인 상태이다. 따라서 $x = 90^{\circ}$일 때와 달리 두 축이 완전히 겹치지 않고, 짐벌락처럼 자유도도 사라지지 않았다.

 

행렬에서도 두 축의 항이 모두 남아있기 때문에 여전히 $\gamma$와 $\beta$가 서로 독립적으로 작용하고 있음을 확인할 수 있다.

 

2. 회전 보간

보간(Interpolation)은 두 값(또는 그 이상)의 알려진 값 사이에서 비율$(t)$에 따라 중간값을 계산하는 방법이다.

3차원 공간에서 두 회전(시작과 끝) 사이를 부드럽게 회전하기 위해 중간 회전 값을 계산해야 하는데, 이를 회전 보간(Rotation Interpolation)이라 한다.

$$ \theta' = (1-t)\theta_s + t\theta_e $$

[회전 보간식]

회전 보간이 3차원 공간의 오일러 각 회전에서 성립하는지 확인하려면 두 오일러 각의 회전 변환을 곱한 결과가 두 오일러 각의 합의 회전 변환과 동일한지 확인하면 된다.

  • 회전 보간식이 올바르게 작동하라면 회전이 덧셈처럼 누적될 수 있어야 하고, 그 조건이 $R(a + b) = R(a) \cdot R(b)$이다.

 

🛠️ 한 축(Y)만 사용하는 경우

$y$축으로 $\alpha, \beta$만큼 회전한 오일러 각 데이터는 아래와 같다.

$$ (\alpha, 0,0) \\ (\beta, 0, 0) $$

또한, 위 오일러 각에 대응하는 회전 변환은 다음과 같이 계산할 수 있다.

$$ R_\alpha = R_{yaw\alpha} \cdot I\cdot I = R_{yaw\beta} \\ R_\beta= R_{yaw\beta} \cdot I\cdot I = R_{yaw\beta} $$

 

두 오일러 각을 합한 회전 변환은,

$$ R_{(\alpha + \beta)} = R_{yaw(\alpha+\beta)} \cdot I \cdot I = R_{yaw(\alpha+\beta)} $$

 

두 오일러 각에 대응되는 회전변환을 곱한 결과는,

$$ R_{\beta} \cdot R_{\alpha} = (R_{yaw\beta} \cdot I \cdot I) \cdot(R_{yaw\alpha} \cdot I \cdot I)\\ = R_{yaw\beta} \cdot R_{yaw\alpha} \\ =R_{yaw(\beta + \alpha)} $$

y축만 사용한 두 오일러 각을 곱한 결과는, 두 오일러 각을 합한 회전 변환과 동일함을 확인할 수 있다.

 

오일러 각에서 한 축만 사용한다는 것은, 2차원 평면에서의 회전과 동일하기 때문에 회전 보간식을 사용하는데 아무런 문제가 없다.

 

🛠️ 두 개의 축(x, y)만 사용하는 경우

그렇다면 두 축에 대해서도 회전 보간을 동일하게 사용할 수 있는지 확인해 보자. 두 축에 대해 회전하는 오일러 각의 데이터는 아래와 같다.

$$ (\alpha, \alpha, 0) \\ (\beta, \beta, 0) $$

 

두 각에 대응되는 회전 변환은 아래와 같이 계산된다.

$$ R_{\alpha} = R_{\text{yaw}\alpha} \cdot R_{\text{pitch}\alpha} \cdot I = R_{\text{yaw}\alpha} \cdot R_{\text{pitch}\alpha} \\ R_{\beta} = R_{\text{yaw}\beta} \cdot R_{\text{pitch}\beta} \cdot I = R_{\text{yaw}\beta} \cdot R_{\text{pitch}\beta} $$

 

두 오일러 각을 합한 회전 변환$(R_{(\alpha + \beta)})$은,

$$ R_{(\alpha + \beta)} = R_{\text{yaw}(\alpha + \beta)} \cdot R_{\text{pitch}(\alpha + \beta)} \cdot I = R_{\text{yaw}(\alpha + \beta)} \cdot R_{\text{pitch}(\alpha + \beta)} $$

 

두 오일러 각에 대응하는 회전 변환을 곱한 결과는,

$$ R_{\beta} \cdot R_{\alpha} = \left( R_{\text{yaw}\beta} \cdot R_{\text{pitch}\beta} \cdot R_{\text{roll}\beta} \right) \cdot \left( R_{\text{yaw}\alpha} \cdot R_{\text{pitch}\alpha} \cdot R_{\text{roll}\alpha} \right) \\ = \left( R_{\text{yaw}\beta} \cdot R_{\text{pitch}\beta} \cdot I \right) \cdot \left( R_{\text{yaw}\alpha} \cdot R_{\text{pitch}\alpha} \cdot I \right) \\ = R_{\text{yaw}\beta} \cdot R_{\text{pitch}\beta} \cdot R_{\text{yaw}\alpha} \cdot R_{\text{pitch}\alpha} \\ \neq R_{(\alpha + \beta)} $$

두 오일러 각에 대응되는 회전 변환을 곱한 결과는 두 오일러 각을 합한 회전 변환과 다르다. 따라서 두 축 이상을 사용하는 오일러 각은 선형 보간식을 사용할 수 없다.

  • 3차원 공간에서 자유로운 회전 보간을 사용하기 위해선, 로드리게스 회전 공식 혹은 사원수를 사용해야 한다.

 

 

728x90

'게임수학' 카테고리의 다른 글

[게임수학] 8-1. 오일러 각(Euler's angle)  (0) 2025.10.14
[게임수학] 7. 게임 엔진  (0) 2025.09.24
[게임수학] 6.삼각형(Mesh)  (0) 2025.09.20
[게임수학] 6-2. 투영 벡터  (0) 2025.09.12
[게임수학] 6-1. 내적(Dot product)  (0) 2025.09.12
'게임수학' 카테고리의 다른 글
  • [게임수학] 8-1. 오일러 각(Euler's angle)
  • [게임수학] 7. 게임 엔진
  • [게임수학] 6.삼각형(Mesh)
  • [게임수학] 6-2. 투영 벡터
브라더스톤
브라더스톤
유티니, C#과 관련한 여러 정보를 끄적여둔 블로그입니다. Email : dkavmdk98@gmail.com
  • 브라더스톤
    젊은 프로그래머의 슬픔
    브라더스톤
  • 전체
    오늘
    어제
    • 개발 노트 (39)
      • Unity,C# (28)
        • Unity 정보 (5)
        • 알고리즘 (11)
        • 자료구조 (3)
        • 절차적생성(PCG) (9)
      • 게임수학 (11)
      • C++ (0)
        • 자료구조 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    이진공간분할
    게임수학
    C#
    카메라공간
    정렬알고리즘
    회전보간
    BSP
    절차적던전생성
    최단경로찾기
    unity
    오일러각 단점
    절차적지형생성
    PerlinNoise
    모델링행렬
    자료구조
    Euler's angle
    알고리즘
    ProjectOnPlane
    pcg
    경사로이동
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
브라더스톤
[게임수학] 8-2. 오일러 각의 단점(짐벌락, 회전 보간)
상단으로

티스토리툴바