游戏中的基本数学概念-矢量与点(转载)
我们所感知到的世界是一个几何的世界, 物理的世界. 从感观上我们很容易描述这个世界, 但是计算机不能接受这种描述方式. 计算机需要的是更加抽象的表达方式. 长期以来, 数学家发展出了用数学概念来抽象出现实世界的方式. 计算机接受的就是这种数学的方式. 这篇文章是 "游戏中的基本数学概念" 的第一篇, 它要介绍的是构成我们三维游戏世界的基本元素--矢量与点. 在游戏中, 矢量 (Vector> 和点 (Point) 是构成我们三维世界的基本元素. 其它元素, 从简单的线 (Line), 面 (Plane), 到复杂的视觉平截体 (View Frustm) 都是由矢量和点组合而成的. 要正确有效地编程, 理解相关的知识非常重要. 在游戏中矢量经常应用在两个方面. 第一个是用来表示方向. 例如表示三角形的法线 (Normal) 方向. 另一个例子是用矢量表示游戏中摄像机 (Camera) 面对的方向. 矢量的第二个用处是用来描述变化. 在游戏中我们常常利用速度来计算物体位置的变化, 这个速度其实就是一种矢量. 图一所示就是一个矢量. 矢量有大小和方向. 矢量的大小很好理解, 它就是矢量的长度. 对三维空间矢量v = < x, y, z >而言: 矢量的方向也很好理解, 但它在程序中的描述要复杂一些. 矢量的方向可由矢量v本身描述, 但通常我们都用单位矢量来描述方向, 即 v = v / ||v||没有线性代数基础的读者可能会不能理解上面的描述. 我将从几何角度作进一步的分析. 从几何上来说, 矢量的箭头指向就是它的方向. 这虽然容易理解, 但是在程序中我们难以表达和保存这种概念. 我们需要更抽象的数学表达方法. 前面我们说了矢量本身就能描述方向. 那么矢量保存的 < x, y, z > 怎样和箭头的指向建立联系呢? 这时候矢量的点积 (Dot Product) 就派上了用场. u * v = ||u|| ||v|| cosá考虑u和v是两个用单位矢量表示的方向, 就有 ||u|| = ||v|| = 1.0.u * v = cosá -------- (1)所以两个单位矢量的点积就描述了这两个矢量之间的夹角. 在三维游戏中, 我们经常定义三个标准方向i: <1, 0, 0>, j: <0, 1, 0>, k: <0, 0, 1>. 然后任意矢量的方向都能用它与这三个标准方向的点积来表示. 例如对矢量u = < ux, uy, uz > 而言, 由公式(1)我们可以得到: cosá = u * i = ux * 1 + uy * 0 + uz * 0 = ux从以上推导可知, ux反映的是矢量u与标准矢量i的夹角. 同理, 我们可以得出uy和uz反映的是矢量u分别与标准矢量j与k的夹角. 这样一来, 我们得出了结论, 矢量的方向是相对于标准矢量的. 在我们确定一组标准矢量后 (对三维空间来说, 一组意味着三个标准矢量) , 任意矢量的方向都能用它与这三个标准矢量的夹角来表示. 点是构成三维游戏世界的另外一个要素. 它比矢量更容易理解. 点在游戏中被用来标识位置. 三维模型由许多的三角形组成. 每个三角形由三个点来标识三角形三个顶点的位置 (具体见"三维模型--简单的三维模型"). 物体在空间中的位置也要由点来标识. 与矢量相似, 空间任意一点的位置也是相对的. 它们的位置都是相对于空间中某一参照点的位置. 这个参照点就叫做原点 (Origin). 原点的选择与标准方向一样也是可变的. 一个原点与一组标准方向一起决定了一个坐标系, 如图二 (在游戏中通常用到的都是这种坐标系, 称为笛卡尔坐标系). 坐标系确定以后, 空间中的任意一点都能用该坐标系的原点和标准方向唯一决定, 表达的方式是一组实数 < x, y, z >. 它和空间中的点一一对应. 矢量的确定不需要原点的概念, 空间中的任意矢量通过一组标准方向就能唯一决定. 表达的方式也是一组实数 < x, y, z >. 在游戏中点与矢量通常都有相同的表示方式 ( < x, y, z > ), 但它们是完全不同的两个概念. 对它们的操作也不尽相同. 认识到这一点对正确的编程和使用标准的库函数都非常重要. 例如: 对两点来说, 它们之间有距离的概念, 但对矢量而言, 距离毫无意义. 同样, 对点来说, 很难想象夹角有什么意义, 但对矢量而言, 这是它的基本意义. 这些都是不难理解的. 下面给出点和矢量之间的合法运算. 1) 如果我们有两点P, Q, 那么 u = P - Q代表了一个矢量. 它的大小是P, Q两点之间的距离, 方向则是从Q点指向P的方向. 2) 如果我们有一点P和一个矢量u, 那么 Q = P + u标识了一个点Q. Q点在空间的位置是P点沿着u矢量的方向移动||u||单位 (u矢量的长度) 得到的位置. 需要指出的是: 在一个游戏中常常会应用到多个标准方向和原点. 不同的标准方向和原点的选择对应了不同的坐标系. 这样就涉及到不同坐标系之间的变换. 这是掌握三维游戏编程的又一个重点 |