공부/컴퓨터 그래픽스

OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 04 좌표계와 변환

bokob 2024. 6. 30. 13:32

게임과 같은 3차원 가상 공간은 많은 물체들로 구성되어 있다.

각 물체의 위치는 이동(translation)에 의해, 방향은 회전(rotation)에 의해, 크기는 축소확대(scaling)에 의해 결정된다.

이동, 회전, 축소확대를 총칭해서 변환(transform)이라고 한다.

4.1 2차원 변환의 행렬 표현

4.1.1 축소 변환

2차원 축소확대는 2 x 2 행렬로 표현된다.

$s_x$dhk $s_y$는 각각 x축과 y축 방향의 축소확대 인자(scaling factor)

그 값이 1보다 작으면 축소, 1보다 크면 확대를 의미

2차원 벡터(x, y)는 행렬-벡터 곱셈을 통해 축소확대된다.

 

4.1.2 회전

2차원 벡터 p는 원점을 기준으로 θ만큼 회전하여 p' 가 된다. 벡터 p의 길이가 r이라면 p의 좌표는 다음과 같다.

회전한 벡터 p' 의 길이도 r이므로 p'의 x좌표는 다음과 같다.

y좌표는 다음과 같다.

하나의 행렬-벡터 곱셈으로 정리하면 다음과 같다.

2 x 2 행렬이 2차원 회전을 표현하는데, 이를 R(θ)라고 표기

- θ만큼 회전은 2π- θ만큼 회전화는 것과 동일하다. ex) R(-90°) = R(270°)

 

4.1.3 이동과 동차 좌표

축소확대, 회전은 선형 변환(linear transform)이라는 범주에 속한다.

이동은 (x, y)에 놓인 점을 (x+dx, y+dy)로 이동시키는데, (dx, dy)를 변위 벡터(displacement vector)라고 부른다.

이동은 선형 변환의 범주에 속하지 않고, 벡터 덧셈으로 구현된다.

행렬 곱셈으로 구현되는 축소확대 및 회전과는 다른 형태다.

동차 좌표(homogeneous coordinates)를 사용하면 행렬 곱셈으로 구현될 수 있다.

한 점의 카테시안 좌표(x, y)가 주어질 때 이에 대한 동차 좌표는 간단히 (x, y, 1)로 표현할 수 있다.

이동 행렬은 3 x 3 단위 행렬의 마지막 열에 아래처럼 (dx, dy)를 삽입하면 완성된다.

동차 좌표로 표현된 점에 이 행렬을 곱하면 다음과 같다.


참고

변환(또는 사상) T가 다음을 만족하면 선형(linear)이라 한다.

  • T의 정의역에 속하는 모든 u, v에 대하여 \( T(\mathbf{u} + \mathbf{v}) = T(\mathbf{u}) + T(\mathbf{v}) \)
  • 모든 스칼라 c와 T의 정의역에 속하는 모든 u에 대하여 \( T(c\mathbf{u}) = cT(\mathbf{u}) \)

모든 행렬 변환은 선형변환이다.

선형 변환은 벡터합과 스칼라곱 연산을 보존한다.

 

이동은 위의 조건을 만족하지 않는다.

 

이동 변환은 벡터 \(\mathbf{v}\)를 고정된 벡터 \(\mathbf{a}\)만큼 이동시키는 변환이다. 즉,
\[ T(\mathbf{v}) = \mathbf{v} + \mathbf{a} \]

고정된 이동 벡터를 \(\mathbf{a} = \begin{pmatrix} 2 \\ 3 \end{pmatrix}\)로 설정

1) 덧셈에 대한 보존조건

벡터 \(\mathbf{u} = \begin{pmatrix} 1 \\ 1 \end{pmatrix}\)와 \(\mathbf{v} = \begin{pmatrix} 2 \\ 2 \end{pmatrix}\)

 

\[ T(\mathbf{u} + \mathbf{v}) = T \left( \begin{pmatrix} 1 \\ 1 \end{pmatrix} + \begin{pmatrix} 2 \\ 2 \end{pmatrix} \right) = T \left( \begin{pmatrix} 3 \\ 3 \end{pmatrix} \right) = \begin{pmatrix} 3 \\ 3 \end{pmatrix} + \begin{pmatrix} 2 \\ 3 \end{pmatrix} = \begin{pmatrix} 5 \\ 6 \end{pmatrix} \]

 

\[ T(\mathbf{u}) = \begin{pmatrix} 1 \\ 1 \end{pmatrix} + \begin{pmatrix} 2 \\ 3 \end{pmatrix} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \]
\[ T(\mathbf{v}) = \begin{pmatrix} 2 \\ 2 \end{pmatrix} + \begin{pmatrix} 2 \\ 3 \end{pmatrix} = \begin{pmatrix} 4 \\ 5 \end{pmatrix} \]
\[ T(\mathbf{u}) + T(\mathbf{v}) = \begin{pmatrix} 3 \\ 4 \end{pmatrix} + \begin{pmatrix} 4 \\ 5 \end{pmatrix} = \begin{pmatrix} 7 \\ 9 \end{pmatrix} \]

 

덧셈에 대한 보존 조건을 만족하려면,
\[ T(\mathbf{u} + \mathbf{v}) = T(\mathbf{u}) + T(\mathbf{v}) \]
여기서,
\[ \begin{pmatrix} 5 \\ 6 \end{pmatrix} \neq \begin{pmatrix} 7 \\ 9 \end{pmatrix} \]

따라서, 덧셈에 대한 보존 조건을 만족하지 않는다.

 

2) 스칼라 곱에 대한 보존 조건

벡터 \(\mathbf{u} = \begin{pmatrix} 1 \\ 1 \end{pmatrix}\)와 스칼라 \(c = 3\)

\[ T(c\mathbf{u}) = T \left( 3 \begin{pmatrix} 1 \\ 1 \end{pmatrix} \right) = T \left( \begin{pmatrix} 3 \\ 3 \end{pmatrix} \right) = \begin{pmatrix} 3 \\ 3 \end{pmatrix} + \begin{pmatrix} 2 \\ 3 \end{pmatrix} = \begin{pmatrix} 5 \\ 6 \end{pmatrix} \]

\[ T(\mathbf{u}) = \begin{pmatrix} 1 \\ 1 \end{pmatrix} + \begin{pmatrix} 2 \\ 3 \end{pmatrix} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \]
\[ cT(\mathbf{u}) = 3 \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 9 \\ 12 \end{pmatrix} \]

스칼라 곱에 대한 보존 조건을 만족하려면,
\[ T(c\mathbf{u}) = cT(\mathbf{u}) \]
여기서,
\[ \begin{pmatrix} 5 \\ 6 \end{pmatrix} \neq \begin{pmatrix} 9 \\ 12 \end{pmatrix} \]

따라서, 스칼라 곱에 대한 보존 조건을 만족하지 않는다.

 

이동변환은 위 두 조건을 만족하지 않아 선형 변환이 아니다.

선형변환과 이동을 하나의 행렬로 표현하기 위한 아핀 변환이 필요하다.


2차원 카테시안 좌표 (x, y)의 동차 좌표는 (x, y, 1)로 국한되지 않는다.

(wx, wy, wz)로 표현된다. w는 0이 아니어야 한다.

위 사진에서 (2, 3)의 동차 좌표는 (2, 3, 1), (4, 6, 2), (6, 9, 3) 등 무한히 많다.

즉, (x, y, 1)은 카테시안 좌표 (x, y)에 해당하는 무한히 많은 동차 좌표 중 하나이다.

동차 좌표  (X, Y, w)가 주어졌을 때, 전체를 w로 나누면 (X/w, Y/w, 1)이 된다.

