这些基础知识非常重要,但是每次学习后都会很快忘记,所以在这里记录一下理解的过程,方便日后能快速进行复习
矩阵只是一套数学工具,本身没有特定含义,将原有问题套用矩阵的方式计算会使过程更方便更快捷,其实将矩阵的计算过程一项一项拆分出来,和正常处理原有问题的计算方式是相同的。
一、矩阵计算
1.矩阵乘法
进行矩阵乘法的两个矩阵一定要满足 A的行数 = b的列数
最后得到的是一个 A行数*B列数的一个方形矩阵
把矩阵的行阵想像成多维向量,全部分解为向量的计算
Cij = dot(ai,bj) i为行号 j为列号
A*B = a11 a12 a13 * b11 b12 =
a21 a22 a23 b21 b22
b31 b32
结果为2*2矩阵C =
dot( vector3(a11,a12,a13) , vector3(b11,b21,b31) ) dot( vector3(a11,a12,a13) , vector3(b12,b22,b32) )
dot( vector3(a21,a22,a23) , vector3(b11,b21,b31) ) dot( vector3(a21,a22,a23) , vector3(b12,b22,b32) )
2.逆矩阵
进行逆运算的矩阵必须是个方形矩阵
一个N*N的矩阵M 的逆矩阵表示为 M-1(-1在指数位)
3.矩阵的转置
转置 = 交换矩阵的行和列 m*n的矩阵转置后变成n*m
二、矩阵变换
同前面所序,空间变换矩阵只是借用了矩阵这一计算方式来方便的进行空间变换,并不神奇,一个简单的例子 x=5 y=5的坐标 各偏移50 就是x+50,y+50 而用矩阵方式变换
[5,5,1] * 1 0 0
0 1 0
50 50 1
= dot(vector3(5,5,1) , vector3(1,0,50)) , dot(vector3(5,5,1) , vector3(0,1,50))
= 5*1 + 5*0 + 1*50 , 5*0 + 5*5 + 1*50 (点乘 = x1*y1 + x2*y2+x3*y3)
= 5 + 50 , 5 + 50 (最终还是回归了正常计算偏移的公式)
再形象的说就是矩阵是一套很好用的工具让你传的几个参数,以上平移变换就是传了9个参数进去,就可以得出平移结果,而这9个参数即是矩阵 不同功能的矩阵要传不同的参数进去,矩阵本身没有特定含义
1.平移变换矩阵
T(p) =
1 0 0 0
0 1 0 0
0 0 1 0
X Y Z 1
2.旋转变换
X(θ) =
1 0 0 0
0 cosθ sinθ 0
0 -sinθ cosθ 0
0 0 0 1
Y(θ) =
cosθ 0 -sinθ 0
0 1 0 0
sinθ 0 cosθ 0
0 0 0 1
Z(θ)=
cosθ sinθ 0 0
-sinθ cosθ 0 0
0 0 1 0
0 0 0 1
其实Z轴变换矩阵,去掉最后一行和最后一列即是二维中的旋转变换
3.缩放变换
S(q) =
qx 0 0 0
0 qy 0 0
0 0 qz 0
0 0 0 1
注:切线空间其实就是把3d模型身上的纹理皮,扒下来平铺成平面的,他基于的坐标系 normal全是朝上的,如果这张皮在重新蒙在模型上的时候,就得进行切线空间到世界空间矩阵的变换
注:因为矩阵运算不符合乘法交换率 M1*M2 != M2*M1 矩阵之间相乘的顺序得到的变换效果是不同的,并且矩阵分为行矩阵和列矩阵, 他们对于矩阵在乘法的左右位置也是不相同的 dx 与opengl默认的行列矩阵也是不相同的 在写通用渲染器时要将他们设成相同的矩阵类型,例如统一使用行矩阵