在Unity开发中时常会用到Matrix4x4矩阵来变换场景中对象的位置、旋转和缩放。但是很多人都不太理解这儿Matrix4x4变换矩阵。通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么变换的。
在三维图形程序中,我们可以用几何变换来达到以下目的:
- 表示一个对象相对于另一个对象的位置。
- 旋转和安排对象的大小。
- 改变视维、方向和透视方法。
你可以使用一个4×4的矩阵将任何点变换到另一个点。下面的例子中,我们用一个矩阵对点(x, y, z)进行变化,产生了一个新的点(x‘, y‘, z‘):
对点(x, y, z)进行一下运算,会得到一个新点(x‘, y‘, z‘):
最常用的变换包括:平移(translation),旋转(rotation)和缩放(scaling)。你可以将这些变换合并起来,组成一个矩阵,同时进行几种变换。
矩阵以行列号的形式来描述。
沿每个坐标轴同时进行缩放时(我们称为统一缩放uniform scaling),矩阵如下所示:
下面的变化将一个点(x, y, z)平移到另一个点(x‘, y‘, z‘):
下面的变换将一个点(x, y, z)沿x-轴进行旋转,得到了一个新的点(x‘, y‘, z‘):
下面的变化沿y-轴进行旋转:
下面的变换沿z-轴进行旋转:
这里要注意一点,希腊字母θ代表旋转的角度,用弧度来表示。从旋转轴向原点看,这个角度按顺时针方向来度量。
我们使用矩阵的一个最大好处就是可以通过矩阵相乘来将几个矩阵变换的效果合并起来。这就是说,当我们对一个模型进行旋转和平移时,不再需要用到两个矩阵。我们可以通过将旋转矩阵与平移矩阵相乘来得到一个合并的矩阵。这一过程就被称为矩阵级联,可以用下面的公式来表示:
共识中,C指组合之后产生的新矩阵,M1到Mn表示要组合在一起的每一个矩阵。一般情况下,我们指将两或三个矩阵组合起来,但实际上是没有限制的。 Matrix4x4类中有一个Matrix4x4.operator * 辅助函数来进行矩阵级联运算。 在进行矩阵级联时,我们应该注意级联时的顺序。上面公式 中反映的是一种从右到左的矩阵级联规则。也就是说,我们用来创建一个合并的矩阵的每个矩阵的实际效果是从右到左依次出现的。下面我们举一个例子来说明这一 情况。在这个例子中,我们要通过世界变换矩阵来创建一个“飞碟”。我们想要这个UFO沿中心(模型空间的y-轴)来旋转,同时要在场景中平移。为了达到这样的效果,你可以首先创建一个平移矩阵,然后用它和旋转矩阵相乘,如下所示:W=Tw·Ry 公式中,Tw表示平移矩阵,Ry表示旋转矩阵。 两个矩阵相乘的顺序是很重要的,与标量的相乘不同,矩阵相乘的顺序是不能交换的。如果我们将两个矩阵的顺序交换的话,得到的结果就会是,先对飞碟进行平移,然后将它绕世界原点进行旋转。 无论我们创建什么类型的矩阵,都要按照从右到左的顺序,这样才能达到我们预期的结果。