위 사진에서는 3차원 직선 위의 한 점(X, Y, w)를 직선에 따라 w=1 평면으로 투영(project)시키는 모습이다.

이러한 투영 후에 (X/w, Y/w)를 취하면 카테시안 좌표가 된다.

 

동차좌표를 다루기 위해서는 축소확대와 회전의 2 X 2 행렬의 형태를 다음과 같이 각각 변경해야 한다.

(좌) 축소확대, (우) 회전

 

4.1.4 2차원 변환의 결합

여러 번의 변환을 하나로 합칠 수 있다.

행렬 곱셈에서는 교환 법칙이 성립되지 않는다.

TR 과 RT의 결과가 다르다.

 

임의의 점을 중심으로 하는 회전

 

임의의 점 (a, b)를 중심으로 (x, y)를 회전하는 것은 세 단계로 나눠져 구현된다.

1) (x, y)를 (-a, -b)만큼 이동

2) 이동된 점 (x-a, y-b)를 원점 중심으로 회전

3) 회전 결과를 (a, b)만큼 이동

 

4.2 아핀 변환

이동은 선형 변환에 속하지 않는다. 선형변환과 이동을  포함하는 아핀 변환(affine transform)에 속한다.

2차원 아핀 변환은 3 X 3 행렬로 표현되므로, 몇 개의 아핀 변환이 주어지건 모두 하나의 행렬로 결합 가능하다.

행렬의 3번 행은 항상 (0 0 1)로 고정된다.

 

고정되는 3번 행을 무시하고 나머지 2 X 3 행렬을 [L|t]로 표기하자.

L은 왼쪽의 2 X 2 행렬, t는 3번 열을 말한다.

L은 '누적된 선형 변환', t는 '누적된 이동'을 표현한다.

L에는 어떠한 이동 요소도 포함되지 않는다.

t는 입력으로 주어진 선형 변환을 포함할 수 있다. (위 사진에서 세 번째 열을 보면 변위 벡터 원소 뿐 아니라 선형 변환까지 포함하고 있음)

어떤 물체를 [L|t]로 변환하는 것을 개념적으로 해석하면, 그 물체에 L을 먼저 적용하고 그렇게 선형 변환된 물체에 t를 적용하는 것과 같다. 즉, 폴리곤 메시로 표현된 물체의 각 정점을 p라 할 때, Lp + t 방식으로 변환이 이루어지는 것이다.

 

강체 변환(rigid motion)

축소확대 없이 회전과 이동이 결합된 변환에서는 물체의 방향과 위치를 변경시킬 뿐 그 물체의 외양에는 여향을 미치지 못한다. 이를 강체 변환이라 함

 

4.3 3차원 변환의 행렬 표현

4.3.1 축소확대

3차원 축소확대는 3 X 3 행렬로 표현된다.

2차원  2 X 2 행렬에 z축 방향 축소확대 인자가 추가된 것이다.

모든 축소확대 인자가 같으면 균등(uniform)하다고, 그렇지 않으면 비균등(non-uniform)하다고 부른다.

4.3.2 회전

회전중심(center of rotation)을 필요로 했던 2차원 회전과는 다르게, 3차원 회전은 회전축(axis of rotation)을 필요로 한다.

위 사진은 z축을 중심으로 θ=90°만큼 회전시킨 것이다.

 

주축 중심 회전을 구하는 법

위의 사진은 z축 중심 회전을 구한 것으로 x축 중심 회전을 유도하는 것이다.

오른손 법칙에서 오른손 엄지 손가락을 회전축과 나란히 놓으면, 나머지 네 손가락이 회전 방향이 된다.

위 사진에서는 엄지 손가락이 x축과 나란하고, 네 손가락은 y축에서 z축 방향으로 감싸쥐게 된다. 

$x' = x$

$y' = y\cos\theta - z\sin\theta$

