프로그래밍 공부
작성일
2023. 10. 12. 15:46
작성자
WDmil
728x90

행렬의 기초 이해

행렬 연산 자체는 매우 쉽게 이루어져있다.

 

말 그대로 1항과 2항의 곱을 행과 열로 수행한다 라고 이해하면 되는데.

가령. XY 행렬이 존재할때. 1번행렬이 파란색 2번행렬이 빨간색 이라고 하자.

그렇다면, 각각의 해당하는 가로줄과 세로줄을 곱해준뒤 더하면 된다.

 

잘 이해가 안간다면 밑의 이미지로 쉽게 이해하도록 설명해놓았으니 살펴보자.

위와같은 결과가 나올것이다.

노란색 이 결과물로 나타나는 결과값이다.

 

노란색의 위치에 나타나는 행렬은 위치좌표대로 연산하면 될것이다.


행렬연산의 유의점

이런 특성을 가진것이 행렬인데, 행렬곱을 실행할 수 없는 경우도 발생한다. 다음과 같은 예시를 살펴보자.

행렬연산을 진행할 때 1번 행렬의 행과 2번행렬의 열이 같지 않으면 행렬연산을 진행할 수 없다.

 

반대로 진행할때도 마찬가지로 열과 행이 일치하지 않으면 행렬곱을 할 수 없으니 유의해야한다.


또한 행렬곱을 살펴보면 알겠지만, 행렬연산의 1번과 2번이 같은값이 아닐경우. 1번값과 2번값이 바뀌면 완전히 다른 결과가 나타나거나. 행과 열의 일치가 이루어지지 않아 연산을 할수 없게된다.

순서만 바꾸었는데, 원래 이루어지지 않는 행렬곱이 정상적으로 되는걸 보면 알 수 있을것이다.


또한 행렬곱의 원본값을 도출해내는 행렬이 있다.

 

이것을 단위행렬(Identity matrix) 이라 부르고. 이 행렬은 대각선 으로 1이 들어가있는 단순한 행렬이다.

단위 행렬의 예시

단위행렬은 행과 열을 가리지않고. 같은 위치좌표에 1을 넣은뒤 나머지 모든 값에 0을 넣으면된다.


그렇다면, 원본값에 곱해서 단위행렬로 바꾸어주는 행렬도 있을까?

 

물론 있다. 이것을 우리는 역행렬(Inverse Matrix) 이라고 부른다.

 

물론 역행렬이 나타날 수 있는 행렬이 있고. 오히려 역행렬이 없는 행렬또한 존재한다.

 

그러나, DIrectX에서 다루는 행렬은 4X4행렬을 다룸으로. 역행렬을 구하려면 복잡한 연산식을  다루어야 하기 때문에 매부 비효율적이다.

DirectX에서는 역행렬을 다루지는 않는다. 구현해주는 함수가 따로 있음으로 구할 필요가 사실 없다.

 

그럼으로 역행렬 이라는것이 존재한다. 라는것만 알 고 있으면 충분할것이다.


DirectX의 행렬연산

 

DIrectX에서 행렬을 쓰는 이유는 대부분 3D좌표 내에 Vertex의 위치변환 과 회전각도에 영향을 주기 위해 사용하는데,

 

기본적인 위치좌표인 Float3( X, Y, Z) 를 이용하는데, 여기에 W를 더해서 (X, Y, Z, W)로 행렬연산을 진행한다.

 

W는 1을 대입하며. 있는 이유는 W가 존재해야만 XYZ값이 마지막 41 42 43 위치에 나타나기 때문이다.

 

그렇게 나타난 행렬연산값을 FLOAT4( X, Y, Z, W) 로 대입해서 연산하게 되면 마지막 줄에 XYZW값이 나타나서 사용할 수 있게된다.

 

각각 DirectX의 크기, 좌표, 회전 에 따른 행렬위치에 영향을 주는 부분이 다르다.

 

다음 이미지는 Matrix의 행렬을 4X4로 나타낸것이다.

 

DirectX Matrix

위의 표가 DirectX에서 사용하는 Matrix 표이다.

 

각각 Scale과 Transration의 사용위치를 표시하면 다음과 같다.


 

위와같은 행렬 위치에 영향을 끼치게 된다.

각 객체의 Vertex의 위치좌표는 Transration의 마지막 XYZ에 있는 값을 가져와서 사용하게 되는데.

 

만약, Transation을 변경한다면 저 위치의 X와 Y와 Z에 영향을 끼치면 된다.

 

Scale는 저 행렬위치의 XYZ에 값을 바꾸면 된다.


Rotation은 약간 다르게 생각해야하는데,

각각 X축과 Y축 Z축에 들어가는 Rotation의 영향을 끼치는 부위가 겹치기 때문이다.

X축 기준으로 회전할때 들어가는 값
y축 기준으로 회전할때 들어가는값
Z축 기준으로 회전할때 들어가는 값

위와같이 값이 기입되기 때문에.

행렬을 계산할 때 XYZ순으로 Size연산이 돌아간 뒤에 Roation을 곱해서 처리해준다.


 

728x90