티스토리 뷰

이론/Math

변환

미누시 2019. 11. 6. 03:03

이번 포스팅에서는 변환(transformation)에 대해서 배워보겠습니다.

 

3차원 그래픽은 3차원 세계의 물체의 외부 표면을 근사(approximation)하는 일단의 삼각형으로 물체를 표현합니다(모델의 폴리곤을 생각하시면 될 것 같습니다). 이러한 물체들을 변환함으로써 물체에 변화를 줄 수 있습니다. 3차원 그래픽에 쓰이는 주된 기하학적 변환은 다음과 같습니다 :

  • 이동변환
  • 회전변환
  • 비례변환

 

그럼 변환에 대해서 천천히 알아가보겠습니다.

 

 

 

선형변환


수학 함수 τ(v) = τ(x,y,z) = (x',y',z') 가 있다고 가정해 보겠습니다. 이 함수는 3차원 벡터 하나를 입력받아 3차원 벡터 하나를 출력합니다. 만약, 함수 τ에 대해 다음과 같은 성질들이 성립하면, τ를 가리켜 선형 변환(linear transformation) 이라고 합니다.

  • τ(u + v) = τ(u) + τ(v)
  • τ(ku) = kτ(u)

 

이 때, u = (ux, uy, uz), v = (vx, vy, vz)는 임의의 3차원 벡터이며 k는 스칼라입니다(참고로 입력과 출력이 3차원 벡터가 아닌 함수도 선형변환이 될 수 있습니다. 하지만 여기서는 주제에 벗어나므로 다루지 않습니다). 다음의 예시를 들어보겠습니다.

τ(x, y, z) = (x^2, y^2, z^2) 에 대해, τ(1, 2, 3) = (1, 4, 9)입니다. 이 함수는 다음과 같은 이유로 선형변환이 성립하지 않습니다.
k = 2이고, (x, y, z) = (1, 2, 3) 일 때
τ(ku) = τ(2, 4, 6) = (4,16, 36)
kτ(u) = 2τ(1, 2, 3) = (2, 8, 18) 로, 서로 같지 않습니다.

 

또한 τ가 선형변환일 때 다음 역시 성립합니다(선형성).

  • τ(au + bv + cw) = τ(au + (bv + cw))
  • = aτ(u) + τ(bv + cw)*
  • = aτ(u) + bτ(v) + cτ(w)*

 

 

행렬 표현

u = (x, y, z)라고 할 때, 이를 다음과 같이 표현할 수 있습니다 :

  • u = (x, y, z) = xi + yj + zk = x(1, 0, 0) + y(0, 1, 0) + z(0, 0, 1)

 

여기서 벡터 i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1)은 현재 좌표계의 축들과 같은 방향인 단위벡터들인데, 이들을 R3에 대한 표준기저벡터(standard basis vector) 라고 부릅니다(R3은 모든 3차원 좌표 벡터 (x, y, z)의 집합을 뜻합니다). τ가 하나의 선형변환이라면, 선형성에 의해 다음 식이 성립합니다 :

  • τ(u) = τ(xi + yj + zk) = xτ(i) + yτ(j) + zτ(k)

 

이것은 이전 포스팅에서 본 선형결합의 형태입니다. 따라서 이를 벡터와 행렬의 곱으로 표현할 수 있습니다. 즉, 다음과 같이 표현할 수 있습니다.

  • τ(u) = τ(xi + yj + zk) = xτ(i) + yτ(j) + zτ(k)
  • = uA = [x, y, z][[A11, A12, A13], [A21, A22, A23], [A31, A32, A33]]
    (여기서 τ(i) = (A11, A12, A13), τ(j) = (A21, A22, A23), τ(k) = (A31, A32, A33)입니다.)

 

이러한 행렬 A를 선형변환 τ의 행렬 표현(matrix representation) 이라고 부릅니다.

 

 

비례

그림1. 비례(scaling)의 예

