는 내가 헷갈리고 까먹는 개념 정리함.
1. Column Space
column 이 basis, 즉 column이 좌표축인 공간에서 x의 좌표를 갖게됨.
x 각각에 독립적으로 값을 변화하는 경우 column 각각에 독립적으로 적용됨. ex) scale
2. 내적
u, v 모두 unit vector 일 때 서로 수직이면 0이고 같으면 1임.
빛 계산할 때 잘 씀.
3. Orthogonal basis & proj
column space 의 연장선인데, 행렬 U 가 주어지고 각 column 이 서로 수직일 때 위 수식에 따르면 한 축에대한 좌표를 얻을 수 있음.
그 축을 나타내는 벡터 u 를 거기에 곱하면 projection 이 되는거임.
응용해서 한쪽이 unit vector 면 내적은 그 벡터를 기준으로 한 다른 벡터의 값이기도 함.
예를들어 u가 (0, 0, 1) 이고 v가 (12, 32, 11) 이면 내적값인 11 이 v 를 u 로 projection 해서 얻은 좌표값임.
4. Row
이번엔 column 이 서로 수직이면서 unit vector 의 경우에 가능한 일임.
저기서 U를 뺀 Transpose(U) * y 를 주목해서 보자.
그러면 projection matrix 만들 때 쉽게 이해할 수 있게됨.
여기서 나의 요점은 열 위주 행렬일 때
Matrix의 Row 가 공간축이면 그 공간으로의 변환행렬이고,
Column 이 공간축이면 그 공간으로부터의 역변환행렬이란 것..
전자는 위에서 설명한 Proj 바로 적용하면 되고
후자는 벡터가 현공간축의 원래 공간축 환산값 각각에 곱해져서 환원됨을 생각.
( 현공간 X 축의 환산값 x * V.x + 현공간 Y 축의 x * V.y + 현공간 Z 축의 z * V.z
= 원래 x 축 좌표 )
서로 역행렬인게 핵심. ( 단 row 들이 모두 orthonormal 이며 정사각 행렬일 때의 전제)
는 쉽게 증명 가능.
5. HLSL Matrix Major
Column Major 은 Matrix * Vector(Column) 이고 Row Major 는 반대.
HLSL 는 행위주고, DirectX 내장 함수는 열위주, 위의 설명도 열위주임.
HLSL 의 float3x3 같은 생성자에 벡터 세개 넣으면 그걸 하나의 행으로봐서 쌓음.
float3x3(A,B,C) => _11, _12, _13 = A.x, A.y, Az
HLSL 에서 mul(vec, matrix) 도 연산가능하고, mul(matrix, vec) 도 계산 가능하나,
HLSL 은 보통 행위주로 생각하므로 꼭 mul(vec, matrix) 로 해주자.
댓글 없음:
댓글 쓰기