所以,自从我写这个问题已经有几个月了,从那时起我就玩弄了"原始"C++ D3D,Ogre和Irrlicht图形引擎以及最近的微软XNA.我已经构建了一些2D游戏(主要是像俄罗斯方块,星辰等老东西的复制品),并在上述技术中为3D世界做了一些(非常)小步骤.
创建实际的游戏逻辑,抽象掉对象交互以允许我插入不同形式的控件(计算机,播放器,网络等),做线程或我使用的任何其他东西,我几乎没有遇到任何麻烦从我的日常工作 - 这对我来说非常自然.我很少使用HLSL和粒子效果(非常非常基本).
但是,涉及矩阵和向量的三维数学(以及Ogre3D中的四元数(?),这些真的需要吗?)...真的让我,我可以效仿(例如我从O'Reilly购买的Learning XNA 3.0书,这是一个很棒的书btw)我理解为什么以及如何在这个例子中发生的事情,但是当我尝试自己做某事时,我觉得我缺乏对这种数学的理解,能够真正得到它并让它通过我.
所以我正在寻找有关学习3D数学(主要是)和一些着色器/粒子效果书籍的资源.我宁愿是教学资源,并采取减缓上述就像一个医生对论文矢量数学这将是方式在我的头上.理想的资源可以在D3D中展示它.
好的,矩阵/矢量计算的快速课程:
矩阵是在矩形网格中排序的数字集合,如:
[ 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 ]
希望这个对你有帮助.
Fredrik - 简短的回答是,是的,你必须学习矩阵和向量,因为它们是3D工作的数学基础.
虽然线性代数绝对不是博士级数学,但它需要一些工作.要开始使用,请查看亚马逊上的这本书:看起来它正是您正在寻找的.我没有读过这本书(我在研究生院使用过的那本书有点过时了),但它的评价特别好.
另一件事:有各种3D建模引擎可以在市场上为您工作.其中最着名的可以说是Valve 的Source Engine.您可以使用此引擎(专为HalfLife2和CounterStrike构建)创建一些非常复杂的游戏,同时在3D建模水平之上工作.事实上,作为Steam网络上最受欢迎的游戏之一,Garry的mod开始时只会玩一些你可以用Steam Engine做的很酷的东西.这是一个指向网站的链接,该网站提供了使用Source Engine构建您自己的世界的教程,以备您感兴趣.