Search
Duplicate

행렬의 활용(3D 그래픽스)

이번 장에서는 행렬이 기하학을 표현하는데 있어서 어떻게 사용되는지 알아 볼것입니다.
이전 장에서는 행렬과 기하학의 연관 관계에 대해서 학습했습니다. 이번장에는 알아두면 유용한 행렬 연산들을 배우겠습니다.
행렬식(Determinant)
역행렬식
직교투영 행렬
4x4 행렬과 동촤좌표계 그리고 3D 공간에서 보여주기위한 애파인 변환
원근투영 행렬

행렬식(Determinant)

행렬의 행렬식(Determinant)은 정사각 행렬(행과 열의 개수가 같은 행렬)에서 계산할 수 있는 스칼라 값으로, 선형 대수학에서 중요한 정보를 제공합니다. 행렬이 가역(역행렬을 가질 수 있는지)인지, 또는 선형 변환에서 면적이나 부피를 어떻게 변화시키는지를 판단하는 데 유용하게 사용됩니다. 또한 연립 방정식을 푸는 데도 사용됩니다.
정사각 행렬 A의 행렬식은 일반적으로 det(A) 또는 |A|로 나타냅니다.
2x2의 행렬식은 다음과같이 나타냅니다.
3x3 행렬식은 다음곽 같이 나타냅니다.

소행렬식(Minors), 여인자(Cofactor)

소행렬식은 특정 요소와 그 요소가 포함된 행과 열을 제외한 부분 행렬의 행렬식을 의미합니다.
아래 행렬에서 1행과 2열을 삭제한 행렬 M{12}를 만들었습니다.
그리고 나머지 2x2행렬에서 ad-bc연산(행렬식)을 진행하면 최종 결과인 2가 나옵니다.
여인자는 소행렬식에 부호를 추가한 형태입니다. 여기서 (1)i+j(−1)i+j는 행렬 요소의 위치에 따라 부호를 결정합니다. 위치가 짝수면 양수, 홀수면 음수가 됩니다.
다음 섹션에서는 소행렬식과 여인자를 활용하여 임의의 행렬 nxn 에서의 역행렬을 계산해보겠습니다.

임의의 행렬 n x n (Determinants of arbitary n x n matrices)

행렬의 행렬식을 구하는 방법 중 여인자를 이용한 정의는 재귀적으로 행렬식을 구하는 방식이다.
주어진 행이나 열을 기준으로 소행렬식과 여인자를 계산하여 전체 행렬식을 구하는 과정입니다.
1.
임의의 행 또는 열 선택 : 행렬에서 특정 행이나 열을 선택합니다. 아무 행이나 열을 선택해도 결과적으로 같은 행렬식이 나오지만, 계산 편의상 보통 첫 번째 행이나 열을 선택하는 경우가 많습니다.
2.
각 요소와 여인자 곱하기 : 선택한 행이나 열의 각 요소에 대해 해당 요소의 여인자(cofactor)를 구하고, 이 요소와 여인자를 곱합니다.
3.
곱한 값을 합산 : 선택한 행이나 열의 각 요소와 그 여인자를 곱한 값을 모두 더해줍니다. 이렇게 얻어진 합이 전체 행렬의 행렬식입니다.
공식으로 표현하면 다음과 같습니다.
3 x 3 행렬삭의 재귀적 정의 예시
4 x 4 행렬식의 재귀적 정의 예시
높은 차수의 행렬식(determinant)을 계산하는 복잡성과 이를 해결하기 위한 "피벗팅(pivoting)" 방법을 사용 할 수 있습니다.
1.
높은 차수의 행렬식을 계산하는 명시적인 공식은 빠르게 복잡해집니다.
2.
"피벗팅"이라는 연산을 통해 이 복잡성을 줄일 수 있습니다:
피벗팅은 행렬식의 값을 변경하지 않습니다.
특정 행이나 열을 0으로 만들고, 단 하나의 요소(피벗 요소)만 남깁니다.
이로 인해 하나의 여인자(cofactor)만 계산하면 됩니다.
이 방법은 높은 차수의 행렬식 계산을 단순화하고 효율적으로 만드는 데 도움이 됩니다.
행렬식(determinant)에 대한 몇 가지 중요한 성질을 정리해 보겠습니다.

1. 항등 행렬의 행렬식

항등 행렬(identity matrix)의 행렬식은 항상 1입니다.
즉, 항등 행렬은 행렬 곱셈에서 단위를 제공할 뿐만 아니라, 그 자체의 행렬식도 단위인 1입니다.