비례(scaling; 확대, 축소) 변환 은 물체의 크기를 바꾸는 효과를 냅니다. 게임 엔진을 다뤄보신 분들은 transform의 scale factor 부분이라고 생각하시면 됩니다. 비례 변환은 다음과 같이 정의됩니다 :

  • S(x, y, z) = (sx * x, sy * y, sz * z)

 

이 변환은 현재 좌표계를 기준으로 벡터를 x축으로 sx 단위, y축으로 sy 단위, z축으로 sz 단위만큼 비례하게 됩니다. 함수 S는 선형변환인데, 이것을 아래에서 증명하겠습니다 :

  • S(u + v) = (sx(ux + vx), sy(uy + vy), sz(uz + vz))

  • = (sx * ux + sx * vx , sy * uy + sy * vy, sz * uz + sz * vz)

  • = (sx * ux, sy * uy, sz * uz) + (sx * vx, sy * vy, sz * vz)

  • = S(u) + S(v)

  • S(ku) = (sx * kux, sy * kuy, sz * kuz)

  • = k(sx * ux, sy * ux, sz * uz)

  • = kS(u)

 

즉, S는 선형변환이며 그러므로 행렬 표현 역시 존재합니다. 행렬 표현을 구하기 위해서는 함수 S를 표준기저벡터들 각각에 적용하고 결과로 나오는 벡터들로 행을 구성하는 행렬을 만들면 됩니다.

  • S(i) = (sx * 1, sy * 0, sz * 0) = (sx, 0, 0)
  • S(j) = (sx * 0, sy * 1, sz * 0) = (0, sy, 0)
  • S(k) = (sx * 0, sy * 0, sz * 1) = (0, 0, sz)
  • S의 행렬 표현 :

 

이 행렬을 비례행렬(scaling matrix) 라고 합니다. 비례 행렬의 역은 다음과 같습니다 :

 

 

회전

그림2. 벡터 n에 대한 기하구조의 회전

회전은 위의 그림에서처럼 벡터 v를 축 n에 대해 회전하는 변환을 살펴보겠습니다. 이 변환에서 회전각은 n의 진행 방향을 기준으로 반시계 방향으로 측정하며, ||n|| = 1이라고 가정합니다.

 

먼저 vn에 평행한 부분과 n에 수직인 부분으로 분해합니다. 평행한 부분은 proj_n(v)로 나타낼 수 있고, 수직 부분은 V⊥ = perp_n(v) = v - proj_n(v)로 나타낼 수 있습니다.

 

여기서 n에 평행한 부분 proj_n(v)는 회전에 대해서 불변(invariant)이므로(벡터가 회전해도 변하지 않습니다), 수직인 부분을 회전하는 방법만 알면 됩니다. 회전된 벡터 Rn(v)는 proj_n(v) + Rn(v⊥)이므로, Rn(v⊥)만 구하면 됩니다.

 

Rn(v⊥)을 구하기 위해, 회전 평면 하나에 2차원 좌표계를 설정합니다. v⊥를 두 기준 벡터(reference vector) 중 하나로 사용하고, 다른 하나는 v⊥n에 수직인 벡터, n x v를 사용합니다.

 

이 때, ||n x v|| = ||n|| ||v|| sinα = ||v|| sinα = ||v⊥||이므로, 두 기준 벡터의 크기는 같습니다. 또한 두 벡터 모두 원(회전 평면)의 원점에 놓여 있습니다. 삼각함수에 의해, 다음이 성립합니다 :

  • Rn(v⊥) = cosΘv⊥ + sinΘ(n x v)

 

이로부터 다음과 같은 회전 공식을 끌어낼 수 있습니다 :

  • Rn(v) = proj_n(v) + Rn(v⊥)
  • = (n · v)n + cosΘv⊥ + sinΘ(n x v) { proj_n(v) = (n · v)n이므로 }
  • = (n * v)n + cosΘ(v - (n · v)n) + sinΘ(n x v) { v⊥ = v - (n · v)n이므로 }
  • = cosΘv + (1 - cosΘ)(n · v)n + sinΘ(n x v)

 