$z' = y\sin\theta + z\cos\theta$

 

4.3.3 이동과 동차 좌표

동차 좌표를 이용한 3차원 이동은 4 X 4 단위 행렬의 마지막 열에 (dx, dy, dz)를 삽입한 것으로 정의된다.

3차원 점의 동차 좌표(x, y, z, 1)에 곱하면 다음과 같이 된다.

3차원 축소확대 및 회전 행렬도 동차 좌표계에서는 4 X 4 크기를 가지게 된다.

축소확대는 다음과 같이 된다.

4.4 월드 변환

오브젝트 공간(object space)

  • 하나의 물체를 모델링하는 데 사용되는 좌표계

월드 공간(world space)

  • 각자의 오브젝트 공간에서 정의된 물체들로 3차원 가상 환경을 구성하기 위해 하나의 좌표계로 통합할 때 사용하는 좌표계

월드 변환(world transform)

  • 오브젝트 공간의 좌표로 되어있는 모델 정보를 월드 공간에서 구성하기 위한 변환

3D 공간에서의 아핀 변환

 

4.5 회전과  오브젝트 공간 기저

오브젝트 공간에서 한 물체의 모델링이 완료되면, 그 물체는 자신의 오브젝트 공간과 일체가 된다.

즉, 물체를 움직이게 되면 그 오브젝트 공간도 따라서 같이 움직인다.

위 사진에서 $\left\{e_1, e_2, e_3 \right\}$는 월드 공간의 기저, $ $\left\{u, v, n \right\}$ 은 오브젝트 공간의 기저를 나타낸다.

초기에 그 둘은 일치하지만 물체가 회전하면 다르게 된다.

회전 후 물체의 방향은 $\left\{ u, v, n \right\}$ 으로 표현할 수 있다.

물체에 적용된 회전을 R이라하면 각 월드 공간의 기저 원소들에 적용되게 된다.

이를 한 번에 표현하면 위 사진에서 두 번째 줄처럼 된다. 단위 행렬이 곱해진 것과 같으므로 R이 오브젝트 공간의 기저인 것을 얻을 수 있다.

여기서, 회전된 물체의 오브젝트 공간 기저인 $\left\{ u, v, n \right\}$ 이 주어졌다면, 그 회전 행렬을 즉각 정의할 수 있다는 것을 알 수 있다. 즉, 회전 행렬은 $\left\{u, v, n \right\}$ 으로 세 열을 채우면 된다.

반대로 회전 행렬이 주어졌다면, 그 행렬의 세 열이 바로 물체의 오브젝트 공간 기저 $\left\{u, v, n \right\}$ 이 된다.

이는 모든 회전에 적용된다.

 

주축이 아닌 임의의 축을 중심으로 하는 회전에서도 적용된다.

4.6 역변환

역변환(inverse transform)은 매우 자주 사용되는 중요한 개념

변위 벡터가 (dx, dy, dz)인 이동 $T$의 역변환은 (-dx, -dy, -dz)만큼 이동하는 것이다.

 

$T$의 역변환을 $T^{-1}$이라고 표기, 실제로 $T$의 역행렬이 된다.

$\left(s_x, s_y, s_z\right)$를 축소확대 인자로 가지는 축소확대 역변환은 다음과 같다.

 

 

회전의 역변환

항상 오브젝트 공간 기저 $\left\{{u, v, n\right\}$이 직교정규 성질을 가진다고 가정한다.

따라서 하나의 기저 벡터가 자신과 내적되었을 때 그 결과는 1이다.

반면, 서로 다른 기저 벡터 간 내적은 0이다.

이를 이용해 회전 행렬과 그 전치행렬의 곱을 정리하면 다음과 같다.

$R^{T} = R^{-1}$임을 보이고 있다.

회전의 전치행렬을 취하면 바로 역변환을 얻게 된다.

 

출처

[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]을 보고 공부하고 정리한 내용