2. 행렬 곱의 행렬식

행렬 A와 B의 곱의 행렬식은 각각의 행렬식을 곱한 것과 같습니다.
이 성질은 두 개 이상의 행렬의 곱에서도 적용됩니다.

3. 전치 행렬의 행렬식

행렬의 전치(transpose)를 취해도 행렬식의 값은 변하지 않습니다.
따라서 원래 행렬과 전치 행렬의 행렬식은 항상 동일한 값을 가집니다.

4. 모든 요소가 0인 행이나 열이 있는 경우

어떤 행 또는 열의 모든 요소가 0이면, 그 행렬의 행렬식은 0입니다.
이 성질은 여인자 전개를 통해 쉽게 확인할 수 있으며, 특정 행 또는 열이 모두 0일 때, 행렬식 계산 결과가 0이 됩니다.

5. 행 또는 열의 교환

행렬에서 임의의 두 행 또는 두 열을 교환하면 행렬식의 부호가 바뀝니다.
이는 행렬이 가지는 대칭성을 표현하는 중요한 성질로, 이 성질은 열을 교환할 때도 동일하게 적용됩니다.
이러한 성질들은 행렬식 계산의 효율성을 높이고, 행렬 연산의 이해를 돕는 기본적인 규칙들입니다.
6.
어떤 행(또는 열)에 다른 행(또는 열)의 배수를 더해도 행렬식 값은 변하지 않습니다. 이는 행렬 연산에서 매우 유용한 성질로, 행렬식 계산을 단순화하는 데 사용됩니다.

기하학적 관점에서의 행렬식(GeometricInterpretationofDeterminant)

행렬식은 기하학적으로 매우 흥미로운 해석을 가집니다. 이는 변환된 공간의 크기와 방향을 나타내며, 2차원, 3차원에서 다른 의미로 해석되니다.

2D에서 행렬식 - 면적

2차원에서 행렬식은 변환 후 형성되는 **평행사변형(parallelogram)**의 면적에 해당합니다. 여기서, 평행사변형의 두 변은 변환된 **기저 벡터(basis vectors)**입니다. 이 면적은 행렬식의 부호에 따라 양수 또는 음수가 될 수 있는데:
양수는 변환이 원래 방향을 유지함을 의미합니다.
음수는 변환이 원래 방향을 뒤집었음을 의미하며, 이 경우 평행사변형은 “뒤집힌” 모양이 됩니다.
따라서 2차원 행렬의 행렬식은 변환된 기저 벡터가 형성하는 평행사변형의 **부호가 있는 면적(signed area)**입니다.

3D에서 행렬식 – 부피

3차원에서 행렬식은 변환 후 형성되는 **평행육면체(parallelepiped)**의 부피를 나타냅니다. 여기서 평행육면체의 세 변은 변환된 기저 벡터입니다. 이 부피는 다음과 같은 의미를 가집니다:
행렬식이 양수이면 변환 후 방향이 유지됩니다.
행렬식이 음수이면 방향이 뒤집히거나 반사(reflection)가 일어나, 원래 형태가 뒤집혀졌음을 의미합니다.

행렬식의 절댓값 – 크기 변화

행렬식의 절댓값은 변환이 객체의 크기에 미치는 영향을 나타냅니다.
절댓값이 1인 경우: 변환 후에도 면적이나 부피가 그대로 유지됩니다.
절댓값이 1보다 큰 경우: 객체가 늘어나면서 면적(2D)이나 부피(3D)이 증가합니다.
절댓값이 1보다 작은 경우: 객체가 축소되어 면적이나 부피가 줄어듭니다.

행렬식이 변환을 설명하는 방식

행렬식은 변환의 성격을 설명하는 데 중요한 정보를 제공합니다.
행렬식이 0인 경우: 특정 차원으로의 **투영(projection)**이 포함되어 있습니다. 예를 들어, 3D 공간에서 2D 평면으로의 투영은 행렬식이 0이 됩니다.
행렬식이 음수인 경우: 변환에 **반사(reflection)**가 포함되어 방향이 반대로 뒤집힙니다.
이러한 기하학적 해석을 통해, 행렬식을 사용하여 변환된 공간의 면적이나 부피 변화뿐 아니라, 변환의 방향성과 투영 여부 등을 파악할 수 있습니다.

역행렬(Inverse of a Matrix)

