游戏中的基本数学概念--矩阵的应用
前面提到过在一个游戏中可能应用到多个坐标系. 当遇到改变坐标系的时候就牵涉到点的位置的改变 (相对于新的原点和标准方向) 和矢量方向的改变 (相对于新的标准方向) . 我们称这种操作为坐标变换. 在图形模块中, 我们经常需要进行坐标变换. 从模型空间 (Model Space) 到全局空间 (World Space) 再到摄影机空间 (Camera Space或Eye Space), 最后到单位设备空间 (Normalized Device Space) 都牵涉到坐标的变换. 这些都是图形模块中的标准变换, 是必不可少的. 另外在计算视觉平截体 (View Frustum) 的时候, 我们还需要进行反向变换 (一般从单位设备空间变换到全局空间). 再有在计算一些高级特性 (例如阴影渲染)时, 一般都少不了作坐标变换. 所以掌握好它对游戏编程, 特别是图形编程非常重要. 说了这么多, 到底是如何实现坐标变换的呢? 这里我们就要用到矩阵了. 从数学原理上, 矩阵代表了从一个线性空间到另一个线性空间的变换. 它可以很方便地应用在游戏的坐标变换中. 我们的游戏空间是三维空间. 3*3 的矩阵可以操作三维矢量从一个坐标系变换到另一个坐标系. 对点来说情况要复杂一些, 我们通常利用同源坐标 (Homogeneous Coordinate) 的概念利用一个 4*4 的矩阵对点和矢量同时进行操作. 同源坐标是一个巧妙而又简单的方法. 它的应用简化了图形的编程, 特别是简化了图形加速硬件的复杂度. 实际上图形卡的指令就是根据同源坐标的计算来设计的. 所以我们在使用 OpenGL 或 Direct3D API 的时候, 可以发现使用的都是 4*4 的矩阵. 在这里我尝试不使用太多的数学知识来解释矩阵是怎样进行坐标变换的, 毕竟本网站的目的在于传播游戏知识而非数学知识. 从基本数学概念上来说, 一个坐标系对应了一个仿射空间 (Affine Space) , 当矢量从一个坐标系变换到另一个坐标系时要进行线性变换 (Linear Transformation). 对点来说, 要进行仿射变换 (Affine Transformation). 这就是我们利用同源坐标的理由. 它能在对矢量进行线性变换的同时对点进行仿射变换. 坐标变换的基本操作就是将变换矩阵乘以矢量或点, 以得到变换后的矢量或点. 其基本公式如下 v' = Mv以上公式中, v为矢量在原坐标系中的表示, v'代表该矢量在新坐标系中的表示. M为转换矩阵. 对点也有相同的方法 (在同源坐标中). 所以对坐标变换来说, 关键就是决定这个转换矩阵. 对此, 我们有一简单的方法. 假设我们有两个坐标系¼与¼'. 坐标系¼的标准矢量 i, j, k 对应于坐标系¼'的矢量是 u' = < u'x, u'y, u'z >, v' = < v'x, v'y, v'z >, w' = < w'x, w'y, w'z >. 我们的转换矩阵将是: 应用在同源坐标系中的4*4矩阵将是: 对坐标系¼中的任意矢量v = < a, b, c > 来说, 它在坐标系¼'中对应的矢量为:
对点来说, 情况要复杂一点. 但也并不难太多. 我们只是要多考虑两个坐标原点的差距. 如果坐标系¼的原点O对应于坐标系¼'中的点是P = < x, y, z >, 那么点的转化矩阵N为: 对坐标系¼中的任意点Q = < a, b, c >来说, 它在坐标系¼中对应的点Q'为:
矩阵N对点提供了仿射变换. 它同时能对矢量提供线性变换如下: 从上可见, 矩阵N能提供给矢量与矩阵M相同的线性变换. 所以矩阵N能对矢量与点进行坐标变换. 它就是我们寻找的坐标系之间的变换矩阵. 一个简单的理解方式是把转换矩阵想象成坐标系之间的差异. 一个坐标系里的矢量或点, 加上坐标系之间的不同就得到了另一个坐标系的矢量或点. 我在上面对矩阵与坐标变换的关系作了一些说明. 要掌握矩阵在三维图形中的应用我们还需要了解矩阵的加法, 乘法, 转置矩阵 (Transpose Matrix) 和逆矩阵 (Inverse Matrix)的计算, 以及矩阵拆分 (Matrix Decompose) 的知识. 这些都是基本的数学知识并在很多图形学著作中的有描述. 不懂的读者可以考虑一读. 矩阵在图形模块中大量应用. 但它在游戏中的应用并不仅仅局限在图形模块中. 物理模拟 (Physics Simulation) 也应用到了矩阵的知识. 我在这篇文章中试图对矩阵和它在游戏中的应用作一个简单的描述. 对没有线性代数基础的读者来说, 这可能会造成理解上的困难. 如果有读者在读完文章后不能理解所阐述的内容, 请给我来信说明. 我会考虑从更基本的数学理论出发再写一些. 矩阵对三维游戏特别是图形模块具有根本的重要性, 一定要从概念上理解它. |
转载自:http://www.gametechzone.net/index.php?option=com_content&task=view&id=30&Itemid=48