学习游戏编程(第2部分)(数学)

时间:2009-01-28 11:49:45

标签: math vector 3d

所以,自从我写this question以来已经过了几个月,从那时起我就玩弄了“原始”C ++ D3D,Ogre和Irrlicht图形引擎以及最近的微软XNA。我已经构建了一些2D游戏(主要是像俄罗斯方块,星辰等老东西的复制品),并在上述技术中为3D世界做了一些(非常)小的步骤。

创建实际的游戏逻辑,抽象掉对象交互以允许我插入不同形式的控件(计算机,播放器,网络等等),做线程或任何其他东西我几乎没有问题从我的日常工作中习惯了 - 这对我来说非常自然。我对HLSL和粒子效果(非常非常基本)的讨论很少。

但是涉及矩阵和向量的3D数学(以及Ogre3D中的四元数(?),这些真的需要吗?)...真的让我,我可以按照例子(例如我从O'Reilly购买的Learning XNA 3.0书,这是一本很棒的书),我理解为什么如何在示例中发生了什么,但当我尝试自己做一些事情我觉得我缺乏对这类数学的理解,能够真的得到它并让它自己工作。

所以我正在寻找学习3D数学(主要是)和一些Shader / Particle Effects书籍的资源。我更喜欢教学方面的资源,并且把它放在像医生关于矢量数学的论文上那么慢,这将是方式超过我的头脑。理想的资源可以在D3D中展示它。

5 个答案:

答案 0 :(得分:24)

好的,矩阵/矢量计算的快速课程:

矩阵是以矩形网格排序的数字集合,如:

[ 0,  1,  2 ]
[ 2,  3,  5 ]
[ 2,  1,  3 ]
[ 0,  0,  1 ]

上述矩阵有4行3列,因此是4×3矩阵。 向量是具有1行(行向量)或1列(列向量)的矩阵。 正常数字称为标量,与矩阵形成对比。

对于标量使用大写字母和使用标记的小写字母也很常见。

我们可以用矩阵进行基本计算,但有一些条件。

<强>加成

如果矩阵具有相同的尺寸,则可以添加矩阵。因此,2x2矩阵可以添加到2x2矩阵,但不能添加到3x5矩阵。

[ 1,  2 ] + [ 2,  5 ] = [ 3,  7 ]
[ 2,  4 ]   [ 0,  3 ]   [ 2,  7 ]

您会看到,通过添加,每个单元格的每个数字都会添加到另一个矩阵中相同位置的数字上。

矩阵乘法

矩阵可以相乘,但这有点复杂。为了将矩阵A与矩阵B相乘,如果矩阵A与矩阵B中的每列相乘,则需要将每行中的数字相乘。这意味着如果将axb矩阵与acxd矩阵相乘,则b和c必须相等且得到的矩阵是axd:

[1,2,3] x [4,6] = [1x4+2x2+3x2, 1x6+2x1+3x3 ] = [4+4+6,  6+2+9  ] = [14, 20]
[1,4,5]   [2,1]   [1x4+4x2+5x2, 1x6+4x1+5x3 ]   [4+8+10, 6+4+15 ]   [22, 25]
          [2,3] 

如您所见,对于矩阵,A x B与B x A不同。

矩阵标量乘法

您可以将矩阵与标量相乘。在这种情况下,每个单元格乘以该数字:

3 x [1,2] = [ 3, 6]
    [4,7]   [12,21]

反转矩阵 矩阵除法是不可能的,但是您可以创建矩阵的反演,使得A x A-inv是除了主对角线以外全零的矩阵:

[ 1, 0, 0 ]
[ 0, 1, 0 ]
[ 0, 0, 1 ]

反转矩阵只能用方形矩阵完成,这是一个复杂的工作,不需要有结果。

从矩阵A开始:

    [ 1, 2, 3 ]
A = [ 1, 3, 4 ]
    [ 2, 5, 1 ]

我们添加3个额外的列并用单位矩阵填充它们:

[ 1, 2, 3, 1, 0, 0 ]
[ 1, 3, 4, 0, 1, 0 ]
[ 2, 5, 1, 0, 0, 1 ]

现在我们从第一列开始。我们需要从每一行中减去第一行,这样第一列除了第一行外只包含零。 为了做到这一点,我们从第二行减去第一行,从第三行减去两次:

[ 1, 2, 3, 1, 0, 0 ]
[ 0, 1, 1,-1, 1, 0 ]
[ 0, 1,-5,-2, 0, 1 ]

现在我们用第二列(第一行两次和第三列一次)重复此操作

[ 1, 0, 1, 3,-2, 0 ]
[ 0, 1, 1,-1, 1, 0 ]
[ 0, 0,-6,-1,-1, 1 ]

对于第三栏,我们有一个小问题。枢轴数是-6而不是1.但是我们可以通过将整行乘以-1/6来解决这个问题:

[ 1, 0, 1,   3,  -2,    0 ]
[ 0, 1, 1,  -1,   1,    0 ]
[ 0, 0, 1, 1/6, 1/6, -1/6 ]

现在我们可以从第一行和第二行中减去第三行:

[ 1, 0, 0, 17/6,-13/6,  1/6 ]
[ 0, 1, 0, -7/6,  5/6,  1/6 ]
[ 0, 0, 1,  1/6,  1/6, -1/6 ]

好的,现在我们有A的倒数:

[ 17/6,-13/6,  1/6 ]
[ -7/6,  5/6,  1/6 ]
[  1/6,  1/6, -1/6 ]

我们可以写成:

      [ 17,-13,  1 ]
1/6 * [ -7,  5,  1 ]
      [  1,  1, -1 ]



    [ 1, 2, 3 ]   [ 17,-13,  1 ]                [ 6, 0, 0 ]    [ 1, 0, 0 ]
A = [ 1, 3, 4 ] x [ -7,  5,  1 ] x 1/6  = 1/6 x [ 0, 6, 0 ] =  [ 0, 1, 0 ]
    [ 2, 5, 1 ]   [  1,  1, -1 ]                [ 0, 0, 6 ]    [ 0, 0, 1 ]

希望这有点帮助。

答案 1 :(得分:9)

Fredrik - 简短的回答是,是的,你必须学习矩阵和向量,因为它们是3D工作的数学基础。

虽然线性代数绝对不是博士级数学,但它需要一些工作。要开始使用,请查看亚马逊上的this book:它看起来就像您正在寻找的那样。我没有看过这本书(我在毕业学校使用的那本书有点过时了),但它的评价特别好。

另一件事:有各种3D建模引擎可以为您在市场上工作。其中最着名的可能是Valve的Source Engine。您可以使用此引擎(专为HalfLife2和CounterStrike构建)创建一些非常复杂的游戏,同时在上面进行3D建模。事实上,Steam网络上最受欢迎的游戏之一,Garry's mod开始时只会玩一些你可以用Steam Engine做的很酷的事情。这是一个link站点,提供了使用源引擎构建自己世界的教程,以备您感兴趣。

答案 2 :(得分:4)

你肯定需要学习线性代数。麻省理工学院免费在youtube上发布全班。您可以从here开始。这并不难,相信我!玩得开心;)

答案 3 :(得分:2)

'Mathematics for Computer Graphics Applications'是一本入门级教科书,采用课堂教学方法,适用于所有需要熟悉3D编程的基本数学(主要是矩阵和向量)

关于四元数的说明:它们非常对某些应用程序有用。 SLERP(球面线性intPolation)可以非常方便地产生平滑/吸引人的相机运动(除此之外)。 SLERP是一种与矩阵相关的痛苦(昂贵),但是使用Quaternions便宜又容易。学会使用和爱他们 - 即使你不完全理解他们。

答案 4 :(得分:1)

对于特定的向量,线性代数的介绍性文本或课程应该能够让你快速上手。