행렬의 **역행렬(inverse of a matrix)**은 주어진 **정사각 행렬(square matrix)**에 대해 정의되며, 원래 행렬과 곱했을 때 항등 행렬(identity matrix)을 만들어 주는 행렬입니다. 역행렬은 여러 면에서 중요한 역할을 하며, 특히 선형 변환과 관련된 기하학적 성질을 설명합니다.

역행렬의 정의

행렬 MMM에 대해 역행렬 M−1M^{-1}M−1이 존재하면, 다음과 같은 성질을 만족합니다:
여기서 III는 항등 행렬입니다. 역행렬은 왼쪽에서 곱하든 오른쪽에서 곱하든 항등 행렬이 되도록 하는 행렬입니다.

역행렬이 존재하지 않는 경우

모든 행렬에 역행렬이 존재하지는 않습니다. 다음과 같은 조건일 때 역행렬이 존재하지 않으며, 이러한 행렬을 비가역 행렬(singular matrix) 또는 가역 불가능 행렬이라고 합니다:
행 또는 열에 모든 요소가 0인 경우: 특정 행이나 열이 0으로만 구성된 행렬은 곱셈을 통해 항등 행렬을 만들 수 없으므로 역행렬이 없습니다.
*행렬식(determinant)**이 0인 경우: 행렬의 행렬식이 0이면 그 행렬은 비가역입니다.

역행렬의 성질

1.
선형 독립성: 가역 행렬의 행과 열은 선형적으로 독립적입니다. 즉, 행과 열 벡터가 서로 선형 결합을 통해 만들어질 수 없습니다.
2.
선형 종속성: 비가역 행렬은 선형적으로 종속적인 행이나 열이 포함되어 있으며, 특정 행(또는 열)이 다른 행(또는 열)들의 선형 결합으로 표현될 수 있습니다.
3.
벡터 방정식 vM=0 가역 행렬의 경우, 이 방정식은 오직 v=0일 때만 성립합니다. 이는 가역 행렬이 1대1 대응(one-to-one) 관계를 가지고 있음을 의미합니다.

행렬식으로 역행렬의 존재 여부 확인

행렬의 행렬식이 0이 아니면 그 행렬은 가역(invertible)입니다. 행렬식의 값은 역행렬의 존재 여부를 쉽게 확인할 수 있는 빠른 방법이지만, 모든 경우에 완벽한 방법은 아닙니다. 예를 들어, 특정 전단(shear) 변환 행렬의 경우, 행렬식이 1이라 해도 행렬의 기저 벡터가 매우 길고 얇은 평행육면체를 형성할 수 있어, 거의 비가역에 가까운 상태가 될 수 있습니다. 이러한 **조건 수(condition number)**를 계산하는 것은 역행렬의 상태를 보다 정밀하게 판단할 수 있지만, 이는 고급 주제이기 떄문에 여기서 다뤄볼 필요는 없습니다.

역행렬 계산 방법

역행렬을 계산하는 방법은 여러 가지가 있으며, 그 중 한 가지는 **고전적 수반행렬(classical adjoint)**을 사용하는 방식입니다. 이는 여인자 전개를 이용하여 행렬의 각 요소에 대한 행렬식을 계산하고, 전치 과정을 통해 최종 역행렬을 구하는 방법입니다.
2 X 2 행렬의 경우에는 간단하게 계산이 진행된다.

단계별 과정

1.
여인자 계산: 주어진 행렬 M의 각 요소에 대해 여인자(cofactor)를 계산합니다. 여인자는 각 요소에 대해 해당 행과 열을 제외한 소행렬식(minor)에 부호를 적용한 값입니다.
1.
여인자 행렬 구성: 각 여인자를 모아 행렬로 구성하면 **여인자 행렬(cofactor matrix)**이 됩니다.
2.
전치: 여인자 행렬을 전치하여 수반행렬(adjM)을 구합니다.
다음은 행렬의 역행렬에 대한 몇 가지 중요한 성질입니다:
역행렬의 역은 원래의 행렬:
이는 M이 비가역 행렬이 아닐 때 성립합니다.
항등 행렬은 그 자체가 역행렬:
이 성질은 180도 회전 행렬이나 반사 행렬(reflection matrix)와 같은 특정 행렬에서도 성립합니다.
전치 행렬의 역은 역행렬의 전치:
행렬 곱의 역은 역행렬의 곱을 역순으로 나열한 것과 같음:
두 개 이상의 행렬 M1,M2,…,MnM_1, M_2, \dots, M_nM1​,M2​,…,Mn​에 대해서도 동일하게 적용됩니다:
역행렬의 행렬식은 원래 행렬식의 역:
이러한 성질들은 선형 변환을 다루거나 연립 방정식을 푸는 데 있어 중요한 역할을 하며, 역행렬이 적용되는 다양한 문제를 효율적으로 해결할 수 있게 해줍니다.

