게임수학
게임수학 - Matrix (행렬)
KimGeon-U
2025. 1. 13. 15:27
Matrix
Vector로 이루어진 직사각형 배열로, 행,m(row), 열,n(column)의 수를 나타냅니다.
3D그래픽스 환경에서 4x4행렬을 사용하여 객체의 Transform관련 변환을 하는데 사용합니다.
2D그래픽스 환경에서는 3x3행렬을 사용하여 객체의 Transform 관련 변환을 하는데 사용합니다.
이번 포스팅에서는 행렬 연산에 대해 알아보겠습니다.
1. 행렬 곱셈
- 두 개의 행렬을 결합하여 새로운 행렬을 생성하는 연산
- 행렬 곱셈 규칙 : A * B
- B*A와 값이 다르다. (교환 법칙이 성립이 안된다.)
- (앞 행렬의 행의 수) * (뒤 행렬의 열의 수)
2. 대각행렬 (Diagonal Matrix)
- 대각선 이외의 값들을 0으로 설정한다.
- 크기 조절(Scaling)을 할 시 사용한다.
FMatrix ScaleMatrix = FMatrix(
FPlane(2.0f, 0.0f, 0.0f, 0.0f), // X축 Scale
FPlane(0.0f, 2.0f, 0.0f, 0.0f), // Y축
FPlane(0.0f, 0.0f, 2.0f, 0.0f), // Z축
FPlane(0.0f, 0.0f, 0.0f, 1.0f) // Scale 설정, Default = 1.f
);
FVector BeforeVector(1.0f, 1.0f, 1.0f);
FVector ScaledVector = ScaleMatrix.TransformPosition(BeforeVector);
// 대각 행렬 Matrix 연산 전
UE_LOG(LogTemp, Log, TEXT("Before Vector : %s"), *BeforeVector.ToString());
// 대각 행렬 Matrix 연산 후
UE_LOG(LogTemp, Log, TEXT("Scaled Vector : %s"), *ScaledVector.ToString());
3. 단위행렬 (Identity Matrix)
- 변환을 수행하지 않는 기본행렬
- 초기화 시에 사용한다.
FMatrix IdentityMatrix = FMatrix::Identity;
UE_LOG(LogTemp, Log, TEXT("Identity Matrix : %s"), *IdentityMatrix.ToString());
4. 역행렬 (Inverse Matrix)
- 변환했던 행렬을 반대로 취소하는 데 사용한다.
- Ex) 특정 위치에서 이동 후 다시 원래 위치로 돌아갈 때
FMatrix TranslationMatrix = FMatrix::Identity;
TranslationMatrix = FTranslationMatrix(FVector(10.0f, 0.0f, 0.0f));
FVector InverseBeforeVector(1.0f, 2.0f, 3.0f); // 1.0f, 2.0f, 3.0f
FVector TranslationVector = TranslationMatrix.TransformPosition(InverseBeforeVector); // 11.0f, 2.0f, 3.0f
// 역행렬
FMatrix InverseMatrix = TranslationMatrix.Inverse(); // TranslationMatrix의 역행렬
FVector InverseTranslationVector = InverseMatrix.TransformPosition(TranslationVector); // 1.0f, 2.0f, 3.0f
UE_LOG(LogTemp, Log, TEXT("InverseBefore Vector : %s"), *InverseBeforeVector.ToString());
UE_LOG(LogTemp, Log, TEXT("Translation Vector : %s"), *TranslationVector.ToString());
UE_LOG(LogTemp, Log, TEXT("InverseTranslation Vector : %s"), *InverseTranslationVector.ToString());
5. 전치행렬 (Transpose Matrix), 직교행렬(Orthogonal Matrix)
- 행과 열을 대각선 축을 기준으로 서로 위치를 바꾼 행렬
- mxn의 전치행렬 : nxm
- 직교행렬 x 전치행렬 = 단위행렬 (전치행렬의 역행렬)
// 전치행렬
FMatrix NormalMatrix = FMatrix(
FPlane(1.0f, 0.0f, 0.0f, 0.0f),
FPlane(0.0f, 2.0f, 0.0f, 0.0f),
FPlane(0.0f, 0.0f, 3.0f, 0.0f),
FPlane(0.0f, 0.0f, 0.0f, 4.0f)
);
FMatrix TransposedMatrix = NormalMatrix.GetTransposed();
FVector NormalVector(1.0f, 2.0f, 3.0f);
FVector TransposedVector = TransposedMatrix.TransformPosition(NormalVector);
UE_LOG(LogTemp, Log, TEXT("Normal Vector: %s"), *NormalVector.ToString());
UE_LOG(LogTemp, Log, TEXT("Transposed Vector: %s"), *TransposedVector.ToString());
6 변환 행렬 (Transformation Matrix)
- 위치, 회전, 크기 조정을 한번에 처리하는 복합 변환을 구현할 때 사용한다.
- Scaling, Rotation, Translation, Relection Matrix
- 각각 x,y,z축을 세타 만큼 회전한다.
FMatrix TranslationMatrix = FTranslationMatrix(FVector(10.0f, 0.0f, 0.0f)); // X축으로 10만큼 이동
FRotator Rotation(0.0f, 90.0f, 0.0f); // Y축으로 90도 회전
FMatrix RotationMatrix = FRotationMatrix(Rotation);
FMatrix ScaleMatrix = FMatrix(
FPlane(2.0f, 0.0f, 0.0f, 0.0f),
FPlane(0.0f, 2.0f, 0.0f, 0.0f),
FPlane(0.0f, 0.0f, 2.0f, 0.0f),
FPlane(0.0f, 0.0f, 0.0f, 1.0f)
);
FMatrix TransformMatrix = TranslationMatrix * RotationMatrix * ScaleMatrix; // 변환 행렬 결합
FVector TransBeforeVector(1.0f, 1.0f, 1.0f);
FVector TransformedVector = TransformMatrix.TransformPosition(TransBeforeVector);
UE_LOG(LogTemp, Log, TEXT("Transform Before Vector: %s"), *TransBeforeVector.ToString());
UE_LOG(LogTemp, Log, TEXT("Transformed Vector: %s"), *TransformedVector.ToString());