所以,自从我写this question以来已经过了几个月,从那时起我就玩弄了“原始”C ++ D3D,Ogre和Irrlicht图形引擎以及最近的微软XNA。我已经构建了一些2D游戏(主要是像俄罗斯方块,星辰等老东西的复制品),并在上述技术中为3D世界做了一些(非常)小的步骤。
创建实际的游戏逻辑,抽象掉对象交互以允许我插入不同形式的控件(计算机,播放器,网络等等),做线程或任何其他东西我几乎没有问题从我的日常工作中习惯了 - 这对我来说非常自然。我对HLSL和粒子效果(非常非常基本)的讨论很少。
但是涉及矩阵和向量的3D数学(以及Ogre3D中的四元数(?),这些真的需要吗?)...真的让我,我可以按照例子(例如我从O'Reilly购买的Learning XNA 3.0书,这是一本很棒的书),我理解为什么和如何在示例中发生了什么,但当我尝试自己做一些事情我觉得我缺乏对这类数学的理解,能够真的得到它并让它自己工作。
所以我正在寻找学习3D数学(主要是)和一些Shader / Particle Effects书籍的资源。我更喜欢教学方面的资源,并且把它放在像医生关于矢量数学的论文上那么慢,这将是方式超过我的头脑。理想的资源可以在D3D中展示它。
答案 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)
对于特定的向量,线性代数的介绍性文本或课程应该能够让你快速上手。