직교 행렬(Orthogonal Matrix)

*직교 행렬(Orthogonal Matrix)**는 특별한 성질을 가지는 정사각 행렬입니다. 직교 행렬은 선형대수학에서 중요한 역할을 하며, 선형 변환의 특정 유형을 설명하는 데 자주 사용됩니다.
선형대수학에서 매우 중요한 개념으로, 특히 3D 그래픽에서 자주 등장합니다. 직교 행렬의 정의와 그 성질을 이해하면 회전 및 반사 변환에서 효율적인 계산이 가능합니다.
정사각 행렬 M이 직교 행렬 이 되기 위한 조건은 다음과 같습니다:

직교 행렬의 성질

1.
역행렬과 전치 행렬의 동일성: 직교 행렬 M에 대해 다음이 성립합니다. MT=M1M^T=M^{−1}
이는 직교 행렬의 전치가 역행렬과 같음을 의미합니다. 역행렬 계산이 필요할 때, 전치 행렬을 사용해도 동일한 결과를 얻을 수 있습니다. 이 특성 덕분에 역행렬 계산을 피할 수 있어 계산이 간편해집니다.
2.
회전 및 반사 행렬의 직교성: 회전 행렬(rotation matrix)과 반사 행렬(reflection matrix)은 모두 직교 행렬입니다. 이들은 공간의 크기를 유지하면서 방향을 변환하는 데 사용되므로, 크기 변화를 나타내는 행렬식이 +1 또는 -1로 일정하게 유지됩니다.

직교 행렬의 응용

직교 행렬은 3D 그래픽에서 주로 회전과 반사와 같은 변환에 사용됩니다. 직교 행렬이 주어진다면, 그 역행렬을 쉽게 구할 수 있으므로 연산을 최적화할 수 있습니다. 역행렬을 구하는 작업은 일반적으로 비용이 많이 들기 때문에, 직교 행렬을 사용하여 이러한 연산을 줄이는 것은 매우 유용한 방법입니다.
요약하면, 직교 행렬의 공식적인 정의는 행렬과 그 전치 행렬의 곱이 항등 행렬이 되는 것이며, 이로 인해 전치와 역이 동일하다는 중요한 성질을 가지게 됩니다.

직교행렬의 기하학적 의미

직교 행렬(Orthogonal Matrix)의 기하학적 해석은 행렬의 구성 방식과 각 벡터 간의 관계를 통해 파악할 수 있습니다. 직교 행렬은 회전 및 반사 변환에서 매우 중요한 역할을 하며, 전치 행렬이 곧 역행렬이라는 특성 덕분에 역행렬을 쉽게 구할 수 있습니다.

직교 행렬의 기본 확인 방법

직교 행렬 MMM은 다음 식을 만족해야 합니다:
즉, 행렬과 전치 행렬을 곱했을 때 항등 행렬이 나오면 직교 행렬입니다. 이는 곧 직교 행렬의 전치가 역행렬과 같음을 나타내며, 특히 역행렬을 효율적으로 계산할 수 있는 구조로, **회전(rotation)**이나 반사(reflection) 등의 변환을 표현할 때 유용합니다.

3x3 직교 행렬의 벡터 조건

3x3 행렬 M에서 각 행 벡터 r1,r2,r3 는 다음 두 조건을 만족해야 합니다.
단위 벡터: 행렬의 각 행은 단위벡터여야 합니다.
상호 수직: 행렬의 행은 서로 수직어어야 합니다. 즉 각행의 내적이 0이 되야합니다.
이로 인해, 직교 행렬의 행은 **직교 정규 기저(orthonormal basis)**를 형성합니다. 이와 같은 조건은 열 벡터에도 동일하게 적용됩니다.

자유도와 3D 회전

