您的位置  > 互联网

数学家发展出了用数学概念来抽象出现实世界

在游戏中,矢量(>和点)是构成三维世界的基本元素。 其他元素,从简单的直线(Line)、平面(Plane),到复杂的视觉平截头体(View),都是由向量和点组成的。 要正确有效地编程,了解相关知识非常重要。

向量在游戏中经常用于两个方面。 第一个用于表示方向。 例如,它表示三角形的法线()方向。 另一个例子是用向量来表示游戏中相机()所面向的方向。 向量的第二个用途是描述变化。 在游戏中,我们经常使用速度来计算物体位置的变化。 这个速度实际上是一个矢量。

图 1 显示了一个向量。 向量具有大小和方向。 向量的大小很容易理解,就是向量的长度。 对于三维空间向量 v = < x, y, z >:

向量的方向也很容易理解,但是它在程序中的描述比较复杂。 向量的方向可以用向量v本身来描述,但通常我们使用单位向量来描述方向,即

v = v / ||v||

没有线性代数基础的读者可能无法理解上面的描述。 我将从几何角度进一步分析。 从几何上来说,矢量的箭头指向它的方向。 虽然这很容易理解,但是我们很难在程序中表达并保存这个概念。 我们需要一种更抽象的数学表达方法。 前面我们说过向量本身可以描述方向。 那么向量保存的<x,y,z>是如何与箭头的方向联系起来的呢? 这时候,向量点积(Dot)就派上用场了。

u * v = ||u|| ||v|| 科萨

考虑到u和v是单位向量表示的两个方向,我们有

||你|| = ||v|| = 1.0。

u * v = cosá -------- (1)

因此两个单位向量的点积描述了两个向量之间的角度。 在三维游戏中,我们经常定义三个标准方向i: , j: , k: 。 那么任意向量的方向都可以用与这三个标准方向的点积来表示。 例如,对于向量u=<ux,uy,uz>,由式(1)可得:

cosá = u * i = ux * 1 + uy * 0 + uz * 0 = ux

从上面的推导可以看出,ux反映了向量u与标准向量i之间的夹角。 类似地,我们可以得出结论,uy和uz分别反映了向量u与标准向量j和k之间的角度。 这样,我们就得出结论:一个向量的方向是相对于一个标准向量的。 当我们确定了一组标准向量后(对于三维空间来说,一组意味着三个标准向量),任意向量的方向都可以与此表示为三个标准向量之间的夹角。

点是构成三维游戏世界的另一个元素。 它比向量更容易理解。 分数用于确定游戏中的位置。 三维模型由许多三角形组成。 每个三角形都有三个点来标识三角形的三个顶点。 位置(详见《三维模型-简单三维模型》)。 物体在空间中的位置也由点来标识。

与向量类似,空间中任意点的位置也是相对的。 它们的位置相对于空间中的参考点。 该参考点称为原点 ()。 原点的选择也像标准方向一样是可变的。 一个原点和一组标准方向共同决定了一个坐标系,如图2所示(这个坐标系通常在游戏中使用,称为笛卡尔坐标系)。 坐标系确定后,空间中的任意一点都可以由坐标系的原点和标准方向唯一确定。 表达式是一组实数<x,y,z>。 它与空间中的点一一对应。 向量的确定不需要原点的概念。 空间中不需要原点的概念。 的任何向量都可以由一组标准方向唯一确定。 表达式也是一组实数<x,y,z>。

在游戏中,点和向量通常具有相同的表示(<x,y,z>),但它们是两个完全不同的概念。 他们的操作也不同。 理解这一点对于正确编程至关重要,并且使用标准库函数也非常重要。 例如:对于两个点来说,它们之间有距离的概念,但是对于向量来说,距离是没有意义的。 同样,对于点来说,很难想象角度有什么意义,但是对于向量来说,这就是它的基本意义。 这些并不难理解。 下面给出点和向量之间的合法运算。

1) 如果我们有两个点 P 和 Q,那么

u=PQ

代表一个向量。 它的大小是P和Q两点之间的距离,方向是从Q点到P的方向。

2)如果我们有一个点 P 和一个向量 u,那么

Q = P + u

标识点Q。点Q在空间中的位置是点P沿u向量方向移动||u||得到的位置。 单位(u 向量的长度)。

需要指出的是,游戏中经常使用多个标准方向和原点。 不同标准方向和原点的选择对应不同的坐标系。 这就涉及到不同坐标系之间的转换。 这是掌握3D游戏编程的另一个重点