变换(Transformations)
你应该已经知道变换(transformation),它将任意3D点的坐标变换到另一个3D点的坐标。下图你可以看到3个基本变换的例子:
第一个变换只是简单地将3D空间中的所有点移动到左下方,这种变换叫做平移(translation)。第二个变换是旋转(rotation),所有点绕一个指定轴旋转,本例中是绕Z轴旋转。最后一个基本变换是缩放,所有点的坐标乘以一个特定的数值。我将它们称为基本变换,是因为你能想象的任何变换都可以用这三个基本变换的组合表示。
下图你可以看到平移的结果,然后还要进行旋转:
矩阵的3个特性
特性1:矩阵可以看做一个特殊(但并不复杂)的元素,可以表示上述变换。所以假如你有3个矩阵:Mtrans, Mrot和Mscal,它们分别对应一种变换。
特性2: 如果你将一个矩阵乘以对应的3D点坐标,就可以获取变换后的点坐标,如下图所示:
这意味着对任意点,你可以简单地通过将它的坐标乘以一个矩阵获取它的投影、旋转和缩放!
特性3: 如果你将两个矩阵M1和M2相乘,会获得一个新矩阵M3。对应这个新矩阵M3的变换即对应前两个矩阵的变换组合。
第三个特性非常有用。例如上面平移后旋转的例子中,计算给定点的位置的一个方法是首先计算经过平移矩阵M1的变换,然后将结果乘以M2计算旋转,这让你必须为每个点计算2次,由下图表示:
使用第三个特性,你只需简单地先计算M1和M2的乘积获取M3。然后将点乘以矩阵 M3获取点的平移并旋转后的坐标!2个矩阵的乘法很快(64次乘法和48次加法),而变换场景中的所有点要慢得多(每个点16次乘法和12次加法)
矩阵数学
先看一个二维空间的题目:
有了二维推导例子,你可以将一个3D点的坐标作为一个矩阵的一列和3行,点和矩阵间的乘法如下定义:
现在你应该知道了所有知识。如你所见,并不是很难。下面举一个例子。设3D空间有一个坐标为(6,18,9.5)的点。先看一个简单的例子:我们想将场景变大为2倍,这意味着我们要缩放2倍,一个简单的缩放矩阵如下所示:
结果是:
在这个例子中,s = 2,所以点的坐标变为(12, 36, 19)。
下面看一下旋转矩阵,它看起来有点复杂,但记住所有sin和cos实际上就是一个介于-1和+1之间的数值。下面三个矩阵表示绕X,Y和Z轴的旋转,θ为旋转角度:
例如将点(10,5,0)绕Z轴旋转45度,我们的旋转矩阵如下:
因为pi=3.14对应180度,45度对应pi/4。结果是:
所以当我们将点(10,5,0)旋转45度,结果是点(10.6065, -3.5355, 0)!幸运的是,DirectX可以为你完成这些运算,但现在我们理解了工作原理。
带平移的矩阵
如果一个矩阵,你会看到16个数据项,这意味着4行和4列。选择这种方式是为了让矩阵也可以表示平移。
要平移一个点,我们需要添加一个数字。使用3x3矩阵,我们只能获取初始矩阵的倍数。所以在X,Y和Z边上需要添加一个常数。为了简单起见,设为1。从现在开始,我们使用4个坐标表示一个3D点。例如,位于(10,5,0)的点的坐标为(10,5,0,1)。
缩放和旋转矩阵保持不变,但多了一个额外的行和列其值为0,但m44值为1。下图你可以看到以平移形式的缩放和Y旋转矩阵:
看起来有点复杂,但现在我们可以定义一个平移矩阵了:
让我们看一个小例子。如果我们想将点(10,5,0)移动(-8,2,4)。可以这样做:
结果是(2,7,4)。但这里我仍想强调3个基本特性:
1) 我们有一个矩阵对应每个基本变换
2) 将点的坐标乘以一个矩阵会获得变换后的坐标
3) 两个矩阵相乘获得一个新矩阵,对应变换的组合
如果你理解以上特性,你会注意到第4个坐标没有几何意义,它只是让我们可以定义一个平移矩阵。
你会注意到有时这个常量不是1。事实上,通用规则是只需简单地将X,Y和 Z 坐标除以第4个坐标,我们将第4个坐标称之为W坐标。
简单地说:(20,10,0,2) = (10,5,0,1),这两个坐标表示的是同一个3D点(10,5,0),所以从4个坐标中获取3D点的简单规则是:
- 本文固定链接: http://ttfde.top/index.php/post/405.html
- 转载请注明: admin 于 TTF的家园 发表
《本文》有 0 条评论