3x3 직교 행렬은 9개의 원소를 가지지만, 직교 조건을 만족해야 하므로 6개의 제약 조건이 추가로 생기며, 결과적으로 3개의 자유도만 남습니다. 이 3개의 자유도는 3D 회전 변환의 자유도와 일치하여, 직교 행렬이 3D 회전을 나타내는 데 적합함을 보여줍니다.
하지만 직교 행렬에는 반사 변환이 포함될 수 있어 순수 회전 변환보다는 조금 더 많은 변화 가능성을 가집니다.

직교 행렬의 실제 응용

직교성을 알고 있는 경우 역행렬 대신 전치 행렬을 사용하여 효율성을 높일 수 있습니다. 그러나 직교성을 사전에 알지 못하는 경우 확인하는 데 시간이 걸리기 때문에 효율적이지 않을 수 있습니다. 또한, 실수 연산에서 정확한 직교성을 보장하기 어렵기 때문에 허용 오차를 설정하여 근사치를 사용하는 경우도 있습니다.

직교 행렬과 직교 투영의 관계

직교 행렬은 주로 회전반사와 같은 변환을 표현하는 데 사용되며, 직교 투영은 평행 투영으로 3D 객체를 2D 평면에 표현할 때 사용됩니다. 두 개념 모두 객체의 크기나 모양을 유지한다는 점에서 비슷한 특성을 가지고 있습니다. 그러나 직교 행렬이 변환을 위한 도구라면, 직교 투영은 3D 장면을 평면에 나타내는 투영 방식입니다.
즉, 직교 투영 변환을 구현할 때 직교 행렬을 사용할 수 있지만, 두 개념 자체는 서로 다른 목적을 가지고 있습니다. 직교 행렬은 선형 변환을 위한 기하학적 연산에 초점이 있고, 직교 투영은 객체의 원근감을 무시하고 일정한 크기로 평면에 표현하는 데 초점이 있습니다.

직교화(Orthogonalization)

*직교화(Orthogonalization)**는 벡터들을 서로 수직이 되도록 조정하는 방법입니다. 이 과정은 주로 Gram-Schmidt 직교화라는 알고리즘을 사용하여 수행되며, 특히 벡터들이 서로 직각을 이루지 않을 때 이를 바로잡기 위해 사용됩니다.

Gram-Schmidt 직교화 알고리즘

Gram-Schmidt 방법은 주어진 벡터들을 순서대로 선택하여 서로 수직이 되도록 조정합니다. 이를 위해 각 벡터에서 이미 조정된 벡터와 평행한 성분을 빼서 새로운 수직 벡터를 만듭니다.
예를 들어, 3x3 행렬의 경우 다음과 같은 절차로 직교화할 수 있습니다:
첫 번째 벡터 r1을 그대로 유지합니다.
두 번째 벡터 r2에서 첫 번째 벡터에 평행한 성분을 빼줍니다. 이를 통해 r2는 r1과 수직이 됩니다.
세 번째 벡터 r3에서는 첫 번째와 두 번째 벡터에 평행한 성분을 빼줍니다. 이렇게 하면 r3도 두 벡터와 수직이 됩니다.
이 과정을 통해 r1′,r2′,r3′ 는 서로 수직이 되며, **직교 기저(orthogonal basis)**가 만들어집니다.

단위 벡터로 만드는 정규화 과정

직교화 과정이 완료되면 각 벡터의 크기가 1이 아닐 수 있습니다. 이를 **단위 벡터(unit vector)**로 만들기 위해 각 벡터를 **정규화(normalization)**합니다.
또한 3차원 공간에서는 세 번째 벡터를 외적(cross product)으로 구할 수 있습니다:
이 방법은 3차원에서만 가능하며, 외적을 사용하면 세 번째 벡터가 자동으로 첫 번째와 두 번째 벡터와 수직이 됩니다.

반복적 직교화 알고리즘

Gram-Schmidt 직교화는 벡터의 순서에 따라 결과가 달라지는 단점이 있습니다. 이를 보완하기 위해 벡터를 한 번에 완벽히 직교화하지 않고 조금씩 직교화하는 방법도 있습니다. 여기서는 벡터 간 직교성을 조금씩 조정하여 수차례 반복하면 점점 더 직교화된 결과에 수렴하게 됩니다.
예를 들어, 조정하는 정도를 k로 설정하고, 여러 번 반복하여 직교성을 높일 수 있습니다. 일반적으로 k = 1/4 정도로 설정하고 10번 정도 반복하면, 꽤 정확하게 직교화된 벡터 집합에 수렴할 수 있습니다.

요약

