[이득우 게임수학] 10. 3차원 공간 : 입체 공간의 생성

10.1 3차원 공간의 설계

3차원 공간을 설계하는 방법은 왼손 좌표계와 오른손 좌표계 크게 두가지로 구분된다. 왼손 좌표계는 내가 바라보는 정면이 +z축 이고 위가 +y, 오른쪽이 +x인 방향이다. 오른손 좌표계는 나한테 오는 방향(나의 뒤방향)이 +z 축이고, 위가 +y, 오른쪽이 +x인 방향이다. 왼손과 오른손은 z축의 방향차이로 확인할 수 있다.

10.2 3차원 공간의 트랜스폼

3차원 트랜스폼 체계는 2차원 공간의 트랜스폼에서 기저벡트가 하나더 증가했을 뿐이다. 이동 변환을 위해 한 차원 더 늘어난 4차원 공간을 사용한다.

    ┌ S_x   0    0    0 ┐
S = │  0   S_y   0    0 │
    │  0    0   S_z   0 │
    └  0    0    0    1 ┘

    ┌ 1  0  0  t_x ┐
T = │ 0  1  0  t_y │
    │ 0  0  1  t_z │
    └ 0  0  0   1  ┘

오일러 각

오일러 각(Euler's angle)은 3차원 공간에서 물체가 놓인 방향을 3개의 각을 사용해 표시하는 방법이다. 표준기저벡터를 축으로 하는 회전의 움직임은 방향에 따라 요(Yaw), 롤(Roll), 피치(Pitch)로 불린다.

  • 요(Yaw) - 위 x출
  • 롤(Roll) - 앞 z축
  • 피치(Pitch) - 오른쪽 x축

3축의 회전 행렬은 다음과 같이 설계할 수 있다.

1   0      0   ┐
R_x = │ 0  cosθ  -sinθ │   
      └ 0  sinθ   cosθ ┘

      ┌  cosθ  0  sinθ ┐
R_y = │   0    1   0   │   
      └ -sinθ  0  cosθ ┘

      ┌ cosθ  -sinθ  0 ┐
R_z = │ sinθ   cosθ  0 │   
      └  0      0    1

회전행렬의 유도

세 번의 연속적인 회전으로 총 6가지 경우가 발생한다

  1. x -> y -> z
  2. x -> z -> y
  3. y -> x -> z
  4. y -> z -> x
  5. z -> x -> y
  6. z -> y -> x

이 책에서는 5번의 z->x->y 순서를 채택하였다.

R = R_yaw · R_pitch · R_roll

                  ┌ cosα cosy + sinα sinβ sinγ    -cosα sinγ + sinα sinβ cosγ    sinα cosβ   ┐
R_α · R_β · R_γ = │       cosβ sinγ                      cosβ cosγ                 -sinβ     │
                  └ -sinα cosγ + cosα sinβ sinγ    sinα sinγ + cosα sinβ cosγ    cosα cosβ   ┘

3차원 모델링 행렬

3차원 공간의 트랜스폼을 구성하는 크기(S), 회전(R), 이동(T) 변환 행렬은 다음과 같다.

    ┌ S_x   0    0    0 ┐
S = │  0   S_y   0    0 │
    │  0    0   S_z   0 │
    └  0    0    0    1 ┘
    ┌ X_x  Y_x  Z_x   0 ┐
R = │ X_y  Y_y  Z_y   0 │
    │ X_z  Y_z  Z_z   0 │
    └  0    0    0    1 ┘

    ┌ 1  0  0  t_x ┐
T = │ 0  1  0  t_y │
    │ 0  0  1  t_z │
    └ 0  0  0   1  ┘

                ┌ X_x S_x   Y_x S_y   Z_x S_z   t_x ┐
M = T · R · S = │ X_y S_x   Y_y S_y   Z_y S_z   t_y │
                │ X_z S_x   Y_z S_y   Z_z S_z   t_z │
                └    0         0         0       1  ┘

10.3 카메라 공간

3차원에서 카메라의 트랜스폼은 이동행렬과 회전행렬의 역행렬로 구할 수 있다.

M = T · R

M^-1 = (T · R)^-1 = R^-1 · T^-1

//최종 뷰 행렬 V
                  ┌ -X_x   -X_y    -X_z    x·t  ┐
V = R^-1 · T^-1 = │  Y_x    Y_y     Y_z   -y·t  │
                  │ -Z_x   -Z_y    -Z_z    z·t  │
                  └   0      0       0      1

10-1 실습

처음 그려보는 3차원 공간

10.4 오일러 각의 특징

오일러 각은 3차원 공간의 회전을 지정할 때 직관적인 인터페이스를 제공한다. 표준기저벡터를 회전축으로 사용하기 때문에 회전을 설계하기가 용이하다. 적은 용량으로 3차원 공간의 회전 정보를 기록할 수 있다.

짐벌락 현상

오일러 각을 사용할 때 특정 상황에서 회전 움직임이 제한되는 짐벌락(Gimbal lock) 현상을 감안해야한다.

  • z축을 90도 회전시킨다.
  • x축을 -90도 회전시킨다.
  • y축을 회전해보면 처음의 z축 회전과 동일함을 발견할 수 있다.

10-2 실습

짐벌락 현상의 체험

회전 보간의 계산

경과된 시간에 따라 회전이 변화되도록 중간 회전값을 계산하는 것을 회전 보간(Rotaional interpolation)이라고 한다. 중간 회전 값은 선형 보간의 식을 사용해 얻을 수 있다.

θ` = (1-t)θ_start + tθ_end

한축에 대해서 회전하는 것은 문제가 없지만 두 축에 대해서 회전하는 오일러 각은 선형 보간식을 사용할 수 없다.

10.5 정리

  • 3차원 트랜스폼과 카메라 설정방법
  • 역행렬을 활용한 카메라의 뷰 좌표계를 구성하는 방법
  • 뷰 공간에서 카메라 앞에 위치한 모든 물체의 z값은 음수값을 갖는다.
반응형

댓글

Designed by JB FACTORY