이 변환의 행렬 표현인 회전행렬(rotation matrix) 은 다음과 같습니다 :

 

회전행렬에는 흥미로운 성질이 있느느데, 행렬의 각 행벡터는 단위 길이이며, 행백터들은 서로 직교입니다. 따라서 행벡터들은 정규직교(서로 직교이고 단위 길이) 입니다. 직교행렬에는 그 역행렬이 자신의 전치행렬과 같다는 편리한 속성이 있으므로, 회전 행렬 Rn의 역은

 

특히, 회전축이 x축이나 y축, z축(즉, n = (1, 0, 0) or (0, 1, 0) or (0, 0, 1))이면 회전 행렬이 아주 간단해지는데, 각각의 축에 대해 다음과 같다 :

 

 

 

아핀변환


아핀변환(affine transformation; 어파인변환, 상관변환)은 선형 변환에 이동변환(translation transformation; 또는 병진이동변환)을 결합한 형태입니다. 그런데 벡터는 위치와 무관하게 오직 방향과 크기만 서술하므로, 벡터의 이동은 의미가 없습니다. 즉, 벡터는 이동에 대해 불변이어야 하고, 오로지 점에 대해서(위치벡터)만 적용해야 합니다.

 

여기서 동차 좌표(homogeneous coordinate) 라는 것을 이용하면 점과 벡터를 동일한 방식으로 다룰 수 있습니다. 동차좌표란 3차원 벡터에 w 성분을 추가한 4값 쌍(4-tuple) 의 형태로, 동차좌표가 점인지 벡터인지를 나타내는데 이 w 요소의 값이 사용됩니다. 정확히는,

  • 벡터를 나타내는 동차좌표의 경우 (x, y, z, 0) 으로 표현됩니다.
  • 점을 나타내는 동차좌표의 경우 (x, y, z, 1) 으로 표현됩니다.

 

즉, w 요소를 1과 0으로 설정함으로써 점의 이동변환이 제대로 수행하는 것과 벡터에 대한 이동변환이 벡터의 성분을 바꾸는 문제를 방지할 수 있습니다(만약 벡터의 성분이 바뀌면 벡터의 본질적 속성인 방향 및 크기가 변하므로, 벡터에 이동변환을 적용했을 때 벡터의 성분들이 바뀌어서는 안됩니다).

참고
동차좌표의 표기법은 앞선 포스팅(벡터 대수)의 연산들을 만족합니다. 두 점의 차에 대해서 위치벡터는 w요소가 1 - 1 = 0으로 하나의 벡터가 되고, 점에 벡터를 더하는 p + v에서 w 요소는 1 + 0 = 1은 하나의 점이 됩니다.

 

 

아핀변환

3차원 그래픽에 필요한 변환 중 선형변환으로 서술할 수 없는 것들도 존재합니다. 따라서 아핀 변환이라는 좀 더 넓은 부류의 함수들을 도입해야 할 필요가 있습니다. 아핀변환선형변환에 이동 벡터 b를 더한 것입니다.

  • α(u) = τ(u) + b

 

이를 행렬표현으로 나타내면,

  • α(u) = uA + b = (여기서 A는 선형 변환의 행렬 표현을 의미합니다)

 

w = 1인 동차좌표를 도입하면 아핀변환을 다음과 같이 좀더 간결하게 표기할 수 있습니다 :

 

추가된 b 는 본질적으로 하나의 이동(위치 변경)을 나타냅니다. 벡터에는 위치가 없으므로 벡터에 대해서 이동을 적용하지 말아야하지만, 아핀변환의 선형변환 부분은 여전히 벡터에 적용할 수 있어야 합니다.

이 때 동차좌표 벡터의 w = 0을 설정하면 b에 의한 이동은 적용되지 않습니다.