1.
Gram-Schmidt 방법을 통해 주어진 벡터들이 서로 수직이 되도록 만듭니다.
2.
*정규화(normalization)**를 통해 벡터들의 크기를 1로 만듭니다.
3.
반복적인 조정을 통해 비순서적 직교화를 수행할 수 있습니다.

4x4 동차 행렬(Homogeneous Matrix)

**4x4 동차 행렬(Homogeneous Matrix)**는 주로 3D 그래픽과 컴퓨터 그래픽스에서 변환을 표현하기 위해 사용하는 4차원 벡터와 행렬을 의미합니다. 여기서 "동차(homogeneous)"라는 용어는 4차원 공간을 사용해 3D 공간에서의 변환을 간편하게 표현하는 기법을 나타냅니다. 동차 좌표는 3D 좌표를 변환할 때 매우 유용한 도구로, **이동(translation)**과 **확대(scaling)**와 같은 변환을 하나의 행렬 연산으로 간단하게 표현할 수 있습니다.
4x4 동차 행렬은 주로 3D 공간에서의 이동, 회전, 스케일링 등 다양한 변환을 통합하여 처리하는 데 사용됩니다. 4x4 행렬을 사용하면 변환을 한 번의 행렬 곱셈으로 적용할 수 있어 매우 효율적입니다.

4D 동차 좌표의 개념

3D 좌표를 4D로 확장하기 위해 (x,y,z) 좌표에 w라는 네 번째 요소를 추가하여 **동차 좌표(homogeneous coordinate)**를 만듭니다. 예를 들어, 3D 점 (x,y,z)는 4D 공간에서는 동차 좌표 (x,y,z,1)로 표현됩니다. 여기서 w를 1로 설정하면 3D 공간에서의 변환을 쉽게 4D 공간에서 표현할 수 있습니다.
이와 같은 동차 좌표는 다음과 같은 이유로 유용합니다:
이동 변환 표현 가능: 4x4 행렬을 사용하면 3D 좌표의 이동을 행렬 연산으로 표현할 수 있습니다.
원근 투영 가능: 동차 좌표의 w 값을 조정하여 원근 투영(perspective projection) 효과를 만들 수 있습니다.

이동 변환을 위한 4x4 행렬

3D 공간에서 이동 변환은 단순히 3x3 행렬로 표현하기 어렵지만, 4x4 행렬을 사용하면 간단히 표현할 수 있습니다. 예를 들어, (x,y,z) 좌표를 (Δx,Δy,Δz)만큼 이동하려면 아래와 같은 4x4 행렬을 사용합니다:
이 행렬을 사용하여 (x,y,z,1)을 곱하면 이동된 새로운 좌표를 얻을 수 있습니다.

회전 및 이동의 조합

4x4 행렬은 이동뿐 아니라 회전스케일링과 같은 여러 가지 변환을 한 번의 연산으로 처리할 수 있습니다. 예를 들어, 회전 행렬 R과 이동 행렬 T를 결합하여 물체를 먼저 회전하고 나서 이동하는 연산을 다음과 같이 표현할 수 있습니다:
이때 M 행렬의 상위 3x3 부분은 회전을 담당하고, 하위 오른쪽 열은 이동을 담당하게 됩니다.

w 값의 역할과 의미

w=1 : 3D 공간에서의 **점(point)**을 나타내며, 이동 변환의 영향을 받습니다.
w=0 : **벡터(vector)**를 나타내며, 이동 변환의 영향을 받지 않습니다. 즉, 표면의 법선 벡터와 같은 경우 이동하지 않게 유지됩니다.

4x4 행렬 사용의 장점

4x4 행렬은 변환을 다룰 때 여러 가지 규칙을 준수하면서도, 컴퓨터 그래픽에서 효율적인 방식으로 사용됩니다:
행렬 곱셈 가능: 4x4 행렬은 다른 4x4 행렬과 곱셈이 가능하여 복합 변환을 쉽게 계산할 수 있습니다. 이동 연산을 곱셉으로 처리할 수 있기 떄문에 곱셈 병렬연산에 최적화된 GPU의 효율을 높일 수 있습니다.
역행렬 가능: 4x4 행렬은 정사각 행렬이므로 역행렬을 계산할 수 있어, 변환의 역연산도 가능합니다.

아핀 변환이란?

