首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习游戏编程(第二部分)(数学)

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

Stack Overflow用户
提问于 2009-01-28 11:49:45
回答 5查看 3.7K关注 0票数 15

所以,我写这个问题已经有几个月了,从那以后,我一直在玩“原始”C++ D3D、Ogre和Irrlicht图形引擎,以及最近的Microsoft。我制作了一些2D游戏(大部分是俄罗斯方块、乳酪等老东西的复制品)。并在上面提到的技术中向3D世界迈出了一些(非常)小的步伐。

我没有什么困难,创建实际的游戏逻辑,抽象出对象交互,让我插入不同形式的控制(计算机,玩家,通过网络。(等等),做线程或任何其他我习惯的日常工作--这对我来说是非常自然的。我很少使用HLSL和粒子效应(非常基本)。

涉及矩阵和向量的三维数学(和四元数)在Ogre3D,这些真的需要吗?)真的很了解我,我可以遵循一些例子(例如,我从O‘really那里买来的“学习XNA 3.0”,这是一本很棒的书),我明白为什么和如何在这个例子中发生一些事情,但是当我自己尝试做一些事情时,我觉得我缺乏对这种数学的理解,无法真正得到它,并让它独立工作。

因此,我正在寻找有关学习3D数学的资源(主要是)和一些阴影/粒子效应书籍。我更喜欢有教学能力的资源,把它慢慢来,就像医生关于向量数学的论文,这将超出我的想象。理想的资源应该是在D3D中演示这一切的东西。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-28 12:45:52

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

矩阵是矩形网格中排序的数字集合,如下所示:

代码语言:javascript
复制
[ 0,  1,  2 ]
[ 2,  3,  5 ]
[ 2,  1,  3 ]
[ 0,  0,  1 ]

上面的矩阵有4行3列,因此是4x3矩阵。向量是具有1行(行向量)或1列(列向量)的矩阵。正态数称为标量,用来与矩阵进行对比。

矩阵使用大写字母和标量使用小写字母也很常见。

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

加法

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

代码语言:javascript
复制
[ 1,  2 ] + [ 2,  5 ] = [ 3,  7 ]
[ 2,  4 ]   [ 0,  3 ]   [ 2,  7 ]

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

矩阵乘法

矩阵可以乘以,但这要复杂一些。为了使矩阵A与矩阵B相乘,如果矩阵A与矩阵B中的每一列相乘,则需要将每一行中的数乘以矩阵B中的每一列。这意味着,如果将a x b矩阵与c x d矩阵相乘,则b和c必须相等,由此产生的矩阵是x d:

代码语言:javascript
复制
[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.不同于B。

矩阵标量乘

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

代码语言:javascript
复制
3 x [1,2] = [ 3, 6]
    [4,7]   [12,21]

逆矩阵矩阵除法是不可能的,但是可以创建矩阵的逆,这样an是一个矩阵,除主对角线外,所有的矩阵都是零的:

代码语言:javascript
复制
[ 1, 0, 0 ]
[ 0, 1, 0 ]
[ 0, 0, 1 ]

矩阵的反演只能用方阵来完成,这是一项不需要结果的复杂工作。

从矩阵A开始:

代码语言:javascript
复制
    [ 1, 2, 3 ]
A = [ 1, 3, 4 ]
    [ 2, 5, 1 ]

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

代码语言:javascript
复制
[ 1, 2, 3, 1, 0, 0 ]
[ 1, 3, 4, 0, 1, 0 ]
[ 2, 5, 1, 0, 0, 1 ]

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

代码语言:javascript
复制
[ 1, 2, 3, 1, 0, 0 ]
[ 0, 1, 1,-1, 1, 0 ]
[ 0, 1,-5,-2, 0, 1 ]

现在,我们在第二列中重复这一点(第一行两次,第三列一次)。

代码语言:javascript
复制
[ 1, 0, 1, 3,-2, 0 ]
[ 0, 1, 1,-1, 1, 0 ]
[ 0, 0,-6,-1,-1, 1 ]

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

代码语言:javascript
复制
[ 1, 0, 1,   3,  -2,    0 ]
[ 0, 1, 1,  -1,   1,    0 ]
[ 0, 0, 1, 1/6, 1/6, -1/6 ]

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

代码语言:javascript
复制
[ 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的逆:

代码语言:javascript
复制
[ 17/6,-13/6,  1/6 ]
[ -7/6,  5/6,  1/6 ]
[  1/6,  1/6, -1/6 ]

我们可以把它写成:

代码语言:javascript
复制
      [ 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 ]

希望这能帮点忙。

票数 24
EN

Stack Overflow用户

发布于 2009-01-28 12:37:48

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

虽然线性代数绝对不是博士级的数学,但它将需要一些工作。要开始,请查看亚马逊上的这本书:它看起来正是您要寻找的东西。我还没有读过这本特别的书(我在研究生院用的书有点过时了),但它的评价特别好。

还有一件事:市场上有各种各样的3D建模引擎为你做这方面的工作。其中最著名的是来自阀门的源引擎。您可以使用这个引擎(为HalfLife2和CounterStrike构建)来创建一些非常复杂的游戏,同时工作在3D建模级别之上。事实上,在蒸汽网络上最流行的游戏之一,加里模开始时,有人只是玩一些很酷的事情,你可以做的蒸汽引擎。下面是一个网站的链接,它提供了使用源引擎构建您自己的世界的教程,以防您感兴趣。

票数 9
EN

Stack Overflow用户

发布于 2009-02-02 22:16:26

你一定要学线性代数。麻省理工学院免费在youtube上发布了整个班级。你可以从这里开始。没那么难相信我!玩得开心;)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/487352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档