首页 > 技术文章 > 数学:3D和矩阵

linzloadonbook 2021-05-30 22:34 原文

跟紧工作需求学习,于是抽了点时间看了看用于2D3D转换的矩阵内容。

 

  矩阵在3D数学中,可以用来描述两个坐标系间 的关系,通过定义的运算能够把一个坐标系中的向量转换到另一个坐标系中。在线性代数中,矩阵就是以行和列形式组织的,向量是标量的数组,矩阵是向量的数组。

  一般来说,方阵能够描述任意线性变换。线性变换保留了直线和平行线,但是原点没有移动。线性变换保留直线的同时,其他的几何性质如长度、角度、面积和体积可能在变换中发生了改变。线性变换可能“拉伸”,但不会“弯折”、”卷折“坐标系。

  任意向量的一种扩写形式

 

  

  右边的单位向量就是x、y、z轴。向量的每个坐标都表明了平行于相应坐标轴的有向位移。一个坐标系能用任意3个线性无关的基向量定义,我们以笛卡尔坐标轴为例子,指定p q r为x y z轴正方向的单位向量,构建一个3 x 3矩阵M。

  

  

  此时如果用一个向量乘以该矩阵,就相当于一次坐标转换。(我们可以把”转换“和”乘法“等价)

  而在使用矩阵运算时,矩阵的乘积不能表示平移变换。因此引入了第四个分量w,w称为比例因子,一般为1。当w不为0时,表示一个坐标当w为0时,在数学上代表无穷远点,即并非一个具体的坐标位置,而是一个具有大小和方向的向量。从而,通过w我们就可以用同一系统表示两种不同的量。

  在OPENGL中,作为坐标点时,w参数为1,否则为0,如此一来,所有的几何变换和向量运算都可以用相同的矩阵乘积进行运算和变换,当一个向量和一个矩阵相乘时所得的结果也是向量。

  

  下图显示了应用到点 (2,1) 的多个线性转换。

                                 

 

  某些其他转换(如转换)不是线性的,并且不能表示为2×2矩阵的乘法。 假设要从点开始 (2,1) ,将其旋转90度,将其在 x 方向上转换为3个单位,并在 y 方向转换为4个单位。 可以通过使用矩阵乘法后跟矩阵加法实现此目的。

                                                      

  线性转换 (按 2 x 2 矩阵相乘) 后接 (添加1×2矩阵) 称为仿射转换。 将仿射转换存储在一对矩阵中的替代方法 (一个用于线性部分,另一个用于平移) ,用于在3×3矩阵中存储整个转换。 若要执行此操作,平面中的点必须存储在具有虚第三坐标的1×3矩阵中。 常见的方法是使所有第三个坐标等于1。 例如,点 (2,1) 由矩阵 [2 1 1] 表示。 下图显示了一个仿射转换 (旋转90度;在 x 方向上转换3个单位,在 y 方向上4个单位的) 表示为按单一3×3矩阵的乘法。

  点 (2,1) 映射到点 (2,6) 。 请注意,3 x 3 矩阵的第三列包含数字0,0,1。 这对于仿射转换的 3 x 3 矩阵总是如此。 重要数字是第1列和第2列中的六个数字。 矩阵的左上2×2部分表示转换的线性部分,第三行中的前两个条目表示平移。

                    

                    

 

  复合转换是一系列转换,一个后跟另一个。 对矩阵[2 1 1]表示的点(2,1)先后进行转换A B C。

    [2 1 1]ABC = [-2 5 1]

  不是将复合转换的三个部分存储在三个单独的矩阵中,而是可以将 A、B 和 C 相乘,以获取存储整个复合转换的单个3×3矩阵。

    [2 1 1]D = [-2 5 1]

  

  复合转换的顺序很重要。 通常,旋转,然后缩放,然后平移与缩放、旋转和平移不同。 同样,矩阵相乘的顺序也非常重要。

 

  参考链接:https://docs.microsoft.com/zh-cn/dotnet/desktop/winforms/advanced/matrix-representation-of-transformations?view=netframeworkdesktop-4.8

推荐阅读