3.1 선형변환
행렬 표현
위의 함수는 3차원 벡터 하나를 입력받아서 3차원 벡터 하나를 출력한다.
만일 함수가 위와 같은 성질들을 만족한다면, 그리고 오직 그럴 때에만, 선형 변환(linear transformation)이라고 부른다. 여기서 u와 v는 임의의 3차원 벡터이며 k는 스칼라이다.
u = (x, y, z)라고 할 때, 이를 항상 다음과 같이 표현할 수 있음을 주목하자.
벡터 i, j, k는 현재 좌표계의 축들과 같은 방향인 단위벡터들이다. 이들을 표준기저 벡터(standard basic vector)라고 부른다. 하나의 선형변환은 그 선형성에 의해 다음이 성립한다.
이를 벡터와 행렬의 곱으로 표현할 수 있다.
이러한 행렬 A를 선형변환의 행렬 표현이라고 부른다. A를 곱하면 선형 변환의 결과가 나온다.
비례
비례 변환은 물체의 크기를 바꾸는 효과를 낸다. 비례변환은 다음과 같이 정의된다.
S는 선형변환이므로 행렬 표현이 존재한다. 그 행렬 표현을 구하려면 그냥 식 3.3에서처럼 S를 표준기저벡터들 각각에 적용하고, 결과로 나오는 벡터들을 행들로 하는 행렬을 만들면 된다. 비례된 기저벡터들은 다음과 같다.
따라서 S의 행렬 표현은 다음과 같고, 이를 비례행렬(scaling matrix)이라고 부른다.
회전
벡터 v를 축 n에 대해 회전하는 변환을 살펴본다. 이러한 변환에서는 회전각은 n을 내려다보는 방향(즉, n의 반대 방향)을 기준으로 시계방향으로 측정한다.
우선 v를 두 부분으로 분해한다. 하나는 n에 평행한 부분이고 또 하나는 n에 수직인 부분이다.
n에 평행한 부분인 projn(v)는 회전에 대해 불변이므로 수직인 부분을 회전하는 방법만 알아내면 된다. 회전된 백터 Rn(v)는 projn(v) + Rn(v⊥)이므로, Rn(v⊥)만 구하면 된다.
삼각함수에 의해, 이들에 대해 다음이 성립한다.
이로부터 다음과 같은 회전 공식을 끌어낼 수 있다.
최종 결과인 회전행렬(rotation matrix)는 다음과 같다.
여기서 c는 cos이고 s는 sin이다.
회전 행렬의 각 행벡터는 단위 길이이고, 행벡터들은 서로 직교이다. 따라서 행벡터들은 정규직교이다. 직교행렬에는 그 역행렬이 자신의 전치행렬과 같다는 편리한 속성이 있다. 즉 회전행렬의 역은 다음과 같다.
회전축이 x축이나 y축, z축이면 (즉 n = (1, 0, 0)이나 n = (0, 1, 0), n = (0, 0, 1)이면) 회전행렬이 아주 간단해진다.
3.2 아핀변환
동차좌표
아핀변환(affine transformation)은 선형변환에 이동변환(translation transformation)을 결합한 것이다. 그런데 벡터는 위치와 무관하므로 벡터에 대해서는 이동이 의미가 없다. 다른 말로 하면, 벡터는 이동에 대해 불변이어야 하고, 이동은 오직 점(즉, 위치벡터)에만 적용해야 한다. 동차 좌표(homogeneous coordinate)라는 것을 이용하면 점과 벡터를 동일한 방식으로 다룰 수 있다. 동차좌표는 3차원 벡터에 w 성분을 추가한 네값쌍의 형태인데, 주어진 동차좌표가 점을 나타내느냐 벡터를 나타내느냐는 이 w의 값이 결정한다.
- 벡터를 나타내는 동차좌표는 (x, y, z, 0)
- 점을 나타내는 동차좌표는 (x, y, z, 1)
w를 달리두어야 이동변환 시 생기는 문제를 방지할 수 있다.
아핀변환의 정의와 행렬 표현
아핀변환은 선형변환에 이동 벡터 b를 더한 것이다. 이를 수식으로 표현하면 다음과 같다.
이를 행렬로 다시 표기하면 다음과 같다.
w = 1인 동차좌표를 도입하면 아핀변환을 다음과 같이 좀 더 간결하게 표기할 수 있다.
b는 본질적으로 하나의 이동이다. 아핀변환의 선형변환 부분은 여전히 벡터에 적용되어야 한다. 벡터의 동차좌표의 w를 0으로 설정하면 b에 의한 이동은 적용되지 않는다.
이동
이동변환은 선형변환 부분이 하나의 단위행렬인 아핀변환이다.
수식에서 보듯이, 이 변환은 그냥 점 u를 b만큼 이동한다. 물체의 모든 점의 위치를 동일한 벡터 b로 변경하면 물체 전체가 그만큼 이동하는 것이다.
식 3.6에 의해 이동행렬을 다음과 같이 표현할 수 있다.
비례와 회전을 위한 아핀변환 행렬들
b = 0이라면 아핀변환은 그냥 보통의 선형변환과 같다. 따라서 어떤 선형변환이라도 b = 0인 아핀변환으로 표현할 수 있다. 이는 임의의 선형변환을 다음과 같이 아핀변환 행렬로 표기할 수 있다는 뜻이다.
아핀변환 행렬의 기하학적 해석
강체 변환은 변환 시 물체의 형태가 그대로 유지되는 변환이다. 강체 변환은 다음과 같은 아핀변환으로 서술할 수 있다.
이를 동차좌표와 행렬로 표기한다면 다음과 같다.
t는 표준기저 벡터 i, j, k만 회전해서 새 방향 t(i), t(j), t(k)가 되게 한다. 벡터 b는 단지 원점으로부터의 변위를 나타내는 위치벡터일 뿐이다. 그림 3.7을 보면 변환된 점을 구하는 공식 a(x, y, z) = xt(i) + yt(j) + zt(k) + b가 기하학적으로도 옳다는 점을 이해할 수 있다.
비례나 기울이기 변환에도 같은 원리가 적용된다. 그림 3.8처럼 하나의 정사각형을 평행사변형으로 왜곡시키는 선형변환 t를 생각해보자. 왜곡된 점은 그냥 왜곡된 기저벡터들의 선형결합이다.
3. 3 변환들의 합성
S가 비례행렬이고 R이 회전행렬, T가 이동행렬이라고 하자. 입방체에 이 세 변환을 연달아 적용하려 한다. 이를 수행하는 자명한 방법은 각 정점에 행렬들을 차례대로 하나씩 적용하는 것이다. 그런데 행렬 곱셈은 결합법칙을 만족하므로, 이를 행렬 하나로 합성하여 처리해도 된다.
이러한 합성은 성능에 영향을 미친다. 행렬 대 행렬 곱셈이 두 번 더 필요하지만, 대신 벡터 대 행렬 곱셈 횟수가 크게 줄어드니 전체적으로는 커다란 이득임이 명백하다.
그러나 교환법칙은 성립하지 않는다. 회전 후 이동과 이동 후 회전은 다른 변환이다.
3. 4 좌표 변경 변환
한 좌표계의 좌표를 다른 좌표계의 좌표로 변환하는 것을 좌표 변경 변환(change of coordinate transformation)이라고 부른다. 어떤 기하구조에 좌표 변경 변환을 적용했을 때 그 기하구조 자체가 변했다고 간주하는 것은 아니다. 바뀐 것은 좌표들의 기준인 좌표계이며, 그에 따라 기하구조의 좌표 '표현'이 변하게 된다. 위치는 벡터가 아니라 점의 속성이기 때문에, 점에 대한 좌표계 변환과 벡터에 대한 좌표계 변환은 서로 다르다.
어떤 기준계에 상대적인 벡터를 나타내는 좌표가 주어졌을 때, 그것을 다른 어떤 기준계에 상대적인 좌표로 변환하려면 어떻게 해야 할까?
위의 그림을 보면 다음이 자명하다.
u와 v는 각각 좌표계 A의 x축과 y축 방향의 단위벡터이다. 이 식에 있는 벡터들을 좌표계 B에서도 마찬가지 방식으로 표현할 수 있다.
따라서, pA = (x, y)가 주어졌을 때 만일 좌표계 B에 상대적인 벡터 u와 v의 좌표들을 안다면, 다시 말해 uB = (ux, uy)와 vBv = (vx, vy)를 알면, 항상 pB를 구할 수 있다. 이를 3차원으로 일반화하면, pA = (x, y, z)라고 할 때 다음과 같다.
점에 대한 좌표 변경 변환은 벡터에 대한 것과 약간 다르다. 점의 경우 위치가 중요하므로, 그림 3.11처럼 벡터를 이동시키는 방식으로 점을 이동할 수는 없다.
위의 그림에서 점 p를 다음과 같은 공식으로 표현할 수 있다.
여기서 u와 v는 좌표계 A의 x축과 y축 방향의 단위벡터이고, Q는 A의 원점이다. 이 수식의 점과 벡터들을 좌표계 B에서 표현하면 다음과 같다.
따라서, pA = (x, y)가 주어졌을 때 만일 좌표계 B에 상대적인 벡터 u와 v, 원점 Q의 좌표들을 안다면 항상 pB를 구할 수 있다. 이를 3차원으로 일반화 하면 다음과 같다.
벡터와 점에 대한 좌표 변경 변환 공식을 정리하면 다음과 같다.
동차좌표를 사용하여 다음과 같은 하나의 공식으로 처리할 수 있다.
w = 0이면 벡터에 w = 1이면 점에 대한 좌표 변경 변환 공식이 된다. w 성분만 적절히 설정한다면 벡터와 점을 하나의 공식으로 처리할 수 있다는 것이다. 식 3.8을 다음과 같이 행렬들로 표현할 수 있다.
위의 식을 좌표 변경 행렬 또는 좌표계 변경 행렬이라고 부른다.
좌표계 변경 행렬 역시 결합법칙을 만족하므로 여러 개의 좌표계 변경 행렬을 하나의 행렬로 합칠 수 있다. 이러면 벡터 대 행렬 곱셈 횟수가 크게 줄어들어 커다란 이득이다.
M이 좌표계 A에서 B로의 좌표 변경 행렬이라고 하면, M의 역행렬은 좌표계 B에서 A로의 좌표 변경 행렬이다.
3. 5 변환 행렬 대 좌표 변경 행렬
능동적 변환(비례, 회전, 이동)과 좌표 변경은 수학적으로 동치 관계이다. 능동 변환을 좌표 변경 변환으로 해석하는 것이 가능하며, 그 역도 마찬가지 이다.
그림 3.15는 식 3.7(회전 및 이동 아핀변환 행렬)의 행벡터들과 식 3.9(좌표 졈경 행렬)의 행벡터들의 기하학적 유사성을 보여준다.
좌표 변경 변환의 경우 좌표계들은 그 위치와 방향이 다르다. 따라서 한 좌표계에서 다른 좌표계로의 수학적 변환 공식에는 좌표들의 회전과 이동을 위한 부분들이 필요하다. 그런 부분들을 구해 보면 결국에는 같은 형태의 수식이 나오며, 따라서 두 경우 모두 결국에는 같은 수치들을 구하게 된다. 둘은 단지 변환을 해석하는 방법이 다를 뿐이다.
여러 좌표계를 다루면서 물체 자체는 변경하지 않고 좌표계만 변환함으로써 물체의 좌표 표현이 바뀌게 하는 것이 더 직관적인 상황 (그림 3.15의 (b))가 있는가 하면, 하나의 좌표계로 고정하고 그 좌표계 안에서 물체 자체를 변환하는 것이 더 직관적인 상황 (그림 3.15의 (a))도 있다.
'그래픽스 > DirectX 12' 카테고리의 다른 글
[DirectX 12 3D게임 입문] Chapter 5.5: 렌더링 파이프라인 - 입력 조립기 단계 (1) | 2023.11.11 |
---|---|
[DirectX 12 3D게임 입문] Chapter 4.4: Direct3D의 초기화 - 시간 측정과 애니메이션 (0) | 2023.11.08 |
[DirectX 12 3D게임 입문] Chapter 4.3: Direct3D의 초기화 - Direct3D의 초기화 (0) | 2023.11.07 |
[DirectX 12 3D게임 입문] Chapter 4.2: Direct3D의 초기화 - CPU와 GPU의 상호작용 (1) | 2023.11.06 |
[DirectX 12 3D게임 입문] Chapter 4.1: Direct3D의 초기화 - 기본지식 (0) | 2023.11.06 |