概述
什么是变换
在三位渲染中,矩阵是可视化的,这个可视化的结果就是变换。 具体一下,变换指的是我们把一些数据,如点,方向矢量甚至是颜色等, 通过某种方式进行转换的过程。
线性变换
线性变换指的是那些可以保留矢量加和标量乘的变换。用数学公式来表示这两个条件就是:f(x) + f(y) = f(x+y) , kf(x) = f(kx)
例:f(x)=2x可以表示一个大小为2的统一缩放,即经过变换后矢量x的模将被放大两倍。可以发现,f(x) = 2x 满足上方两个条件
对于线性变换来说,如果我们要对一个三维的矢量进行变换,那么仅用3 X 3的矩阵就可以表示所有的线性变换。但不能表示平移变换。
仿射变换
仿射变换就是合并线性变换和平移变换的变换类型,仿射变换可以用一个4 X 4的矩阵来表示,为此,我们需要把矢量扩展到四维空间下,这就是齐次坐标空间。
常见的变换种类和它们的特性
齐次坐标
由于3x3的矩阵不能表示平移操作,我们就把其扩展到了4x4的矩阵。为此,我们还需要把原来的三维矢量转换成四维矢量,也就是我们说的齐次坐标。
齐次坐标是一个四维矢量。对于一个点,从三维坐标转换成齐次坐标是把其w分量设为1,而对于方向矢量来说,需要把其w分量设置为0。(这样的设置会导致,当对一个4x4的矩阵进行变换时,平移,旋转,缩放都会施加于该点。但是如果是用于变换一个方向矢量,平移的效果就会被忽略。)
分解基础变换矩阵
我们已经知道可以用一个4x4的矩阵来表示平移旋转和缩放。我们把表示纯平移,纯旋转,纯缩放的变换矩阵叫做基础变换矩阵。这些矩阵有一些共同点,我们可以把一个基础变换矩阵分解成4个部分
其中,左上角的矩阵M3x3用于表示旋转和缩放,t3x1用于表示平移,O1x3是零矩阵,即O1x3=[0 0 0],右下角的元素就是标量1
平移矩阵
我们可以使用矩阵乘法来表示对一个点进行平移变换:
不难看出这个矩阵有了平移的效果,在3D中可视化的效果是,把点(x,y,z)在空间中平移了(tx,ty,tz)个单位
平移变换不会对方向矢量产生任何影响:(矢量没有位置属性,可以位于空间任意一点)
缩放矩阵
我们可以使用矩阵乘法来表示一个缩放变换:
对方向矢量可以使用同样的矩阵进行缩放:
如果缩放系数kx=ky=kz,我们把这样的缩放叫做统一缩放,否则称为非统一缩放。
外观上看,统一缩放是扩大整个模型,非统一缩放会拉伸或挤压模型。
统一缩放不会改变角度和比例信息,而非统一缩放会改变角度和比例信息。
例如:在对法线进行变换时,如果存在非统一缩放,直接使用用于变换顶点的变换矩阵的话,就会得到错误的结果
缩放矩阵一般不是正交矩阵。
上面的矩阵只适用于沿坐标轴方向进行缩放。如果我们希望在任意方向进行缩放,就需要使用复合变换。 (其中一种方法的主要思想是:先将缩放轴变换成标准坐标轴,然后进行沿坐标轴的缩放,再使用逆变换得到原来的缩放轴朝向)
旋转矩阵
旋转操作需要指定一个旋转轴,这个旋转轴不一定是空间中的坐标轴。
这里我们拿x,y,z轴举例:
比如我们需要把点绕着x轴旋转θ度,可以使用下面矩阵:
绕y轴旋转也是类似的:
最后,绕z轴的旋转:
旋转矩阵的逆矩阵是旋转相反角度得到的变换矩阵。旋转矩阵是正交矩阵,而且多个旋转矩阵之间的串联同样是正交的。
复合变换
我们可以把平移,旋转,缩放组合起来,来形成一个复杂的变换过程。
例如:可以对一个模型先进行(2,2,2)的缩放,再绕y轴旋转30°,最后向z轴平移4个单位。
复合变换可以通过矩阵的串联来实现,上面的变换过程可以使用下面公式计算:
pnew = MtranslationMrotationMscaleθpold
(上面使用的是列矩阵,因此上方公式的阅读顺序是从右到左,且大多数情况下,我们约定俗成的顺序就是先缩放,再旋转,再平移)
同时,我们也要注意旋转时的变换顺序。比如我们同时要绕三个轴进行旋转,那么我们是先绕x轴,再绕y轴,最后z轴旋转还是按照其他的旋转顺序呢?在Unity中,这个顺序是zxy,这在旋转相关的API文档中有说明。
例:当给定(θx,θy,θz)这样的旋转角度时,得到的组合旋转变换矩阵是:
Note:
最后
以上就是重要大雁为你收集整理的3D数学---矩阵的几何意义:变换的全部内容,希望文章能够帮你解决3D数学---矩阵的几何意义:变换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复