2009-01-28 204 views
15

所以,自从我写了this question以来,已经过去了几个月,从那以后我玩弄了“原始”C++ D3D,Ogre和Irrlicht图形引擎以及最近的Microsoft XNA。我已经制作了一些2D游戏(主要是像俄罗斯方块,陨石等老东西的复制品),并在上述技术中为3D世界做了一些(非常)小的步骤。我很少或没有麻烦创建实际的游戏逻辑,抽象掉对象的相互作用,让我插入不同形式的控制(计算机,播放器,通过网络等),做线程或任何其他的东西我习惯于从一天到一天的工作 - 这对我来说非常自然。对于HLSL和粒子效应(非常非常基本)我很少讨论。 (这是真的需要和四元(?)在OGRE3D,?)学习游戏编程(第2部分)(数学)

3D数学涉及向量和矩阵...真的打动了我,我可以按照实例(例如学习XNA 3.0的书我买了从O'Reilly,这是一本很棒的书btw),我明白为什么如何在这个例子中发生了一些事情,但是当我尝试自己做一些事情时,我觉得我缺乏对这种类型数学的理解能够真的得到它并让它自己工作。

因此,我正在寻找有关学习3D数学(主要是)和一些Shader/Particle Effects书籍的资源。我更喜欢教育学的资源,并把它放在像矢量数学的医生论文之上,这将是方式在我头上。理想的资源将在D3D中展现出来。

回答

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 ] 

反转矩阵只能方阵来进行,这是一个复杂的工作一点不neccesary有一个结果。

开始矩阵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 ] 

希望这会有所帮助。

+2

“现在我们从第一列开始,我们需要从每一行中减去第一行,这样第一列除第一行外只包含零,为此我们从第二行减去第一行, “从头三次两次:”头痛! – jokoon 2010-09-27 21:38:23

1

对于载体而言,关于线性代数的介绍性文本或课程应该能够让您快速调整速度。

+0

你有任何文本推荐? – thr 2009-01-28 12:13:43

9

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

虽然线性代数绝对不是博士水平的数学,它将需要一些工作。要开始使用,请在亚马逊网站上查看this book:看起来它正是您要查找的内容。我还没有读过这本书(我在研究生中使用的那本书有点过时),但它的评价特别好。

另一件事:有各种3D建模引擎在市场上为您做这项工作。其中最着名的可以说是Valve的Source Engine。你可以使用这款引擎(专为HalfLife2 & CounterStrike制作)创建一些相当精密的游戏,同时工作以上的等级的3D建模。实际上,Steam网络上最受欢迎的游戏之一Garry's mod最初只有一个人正在玩使用Steam Engine可以做的很酷的事情。这里有一个link网站,提供使用源引擎构建自己的世界的教程,以防您感兴趣。

+0

刚拿到这本书。这很好,我绝不是数学专家。我试图了解很长一段时间的媒介,但失败了。这本书几乎立即让我了解它们。 – Skurmedel 2009-07-17 22:57:21

2

Mathematics for Computer Graphics Applications”是一个入门级的教材,并采取了教室适当的方法来所有的基本数学的,你需要与3D编程相识(矩阵和主要载体)

和关于四元一张纸条:他们是非常有用某些应用程序。 SLERP(球形线性插入)可以非常方便地生成平滑/吸引人的相机移动(等等)。 SLERP对于矩阵来说是一种痛苦(昂贵的),但是对四元数来说便宜且容易。学会使用和爱他们 - 即使你没有完全理解他们。

4

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

+1

YT链接已损坏(私人视频)是否有替代链接? – aikeru 2013-12-09 16:22:20