참고
동차좌표를 도입한 아핀변환에서 행벡터 [x, y, z, 1]과 아핀 변환 행렬의 4번째 열벡터 [0, 0, 0, 1]의 내적 [x, y, z, 1] · [0, 0, 0, 1] = w임을 알 수 있습니다. 즉, 아핀변환 행렬이 동차좌표 벡터의 w 요소를 변경하지 않습니다.

 

 

이동

주어진 인수(입력)을 그대로 반환하는 선형 변환 I(u) = u항등 변환(identity transformation) 이라고 합니다. 이 선형변환의 행렬 표현은 단위행렬로 나타낼 수 있습니다.

이동변환은 선형변환 부분이 하나의 단위행렬인 아핀변환이라고 정의할 수 있습니다. 즉,

  • τ(u) = uI + b = u + b

 

수식에서 보듯이 이 변환은 점 ub만큼 이동(변위) 시킵니다. 이것을 행렬로 표현하면 다음과 같습니다 :

 

이러한 행렬 표현을 이동행렬(translation matrix) 라고 부르며, 이동행렬의 역은 다음과 같습니다 :

 

 

비례와 회전을 위한 아핀 변환 행렬들

만일 b = 0이면 아핀변환이 일반적인 선형변환과 같습니다. 이 말은, 어떤 선형변환도 b = 0인 아핀변환으로 표현할 수 있다는 의미입니다. 비례변환과 회전변환을 아핀 행렬로 다음과 같이 표현할 수 있습니다 :

 

 

아핀변환 행렬의 기하학적 해석

아핀변환 행렬의 수치들의 기하학적 의미를 이해하기 위해 강체(rigid body) 변환을 생각해보겠습니다. 강체 변환은 간단히 변환 시의 물체 형태가 그대로 유지되는 변환을 의미합니다(모습이 변하지 않는 고체라고 생각하면 편합니다).

 

τ가 물체를 얼마나 회전할 지를 나타내는 회전변환이고, b가 얼마나 이동할 것인지를 나타내는 변위 벡터라고 했을 때, 강체 변환을 다음과 같은 아핀변환으로 서술할 수 있습니다 :

  • α(x, y, z) = τ(x, y, z) + b = xτ(i) + yτ(j) + zτ(k) + b

그림3. 아핀변환 행렬의 기하학적 의미

 

그림을 보면 이 등식의 기하학적 의미를 알 수 있습니다. τ는 회전변환이므로 길이 및 각도가 보존되며, 벡터 b는 단지 원점으로부터 변위를 나타내는 위치벡터일 뿐입니다. 비례 및 기울이기(skew) 변환에도 같은 원리가 적용됩니다.

 

 

 

변환들의 합성


S 가 비례행렬이고 R이 회전행렬, T가 이동행렬이라고 하면, 정점 8개(i = 0, ..., 7)로 이루어진 입방체의 각 정점 vi에 이 세 변환을 연달아 적용할 수 있습니다. 이를 수행하는 방법 중 하나는 행렬들을 하나씩 차례대로 적용하는 것입니다.

  • ((viS)R)T = (v'i * R)T = v``i * T = v```i

 

행렬 곱셈은 결합법칙을 만족하므로, 다음과 같이 표기할 수도 있습니다 :

  • vi(SRT) = v```i

 

행렬 C = SRT 를 세 가지 변환을 하나의 전체적인 변환으로 감싼 행렬로 간주할 수 있습니다. 즉, 행렬 곱셈은 여러 변환을 하나로 합치는 효과를 낼 수 있다는 의미입니다.

 

이러한 합성(composition)은 성능에 영향을 줍니다. 예를 들어 2000개의 점으로 이루어진 3차원 물체에 3가지 기하 변환을 연달아 적용하면 단계별 방식에서는 벡터와 행렬에 대한 곱셈이 20000 * 3회 필요하지만, 합성된 행렬 접근방식에서는 벡터 대 행렬 곱셈 20000회 + 행렬 대 행렬 곱셈 2회면 충분합니다. 즉, 전체적으로 연산 횟수가 줄게 되어 이득임을 의미합니다.

참고 : 행렬의 곱셈은 교환법칙을 만족하지 않습니다. 따라서 이동 후 회전(TR)과 회전 후 이동(RT)의 결과는 같지 않습니다.

 

 

 

좌표 변경 변환(좌표계 변환)


한 좌표계의 좌표를 다른 좌표계의 좌표로 변환하는 것을 좌표 변경 변환(change of coordinate transformation) 이라고 합니다. 좌표 변경 변환을 적용한다고 기하구조 자체가 변하는 것은 아니며, 좌표계가 바뀌면 그에 따라 기하구조의 좌표 표현이 변하게 될 뿐입니다. 이는 기하구조가 실제로 회전, 이동, 비례변환을 수행한 것과는 대조적인 관점입니다.

 

3차원 컴퓨터 그래픽에서 여러 개의 좌표계를 사용하는 경우가 많기 떄문에 한 좌표계에서 다른 좌표계로의 변환 방법에 익숙할 필요가 있습니다. 위치는 벡터가 아니라 점의 속성이므로 점에 대한 좌표계 변환과 벡터에 대한 좌표계 변환은 서로 다릅니다.

그림4. 좌표계에 따른 벡터의 좌표 표현의 차이

 

 

벡터

그림5. 벡터 p에 대한 좌표계 A 및 B에서의 표현

 

그림5에는 두 좌표계 A, B 그리고 벡터 p가 있습니다. 좌표계 A에 상대적인 p 좌표 pa = (x, y) 일 때, 좌표계 B에 상대적인 p의 좌표 pb = (x' , y') 를 구하고자 합니다. 이 때 그림5에서 관찰을 통해 다음을 유추할 수 있습니다 :

  • p = xu + yv (u는 x축 방향 단위벡터, v는 y축 방향 단위벡터를 의미합니다)

 

마찬가지로 좌표계 B에 대해서도 적용할 수 있습니다.

  • pb = xub + yvb

 

ub = (ux, uy), vb = (vx, vy)를 알면, 항상 pb = (x', y')를 알 수 있습니다. 이를 3차원으로 일반화하면, pa = (x, y, z)라고 할 때

  • pb = xub + yvb + zwb

 

이며, ub, vb, wb는 각각 좌표계 A의 x, y, z축 방향 단위벡터들을 좌표계 B에 상대적으로 표현한 벡터입니다.

 

 

그림6. 점 p에 대한 좌표계 A 및 B에서의 표현

 

점에 대한 좌표계 변환은 벡터와 약간 다릅니다. 점의 경우 위치가 중요하므로, 다른 방식을 사용해야 합니다. 그림6에서 점 p는 다음과 같은 공식으로 표현할 수 있습니다 :

  • p = xu + yv + Q (u는 x축 방향 단위벡터, v는 y축 방향 단위벡터, Q는 A 원점입니다)

 

벡터 때 적용한 것과 마찬가지로, 3차원 일반화를 수행하면 pa = (x, y, z)라고 할 때

  • pb = xub + yvb + zwb + Qb

 

이며, ub, vb, wb는 각각 좌표계 A의 x, y, z축 방향 단위벡터들을 좌표계 B에 상대적으로 표현한 벡터이며, Qb는 좌표계 A의 원점을 좌표계 B에 상대적으로 표현한 점입니다.

 

 

행렬 표현

위에서 본 벡터 및 점에 대한 좌표계 변환 공식은 다음과 같습니다 :

  • 벡터 : (x', y', z') = xub + yvb + zwb
  • 점 : (x', y', z') = xub + yvb + zwb + Qb

 

이것을 동차좌표를 사용하여 하나의 공식으로 처리할 수 있습니다.

  • (x', y', z', w) = xub + yvb + zwb + wQb

 

또한 앞서 본 선형결합의 성질로 인해 다음과 같이 행렬로 표현할 수 있습니다 :

 

이 4 x 4 행렬을 좌표 변경 행렬(change of coordinate matrix) 또는 좌표계 변경 행렬(change of frame matrix) 라고 부르고, 행렬이 수행하는 변환을 가리켜 좌표계 A의 좌표를 좌표계 B로 변환한다(convert) 또는 사상한다(map) 고 합니다.

 

 

결합법칙과 좌표 변경 행렬

세 좌표계 F, G, H가 있고 행렬 A를 F에서 G로의 좌표계 변경 행렬, B를 G에서 H로의 좌표계 변경 행렬이라고 가정합니다. 한 벡터의 좌표계 F에 상대적인 좌표 pf를 좌표계 H에 상대적인 좌표 ph로 변환하려면 단계별로 처리하는 방법이 있습니다 :

  • (pf * A) * B = ph (결합법칙에 의해 pf * (AB) = ph 도 가능합니다)
  • = (pg) * B = ph

 

위 식에서 행렬 C = AB 를 F에서 H로 가는 좌표계 변환 행렬로 간주할 수 있습니다. 이러한 합성(composition) 역시 연산에서의 성능에 영향을 줍니다(변환들의 합성 항목을 참조하세요). 또한 교환법칙이 성립하지 않음 역시 인지하셔야 합니다.

 

 

역행렬과 좌표 변경 행렬

좌표계 A에서의 벡터를 pa라 하고, 좌표계 B에서의 벡터를 pb, 좌표계 A에서 B로 변경하는 행렬을 M이라 하겠습니다. 앞에서 봤듯이 pb = pa * M 임을 알 수 있습니다. 그렇다면 역으로 좌표계 B에서 A로 가는 좌표계 변환 행렬 역시 존재할 수 있을까요? 만약 M이 가역행렬(역행렬이 존재하는 행렬)이라면, pb로부터 pa를 구할 수 있습니다.

  • pb = pa * M
  • pb * M^-1 = pa * M * M^-1
  • pb * M^-1 = pa * I
  • pb * M^-1 = pa

 

즉, M^-1은 좌표계 B에서 A로의 좌표 변환 행렬임을 알 수 있습니다. 이 변환은 여러 좌표계의 변환 및 역변환에서도 가능합니다. 가령, 좌표계 A에서 B, 그리고 B에서 C로 가는 행렬을 각각 A, B라고 할 때, C에서 A로 가는 좌표 변환 행렬은 (AB)^-1 = B^-1A^-1 입니다.

 

 

변환 행렬 vs 좌표 변경 행렬

앞서 본 능동 변환(비례, 회전, 이동)과 좌표 변경 행렬은 수학적으로 동치(equivalence) 관계입니다. 좌표계 변환의 상황에서 각 좌표계는 위치와 방향이 다릅니다. 따라서 한 좌표계에서 다른 좌표계로 변환하는 공식에는 좌표들의 회전과 이동을 위한 부분이 필요하게 됩니다. 결국, 같은 형태의 수식이 나오며 따라서 두 경우 모두 결국에는 같은 수치를 구하게 됩니다.

 

상황에 따라서 여러 좌표계를 다루면서 물체 자체는 변경하기 않고 좌표계만 바꿈으로써 물체의 좌표 표현을 바꾸는 것이 더 직관적인 경우가 있고, 하나의 좌표계로 고정하면서 그 안에서 물체 자체를 변환하는 것이 더 직관적인 상황이 있습니다.

 

 

 

 

레퍼런스


문헌 참조
DirectX 12를 이용한 3D 게임 프로그래밍 입문

 

 

그림 참조
그림1 - http://hopsblog-hop.blogspot.com/2017/02/matrices.html
그림2 - https://apprize.info/game/3d/3.html
그림3 - https://apprize.info/game/3d/3.html
그림4 - https://apprize.info/game/3d/3.html
그림5 - https://apprize.info/game/3d/3.html
그림6 - https://apprize.info/game/3d/3.html

 

'이론 > Math' 카테고리의 다른 글

행렬 대수  (0) 2019.10.18
벡터 대수  (0) 2019.10.17
댓글