您的位置:首页 > 其它

图形学基础复习之矩阵

2011-11-26 17:35 302 查看
这些基础知识非常重要,但是每次学习后都会很快忘记,所以在这里记录一下理解的过程,方便日后能快速进行复习

矩阵只是一套数学工具,本身没有特定含义,将原有问题套用矩阵的方式计算会使过程更方便更快捷,其实将矩阵的计算过程一项一项拆分出来,和正常处理原有问题的计算方式是相同的。

一、矩阵计算

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默认的行列矩阵也是不相同的 在写通用渲染器时要将他们设成相同的矩阵类型,例如统一使用行矩阵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: