3D数学基础[四] 矩阵与向量的计算意义和矩阵的基本构建规则

Unity的shader里面经常进行向量的变换
变换向量是通过将向量与矩阵相乘的形式来进行的
一般来说向量是指三维向量,三维向量可以写成行向量或者列向量的形式,将行向量或者列向量看成矩阵,按照矩阵的规则进行求解
三维行(列)向量与33矩阵之后结果还是三维行(列)向量,但是数值与原来不同了,所以说矩阵可以用来转换向量
行向量一般用左乘3
3矩阵的方式进行变换
列向量则一般用右乘3*3矩阵的方式进行变换
数值相同的行向量和列向量与同一个矩阵相乘的结果是完全不同的,不能用简单的转置或者逆的形式转换
DirectX里面将向量用行的方式表示
OpenGL则习惯用列的方式表示向量

如下图所示
在这里插入图片描述
上图表明了,一个矩阵的每一行(OpenGL是列)可以表示为坐标系变换后的某个轴的基向量,上图矩阵A的第一行是变换后的x轴的基向量,第二行是变换后的y轴的基向量, 第三行是变换后的z轴的基向量。这样一个矩阵就可以表示一个坐标系了,这个原理是在DX中构建矩阵的一个重要基础,在GL里面则是第一列是变换后的x轴的基向量,第二列是变换后的y轴的基向量, 第三列是变换后的z轴的基向量,下面举个例子
在这里插入图片描述
图中的四个向量都是长度为1的向量,
p可以表示成x轴的向量 q可以表示成y轴的向量
p旋转θ成p`,
q旋转θ成q`,则可以按照上述规则构建一个矩阵R =
[p`]
[q`]
p` = [1*cosθ 1* sinθ ]
q` = [-1*sinθ 1* cosθ ]

则R =
[cosθ sinθ ]
[-sinθ cosθ ]
这个矩阵可以表示成坐标系的逆时针二维旋转矩阵或者点的顺时针旋转矩阵(θ表示旋转角的绝对值)

同理,坐标系的顺时针旋转矩阵或点的逆时针旋转矩阵R`=
[cosθ -sinθ ]
[sinθ cosθ ]
(θ表示旋转角的绝对值)

在θ角取反的时候R=R`,这说明R可以表示成二维旋转矩阵,包括顺时针和逆时针,只是θ的符号不同而已
当大于0时R表示点顺时针旋转矩阵,当小于0时则R=R`,表示点逆时针旋转矩阵

任何一个点(x,y)表示成行向量后左乘R得到的结果的意义是该向量是该点绕原点旋转了θ角度后的向量
当一个点表示成行向量 在矩阵用于被该行向量左乘的时候,矩阵第一行是p`,第二行是q`
当这个点表示成列向量 在矩阵用于被该列向量右乘的时候,矩阵第一列是p`,第二列是q`
这样结果向量的xy值才一致


在实际应用中也存在已知结果向量和相乘向量求相乘矩阵的问题,这种情况一般使用矩阵运算法则逆推回去
注意运算过程中的坐标系问题,一般在同一个坐标系里面的计算才有意义

物体的位置和旋转是基于坐标系来说的,对一个物体A来说,变换A相当于以相同的量反向变换坐标系,两者的操作结果导致的A的位置或旋转都是一样的,但是反向变换坐标系会影响到其他物体,举个例子,如果将A进行顺时针旋转20°在进行缩小两倍,相当于将A的坐标系先放大两倍再逆时针旋转20°

现在回顾一下,在θ大于0的时候,下面这篇文章关于旋转坐标系后点的新位置的表示方式
3D数学基础[一]二维向量和二维坐标系

  • 坐标系顺时针旋转,原来的点A(x,y)在新坐标系中的坐标是 ( x * cosθ + y * sinθ, y * cosθ - x *sinθ) ,
    根据变换点等于等量反向变换坐标系的理论, 坐标系顺时针旋转等于点逆时针旋转相同的角度 则按照前面的计算矩阵,
    新点的坐标是A*R` = ( x * cosθ + y * sinθ, y * cosθ - x * sinθ)

  • 坐标系逆时针旋转,原来的点A(x,y)在新坐标系中的坐标是 (x * cos (-θ) + y * sin (-θ), y * cos (-θ) - x * sin (-θ))
    = (x * cos (θ) - y * sin (θ), y * cos (θ) + x * sin (θ))
    根据变换点等于等量反向变换坐标系的理论, 坐标系逆时针旋转等于点顺时针旋转相同的角度 则按照前面的计算矩阵,
    新点的坐标是A*R = (x * cos (θ) - y * sin (θ), y * cos (-θ) - x * sin (-θ))

    扫描二维码关注公众号,回复: 9077156 查看本文章

最后的推论也说明了变换点等于等量反向变换坐标系

发布了85 篇原创文章 · 获赞 13 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_43149049/article/details/104253003