*아핀 변환(affine transformation)**은 직선성과 평행성을 유지하는 변환으로, 회전, 스케일링, 반사, 이동 등의 변환을 포함합니다. 특히 4x4 행렬을 사용하면, 변환의 기준점을 원점이 아닌 특정한 위치로 설정할 수 있습니다.
예를 들어 다음과 같은 변환을 할 수 있습니다:
원점을 지나지 않는 축을 기준으로 회전
원점을 지나지 않는 평면을 기준으로 스케일링 또는 반사
원점을 지나지 않는 평면에 대한 투영 변환

아핀 변환의 과정

예를 들어 특정 점 p=(px,py,pz) 근처에서의 변환을 수행한다고 가정합시다. 변환 과정은 다음과 같습니다:
1.
*이동 행렬 T로 점 p를 원점으로 이동합니다.
2.
*선형 변환 행렬 R로 원하는 회전이나 스케일링을 수행합니다.
3.
*역이동 행렬 T1T^{−1}로 점 p를 원래 위치로 되돌립니다.
이 과정을 통해 최종 아핀 변환 행렬 A는 다음과 같이 계산됩니다:
A=TRT1A=T R T^{-1}

아핀 변환 행렬의 형태

이때 변환 행렬들을 각 부분으로 나누어 표현할 수 있습니다:
T는 점 p를 원점으로 이동시키는 이동 행렬입니다.
RRR은 선형 변환(회전, 스케일링 등)을 나타내는 3x3 행렬로, 4x4 형태에서 상위 3x3 부분에 위치합니다.
T1T^{-1}는 원래 위치로 되돌리는 이동 행렬입니다.

최종 행렬 A의 구조

최종적인 아핀 변환 행렬 A=TRT1A= TRT^{-1}는 아래와 같은 구조를 갖습니다:
상위 3x3 부분은 선형 변환을 나타내며, 변환의 기본 구조는 유지됩니다.
마지막 행은 추가적인 이동 성분을 포함하며, 변환이 특정 위치에서 수행됨을 나타냅니다.
이러한 아핀 변환을 통해, 3D 그래픽에서 객체를 특정한 위치에 대해 회전하거나 크기를 조정하는 등의 다양한 변환을 효과적으로 수행할 수 있습니다.

4x4 행렬을 통한 원근 투영(perspective projection)

*4x4 행렬을 통한 원근 투영(perspective projection)**은 3D 그래픽에서 객체가 멀어질수록 작아 보이는 효과를 수학적으로 구현하는 방법입니다. 원근 투영은 객체와 관찰자의 거리에 따라 크기가 달라지는 투영 방식으로, 현실적인 깊이감을 표현하는 데 필수적입니다.

원근 투영과 직교 투영의 차이

직교 투영(orthographic projection): 3D 객체를 2D 평면으로 투영할 때, 모든 투영선이 평행하게 그려집니다. 즉, 객체의 거리와 관계없이 크기가 일정하게 표현됩니다. 이는 **평행 투영(parallel projection)**이라고도 합니다.
원근 투영(perspective projection): 3D 객체를 2D 평면에 투영할 때, 모든 투영선이 특정 지점(투영의 중심점)에서 교차합니다. 이 중심점은 보통 관찰자의 위치를 나타내며, 거리에 따라 객체가 더 작아지게 보이는 원근 축소 효과를 만듭니다.

4x4 행렬을 사용한 원근 투영의 원리

3D 좌표를 2D 평면에 투영하려면 w 값을 사용하여 좌표를 조정하는 것이 핵심입니다. 4D 동차 좌표의 w 값으로 나누어 크기를 조절함으로써, 객체가 멀어질수록 작게 보이는 효과를 얻을 수 있습니다.
1.
투영 중심: 모든 투영선이 모이는 점을 투영 중심(center of projection)이라 합니다.
2.
w로 나누기: 각 점 (x,y,z,w)에서 x,y,z를 w로 나누어 크기를 줄입니다. w가 커질수록 화면에 보이는 크기는 줄어들어, 멀리 있는 객체가 작게 표현됩니다.

원근 축소 효과

원근 투영에서는 거리에 따라 객체의 크기가 줄어드는 효과가 생깁니다. 예를 들어, 하나의 물체가 투영 평면에 가까이 있을 때는 더 크게 보이지만, 멀리 있을 때는 작게 보입니다. 이는 3D 그래픽에서 매우 중요한 깊이감을 제공합니다.

핀홀카메라(pinhole Camera)

*핀홀 카메라(Pinhole Camera)**는 원근 투영(perspective projection)을 이해하는 좋은 예시입니다. 핀홀 카메라는 한 쪽에 작은 구멍이 있는 상자 형태로, 이 구멍을 통해 들어온 빛이 상자 반대편에 투영되어 이미지를 형성합니다. 3D 공간의 점2D 평면에 어떻게 투영되는지 이해하려면 핀홀 카메라의 원리를 살펴보는 것이 유익합니다.

핀홀 카메라와 이미지 반전

빛은 핀홀을 통해 들어가면서 한 점에서 수렴하며, 그 결과로 상자 안쪽에 투영된 이미지는 상하 반전되어 나타납니다. 이는 모든 광선(투영선)이 핀홀에서 교차하기 때문입니다. 이 핀홀을 투영의 중심(center of projection)이라 합니다.

투영 평면의 설정과 계산

3D 좌표 공간에서 투영 평면은 보통 다음과 같은 방식으로 설정됩니다:
투영의 중심: 원점을 핀홀 위치로 두고, 투영 평면은 z축에 평행하게 배치됩니다.
투영 평면의 거리 d: 투영의 중심에서 평면까지의 거리를 d로 두고, 이 평면을 z=−d 위치에 설정합니다.

원근 투영 계산

임의의 3D 점 p=(x,y,z)를 투영 평면으로 이동시켜 새로운 좌표 p′=(x′,y′,z′)을 계산할 수 있습니다. 유사 삼각형을 사용하여 다음과 같은 관계를 얻습니다:
1.
p’y 좌표 계산
2.
p’x 좌표의 계산
여기서 -마이너스 부호는 불필요한 복잡성을 만들수 있습니다. 그래서 2번째 그림과 같이 z = d 로 두고 투영 평면을 투영 중심 앞으로 이동시키면 음수를 제거 시킬수 있습니다.

부호 제거

수학적으로는 투영 평면을 z=−dz = -dz=−d로 두는 것이 맞지만, 실제 컴퓨터 그래픽 계산에서는 부호를 단순화하기 위해 투영 평면을 z=dz = dz=d로 옮깁니다. 이렇게 하면 다음과 같이 간단한 형태로 나타낼 수 있습니다:

원근 투영 행렬(Perspective Projection Matrix)

*원근 투영 행렬(Perspective Projection Matrix)**은 3D 공간을 2D 화면에 원근감 있게 표현하는 데 사용됩니다. 이 과정에서 4D 동차 좌표(homogeneous coordinates)를 사용해 투영 변환을 간편하게 표현하고, 다른 변환들과 결합하여 사용할 수 있습니다.

원근 투영의 수학적 표현

원근 투영에서는 z에 대한 나눗셈을 통해 객체의 크기를 조정합니다. 이는 거리 z가 멀어질수록 객체가 작아 보이는 원근감 효과를 만들어냅니다. 예를 들어, p=(x,y,z)라는 점을 투영 평면에 표현할 때, 결과는 다음과 같습니다:
이때 d는 투영 평면과의 거리입니다.

4x4 원근 투영 행렬 생성

이제, 이 투영을 4x4 행렬로 표현해 보겠습니다. 우선 공통 분모 z를 활용하여 x,y,z를 나누기 위해, 이 분모를 w에 설정합니다. 따라서 원본 4D 점 (x,y,z,1)를 다음과 같은 형태로 변환하는 행렬을 찾고자 합니다:
(x,y,z,1)→(x,y,z,dz​)
이 변환을 수행하는 4x4 행렬은 다음과 같습니다:
이 행렬을 사용하면, 3D 좌표를 2D로 변환하는 데 필요한 w 값이 설정됩니다. **w로 나누는 단계(동차 좌표 나눗셈)**를 통해 원근 투영을 완성할 수 있습니다.

원근 투영 행렬 사용의 장점

다른 변환과 결합 가능: 4x4 행렬을 사용하면 투영 변환을 회전, 이동 등 다른 변환과 결합하여 하나의 연산으로 처리할 수 있습니다.
비축(planar-aligned)이 아닌 평면에도 투영 가능: 축과 일치하지 않는 임의의 평면에 투영할 수 있어 더 복잡한 장면 구성도 가능합니다.
깊이 버퍼링(depth buffering): 실제 그래픽 시스템에서는 원근 투영을 위한 깊이 버퍼를 사용하는데, 이는 w=1을 클립 평면에 맞추어 깊이 값을 정규화하고 정확한 거리 기반 깊이 버퍼링을 제공합니다.
행렬의 활용 연습문제.pdf
2789.5KB