2020년 7월 1일 수요일

선형대수 공간변환 정리 + HLSL Matrix Major

는 내가 헷갈리고 까먹는 개념 정리함.

1. Column Space

$Ax\ =\ b$Ax = b
$\begin{bmatrix}m_{11}&m_{12}&m_{13}\\m_{21}&m_{22}&m_{23}\\m_{31}&m_{32}&m_{33}\end{bmatrix}\left[\combi{\begin{matrix}x_1\\x_2\\x_3\end{matrix}}\right]=\ b$[
m11m12m13
m21m22m23
m31m32m33
]
[
x1
x2
x3
]
= b
$\left[\combi{\begin{matrix}m_{11}\\m_{21}\\m_{31}\end{matrix}}\right]x_1\ +\ \left[\combi{\begin{matrix}m_{12}\\m_{22}\\m_{32}\end{matrix}}\right]x_2\ +\ \left[\combi{\begin{matrix}m_{13}\\m_{23}\\m_{33}\end{matrix}}\right]x_3\ =\ b$[
m11
m21
m31
]
x1 + [
m12
m22
m32
]
x2 + [
m13
m23
m33
]
x3 = b

column 이 basis, 즉 column이 좌표축인 공간에서 x의 좌표를 갖게됨.

x 각각에 독립적으로 값을 변화하는 경우 column 각각에 독립적으로 적용됨. ex) scale

2. 내적

$u\cdot v\ =\ \left|\left|\combi{u}\right|\right|\ \cdot \ \left|\left|v\right|\right|\cdot \cos \theta $u·v = ||u|| · ||v||·cosθ

u, v 모두 unit vector 일 때 서로 수직이면 0이고 같으면 1임.

빛 계산할 때 잘 씀.

3. Orthogonal basis & proj

$\left\{u_1,\ u_2\ ...\ u_p\right\}\ is\ orthogonal\ basis${u1, u2 ... up} is orthogonal basis
$y\ =\ c_1u_1+\ c_2u_2\ ...+c_pu_p$y = c1u1+ c2u2 ...+cpup
$y\cdot u_j\ =\ c_j\cdot u_j\cdot u_j$y·uj = cj·uj·uj
$c_j=\frac{y\cdot u_j}{u_j\cdot u_j}$cj=y·ujuj·uj
$\operatorname{proj}_Ly\ =\ c_j\cdot u\ =\ \frac{y\cdot u_j}{u_j\cdot u_j}\cdot u$projLy = cj·u = y·ujuj·uj·u

column space 의 연장선인데, 행렬 U 가 주어지고 각 column 이 서로 수직일 때 위 수식에 따르면 한 축에대한 좌표를 얻을 수 있음.

그 축을 나타내는 벡터 u 를 거기에 곱하면 projection 이 되는거임.

응용해서 한쪽이 unit vector 면 내적은 그 벡터를 기준으로 한 다른 벡터의 값이기도 함.

예를들어 u가 (0, 0, 1) 이고 v가 (12, 32, 11) 이면 내적값인 11 이 v 를 u 로 projection 해서 얻은 좌표값임.

4. Row

$\left\{u_1,\ u_2\ ...\ u_p\right\}\ is\ orthonormal\ basis${u1, u2 ... up} is orthonormal basis
$y\ =\ c_1u_1+\ c_2u_2\ ...+c_pu_p$y = c1u1+ c2u2 ...+cpup
$y\cdot u_j\ =\ c_j\cdot u_j\cdot u_j\ =\ c_j$y·uj = cj·uj·uj = cj
$c_j=y\cdot u_j$cj=y·uj
$\operatorname{proj}_Wy\ =\left(y\cdot u_1\right)u_1+\left(y\cdot u_2\right)u_2...\ +\left(y\cdot u_p\right)u_p$projWy =(y·u1)u1+(y·u2)u2... +(y·up)up
$=\ U\left[y\cdot u_1\ \ \ y\cdot u_2\ \ \ ...\ \ \ y\cdot u_p\right]$= U[y·u1   y·u2   ...   y·up]
$=\ UU^Ty$= UUTy

이번엔 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 이며 정사각 행렬일 때의 전제)

$I=U^TU^{ }$I=UTU
$I^T=UU^T$IT=UUT

는 쉽게 증명 가능.



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) 로 해주자.





댓글 없음:

댓글 쓰기

List