1. 행렬의 정의
그래픽스에선 행렬은 주로 트랜스폼 (이동,회전,크기) 그리고 벡터 위치를 프레임간 옮기고자 할 때 쓰여진다.
m * n 행렬은 네모 모양의 m열 n행의 2차원 배열이다. 각 숫자를 원소라고 불린다.
각 행을 벡터로 취급할 때도 있다
2. 행렬간 곱셈
A 행렬의 행 개수와 B 행렬의 열 개수가 일치해야 연산이 가능하다.
3. 벡터와 행렬간 곱셈
4. 선형 결합
벡터 행렬 곱셈간 결과 uA는 선형 결합과 똑같다고 한다.
5. 결합 법칙
A(B + C) = AB + AC 그리고 (A + B)C = AC + BC
6. 전치 행렬
행렬의 행과 열을 교환해서 구한다.
전치 행렬의 속성은 다음과 같다.
7. 단위 행렬
좌>우측으로 대각선으로 가는 원소들 제외하고 모든 원소가 0인 행렬을 칭한다.
8. 행렬식
행렬식(determinant)은 행렬을 대표하는 값으로 n x n (n은 2 이상)의 정방행렬 AA에 대해 다음과 같이 정의됩니다. detA11이란 AA에서 1행과 1열을 제외한 행렬의 행렬식을 의미합니다. 2 x 2 행렬의 요소값이 a,b,c,da,b,c,d라고 할 때 행렬식은 ad−bcad−bc이다.
아래는 공식이다.
예시
9. 역행렬
그와 곱한 결과가 단위 행렬인 행렬을 갖는 행렬이다.
역행렬이 맞는지 확인
10. 코드
#include <iostream>
#include <d3d11.h>
#include <d3dx11.h>
#include <xnamath.h> // 연산 코드를 사용하기 위해선 필수
using namespace std;
void PrintMatrix(XMMATRIX& _mtx, string _name)
{
cout << _name << " 행렬 순회" << endl;
for (int y = 0; y < 4; y++)
{
for (int x = 0; x < 4; x++)
{
cout << _mtx(y, x) << " ";
}
cout << endl;
}
cout << endl;
}
void PrintVector(XMVECTOR& _vec, string _name)
{
cout << _name << " 벡터 순회" << endl;
for (int i = 0; i < 4; i++)
cout << _vec.m128_i32[i] << " ";
cout << "\n\n";
}
int main()
{
XMMATRIX mtxFrom = XMMatrixIdentity();
XMMATRIX mtxTo = XMMatrixIdentity();
XMVECTOR vector{ 0.2f,0.1f,0.3f,0.2f };
PrintMatrix(mtxFrom, "첫번째 단위");
// 첫번째 행렬 현재 위치 y : 2, x : 2
mtxFrom._31 = 2.f; mtxFrom._32 = 2.f;
// 두번째 행렬 현재 위치 y : 5, x : 5
mtxTo._31 = 5.f; mtxTo._32 = 5.f;
auto mtxMulti = XMMatrixMultiply(mtxFrom, mtxTo);
PrintMatrix(mtxMulti, "곱셈");
vector = XMVector3Transform(vector, mtxMulti);
PrintVector(vector, "곱셈");
XMVECTOR currentPos{ 0.5f, 1.f, 1.f };
XMMATRIX mtxRot;
XMMATRIX mtxTrans = XMMatrixTranslation(XMVectorGetX(currentPos), XMVectorGetY(currentPos), XMVectorGetZ(currentPos));
PrintMatrix(mtxTrans, "이동");
mtxRot = XMMatrixRotationAxis(currentPos, 10.f);
PrintMatrix(mtxRot, "회전");
auto mtxInversed = XMMatrixInverse(&vector, mtxMulti);
PrintMatrix(mtxInversed, "역");
auto mtxTransposed = XMMatrixTranspose(mtxMulti);
PrintMatrix(mtxTransposed, "전치");
auto mtxDet = XMMatrixDeterminant(mtxMulti);
PrintVector(mtxDet, "행렬식");
cout << endl;
}
'그래픽스 > DirectX' 카테고리의 다른 글
[DX11 물방울책] 챕터 5 - 렌더링 파이프라인 (0) | 2022.07.03 |
---|---|
DirectX 11 프레임워크 환경 설정하는 방법 (0) | 2022.06.30 |
[DX11 물방울책] 챕터 4 - Direct3D 초기화 (0) | 2022.06.30 |
[DX11 물방울책] 챕터3 - 트랜스폼 (위치값,회전값,크기값) (0) | 2022.06.23 |
[DX11 물방울책] 챕터 1 - 벡터 (0) | 2022.06.22 |