所有游戏程序员都应该知道什么数学?[关闭]


164

足够简单的问题:为了成功,所有游戏程序员都应该掌握什么数学?

我并不是在谈论在游戏编程的利基领域中渲染数学或任何东西,更具体地说,甚至是游戏程序员都应该知道的事情,如果他们不这样做,他们可能会发现它很有用。

注意:由于没有一个正确的答案,所以这个问题(及其答案)是社区Wiki。

另外,如果您想使用精美的乳胶数学方程式,请随时使用http://mathurl.com/


1
嗯,我认为有一个话题是每个程序员都应该读的数学书,或者类似的东西,我真的不记得它了……但是上面有一些不错的东西……
大奖



15
Tetrad♦
托马斯·爱丁

1
@ThomasEding是的,太宽泛可能更合适,因为这显然是一个列表问题
Anko 2015年

Answers:


137

还有许多其他有用的数学形式,但绝对最低限度您需要了解以下内容:

  • 代数与算术

这些是非常基本的,但是如果您不知道这些,就连成为程序员(更不用说游戏开发者)也没有机会了。

游戏世界中的对象用矢量表示。向量表示诸如对象的位置,外观方向和速度之类的东西。向量数学计算(例如点积叉积和向量归一化)至关重要。

如何移动游戏对象?新手可能会说:

“我知道!我会做:” object.position.x++

不不不。您需要使用向量计算。对象需要一个可用于移动对象的位置,方向和加速度矢量。如果您是新手,就会陷入难以维护的混乱之中,如何使它向与世界XYZ轴不对齐的方向移动?

游戏使用四元数的主要原因是因为它们在空间效率上几乎与Euler角一样快,而又不受万向节锁定的影响。当任何欧拉角绕任何轴旋转90度时,云台锁定就会开始:您立即失去自由度。四元数通过添加第四维来解决此问题。如果卡在欧拉角上,则必须限制一个轴的旋转角度不得超过〜89度。

如果您要为游戏中的物理反应编写数学程序,那么参加物理课将不是一个坏主意。

您需要了解物理方程的原因:

  1. 使球弹起(请参阅:恢复原状)
  2. 使球朝“ x”牛顿力的方向运动
  3. 使某物具有或多或少的摩擦力,使其以不同的速度滑动
  4. 碰撞反应:当我在“这里”击中物体时,物体将向哪个方向旋转?

如果您使用物理引擎(或内置了物理引擎的游戏引擎),那么您对物理知识的了解就会很少。不过,知道何时需要弄脏手还是很不错的,因为物理引擎无法正常运行。


1
对于物理学,克里斯·赫克(Chris Hecker)关于刚体动力学(包括碰撞响应和复原)的文章非常出色
tenpn 2010年

25
您提到的是四元数,但没有提到转换矩阵??
安德鲁·罗素

8
“ Gimble [sic]锁定是一种效果,当您移动鼠标向下看时,它将在您直接向下看时停止……。”实际上,这通常是出于玩家的理智,与云台锁定无关。

4
四元数与万向节锁链接的频率令我感到惊讶。我编写的3D游戏都没有四元数,也从来没有万向节锁定问题。如果您真正了解3D数学并知道万向节锁实际上是什么,那么您就不会有这个问题。
Skizz 2010年

7
云台锁定实际上是由幼稚的欧拉角旋转(通常是泰特-布莱恩角:偏航,俯仰,横滚)引起的。诸如Axis-Angle之类的替代表示形式也可以用于防止其发生。但是,四元数具有易于插值的优点,因此通常首选四元数。
杰森·科扎克

51

我梦想着有一天,游戏开发就像艺术品一样受到数据驱动。我看不到它在地平线上的任何地方,因此现在知道一些数学似乎是必要的。

只要您可以运用数学,数学就像技术,越多越好。

这是我看到的重要性顺序。

  • 算术
  • 线性代数(具有几何解释)
  • 微积分(物理学)
  • 组合学(随机水平)
  • 概率(平衡)
  • 统计(贝叶斯尤其是AI)

我可以继续前进。了解的越多越好,但是学习大量的数学知识并不意味着您会做一个很棒的游戏,但是可以有所帮助。


4
微积分是一个广阔的领域。游戏开发可能只需要少量。
Noldorin

2
@Noldorin是的。在大多数情况下,了解导数,加速度,速度和位置之间的关系可能就足够了……但是微积分很棒。
乔纳森·费斯霍夫

由于相对较大的内存使用量,较差的可调试性和可预测性以及明确定义的问题空间,贝叶斯AI往往不适合游戏使用。具有巧妙的试探法的经典搜索的良好实现通常(但并非总是)是一种更好的工具。

1
对我而言,它不是我认为很重要的特定贝叶斯算法,而是理解ET Jaynes支持的推理过程。我认为贝叶斯推理在本质上不会太慢。
乔纳森·费斯霍夫

1
当您开发AI或只是开发管理/大亨游戏时,统计数据非常有用。另一方面,我完全不了解微积分。我认为,出于学习目的,统计学和概率本质上是同一件事,因为统计学领域源于对概率的研究。这是非常主观的。
Rushyo

25

勾股定理是一个非常基本的定理。也称为距离公式。

a ^ 2 + b ^ 2 = c ^ 2其中ab是直角三角形的边缘,c是斜边。这意味着为了找到向量的长度,您可以执行以下操作:

距离= sqrt(a ^ 2 + b ^ 2)

另一个有趣的注意事项是,如果您只是比较距离,则不必取平方根(这可能会比较昂贵)。这就是为什么大多数框架的向量具有“距离平方”或“长度平方”的原因。


1
我敢肯定,我之前已经在本网站的其他地方读过这篇文章:)
Ricket

当然,这篇帖子的灵感来自于该主题/评论。
四分

我在这里收到一些déjàvu ... :)
mmyers

2
更一般地,向量的长度是点积与其自身的平方根。所以,sqrt(V dot V)它的长度。因此,两点之间的距离是:sqrt((A-B) dot (A-B))
greyfade 2010年

也很大在TRIG身份sin²(X)+cos²的上下文中理解它(X)= 1

19
  • 3D和4D向量,以及W分量应设置为
  • 左手坐标系和右手坐标系,以及您的游戏是哪一个
  • 点积及其用途
  • 叉积及其用途
  • 矩阵,它们如何表示方向和位置以及如何将它们组合在一起
  • 四元数

即使您不是图形专家,您也将有80%的时间使用向量和向量数学。它们是我们有趣的肉酱的洋葱。


4
这不是一个坏列表,但我希望得到一个更具描述性的答案。即,点积公式是什么,含义是什么以及它如何有用。
Tetrad

3
@Tetrad维基百科没有给你吗?en.wikipedia.org/wiki/Dot_product#Definition
乔纳森·费斯霍夫

1
不专门针对游戏,不。
Tetrad

5
是的 它告诉您点积是角度的余弦。这就是您需要知道(并且可以知道)的全部内容,因为应用程序仍然取决于您要使用它的目的。面向AI?您需要角度,因此圆点是您的朋友。渲染光?您需要角度。可以说的是,它(在这种情况下为点积)定义了角度的余弦乘以向量a的长度乘以向量b的长度。那就是可以给予的知识。由于应用程序是无限的,因此无法确定要使用哪一部分以及如何使用。
卡伊,2010年


10

牢牢把握+-*,和/。没有它们,您将完全陷入困境。


12
我想我们都可以同意这不是问题的所在。(您也忘记了%)。
coderanger 2010年

2
其他答案得到投票为这个(基本算术)....
RCIX

7
不仅是基本的算术运算,还应该理解这些操作如何在二进制补码,定点和IEEE浮点环境中工作。如果不牢牢把握为什么0.1 * 3!= 0.3或-x可能不符合您的期望,您就会陷入困境。

1
@ user744我实际上被搞砸了,这是什么法术?
霓虹灯Warge'Jul

9

是的,游戏编程往往需要大量的数学运算。您需要什么数学取决于您所从事的工作。当然,就像所有编程一样,基本算术也是必须的。除此之外:

几何对于任何图形工作都至关重要。如果要在屏幕上显示事物,则需要了解坐标系。而且,如果您想沿基本方向以外的任何方向移动它们,那么您将完全迷路,而无需牢牢掌握正弦,余弦和向量(基本触发)。而且,如果您需要在3D模式下工作,则几何形状和Trig要求会变得更加复杂。

如果要建模任何种类的远程现实物理学,则需要进行微积分。(毕竟,这是促使牛顿发明微积分的原因。)

任何种类的概率计算都需要统计知识和概率论知识,才能获得理智的结果,而又不会出现大量的反复试验。

可能还有更多,但这就是我想到的事情。


我记得当我的弟弟尝试制作Bang-Bang游戏作为其高中VB班的一个项目时。他什么都解决了,除了他不知道如何根据角度和力量使炮弹成弧形飞行,因为他还没有参加过Trig 1。在我解释了基础知识之后,它就很好了。
梅森惠勒

弧线不需要Trig,只需使用即可s=u.t + a.t.t/2。您需要通过三角函数来获得初始速度(u)。
Skizz 2010年

为什么不更高?与我一起工作的程序员有一半不能在正弦余弦中使用正弦和余弦。
zaratustra 2010年

@Skizz:是的。您需要触发才能将角度和幂转换为初始向量。之后,您只需要一个动画循环和一个重力常数。
梅森惠勒2010年

9

至少您需要。

  • 代数
  • 基本几何
  • 基本三角学

您也将至少需要具备Vector运算的工作知识,并且您将想要知道Matrix是什么以及可以将其用于什么,尽管不一定严格需要这些细节。

如果您想进入图形编程,则需要掌握更多的数学知识,但是进行一般的游戏编程不必太费神。


9

二元十六进制编号系统,以及如何将它们转换为十进制数/从十进制数转换。

尽管您通常不需要与 原始二进制数,但是它们经常用于Flag变量,这些变量需要布尔逻辑和移位。

十六进制不是很重要(除非您要处理0xDEADBEEF),但是至少,您需要识别何时使用它们以及原因。


1
如果您无法阅读十六进制,则无法有效编程。C和C ++中的大多数按位常量将被指定为十六进制值。

我想你已经有了Booleanbinary混淆。不确定它们对于游戏编程是否绝对必要。
Skizz 2010年

@Skizz,要点-已修正。(还有一点要注意的是,它是一个Wiki-没有阻止您更改它的方法。:)
独眼巨人

如果您无法阅读十六进制,请使用工具为您转换。
Thomas Eding

6

没有提到计算机编程的基础数学吗?图论,数论,集合论和具体的数学,通常都集中在一起,成为大学中痛苦不堪的,称为“离散数学”的课程。

“愚蠢的技巧”可以节省各种程序时间(它们通常也等同于一些字符串技巧和set技巧),到处都使用图形类型和遍历(即使您只是选择STL容器),随着语言的发展,算法的复杂性是优化的关键。


5

我认为回报矩阵是一个非常必要的工具。当游戏达到一些有趣的零和公平竞争平衡时,它们通常会更有趣,并且收益矩阵可以帮助您量化复杂情况下的收益。我猜这篇Wikipedia文章和其他文章一样好,并且获得了基本的必要概念:http : //en.wikipedia.org/wiki/Normal-form_game


这对我来说似乎是不切实际的。您是否认为星际争霸或魔兽争霸3使用这种方法达到平衡?我不这么认为,我认为这是迭代和游戏测试以及不断修补的过程。
bobobobo

嗯,几乎可以肯定的是,最初的魔兽军团是经过修改的彼此的副本,这些副本可能是用旨在使它们总体上保持平衡的支付矩阵创建的。之后,他们可能只是简单地基于所学的东西来进行调整,但是由于涉及到三个不同的军队,并且又添加了星际争霸II单位时,他们可能不得不再次使用星际争霸来达到某种合理的平衡。显然,您并不仅仅是停留在模型上,游戏测试通常会显示紧急属性,但是回报矩阵是您最初建模复杂性的方式。
Kzqai 2013年

[需要引用]?
bobobobo

1
就是这样:amazon.com/Game-Architecture-Design-New-Edition/dp/0735713634/… 我希望能够在本书中搜索Amazon版本,因为这对于本网站的逐位引用可能是一件很棒的事情。尽管亚马逊的图书内搜索可能无法正常工作。无论如何,这就是他们以魔兽争霸为例来讨论收益矩阵的地方,而且管理复杂性的优势非常明显,这使我立即实现了转换。这不能保证暴雪会实际使用这种方法,但是他们是聪明的人,所以他们可能有数学上的解决方案……
Kzqai 2013年

...至少可以一目了然地了解平衡。显然,您也想为此添加测试。我实际上是根据一本较小的精简手册购买本书的,该手册包含与游戏相关的真棒内容,包括讨论收益矩阵,剪刀石头布的关系以及各种各样的好东西,但我对最终书感到失望本书是一本书,涉及C ++编程(这不是我的事)以及AAA标题管理问题。精简版手册中的所有内容都很棒。
2013年

4

了解点积:如果两个向量的方向大致相同(θ<90度),则点积为正,否则为负。只要有玩家在场(假设FOV为90度),就可以使用它进行测试。

并将2D游戏推广到更高的维度。(使用向量计算)

如果您可以自己实现3D引擎,那就太好了。


4

这取决于你在做什么

所有游戏程序员都应该至少知道高中代数。这意味着:

  • 良好的数字感
  • 熟悉基础数学(加,减,乘,除)
  • 三角函数(正弦和余弦)
  • 向量,向量之间的角度,点积,叉积

您的图形程序员必须知道:

  • 以上所有,以及
  • 矩阵代数(用于变换矩阵)
  • 多边形相交方法/射线多边形(参见实时碰撞检测之类的书

您的物理学程序员必须知道:

  • 以上所有和
  • 微分方程
  • 数值方法

3

除了正弦和余弦(我遇到的50%至75%的程序员都不知道如何使用)之外,还要学习神奇的反正切函数以及如何使用它来获取任何矢量的角度。


5
在大多数情况下,您atan2需要这样做,因为这可以自己处理象限。
CodesInChaos

0

我很惊讶没有人提到四元数。我没有使用不同引擎的丰富经验,但至少JME到处都使用它,我给人的印象是它们是一个非常重要的概念。


2
我提到了四元数
tenpn

啊,对不起,我错过了。
拉乌尔

3
对于在渲染引擎中编写低级动画代码的1%的游戏程序员来说,四元数是一个有用的工具。对于其他99%的游戏程序员来说,并不需要他们。
Skizz 2010年

-1

制作游戏是为了将“真实”生活带入虚拟现实。最好多了解现实世界/宇宙,而不要少:)。数学只是工具。如果您正在制定计划,那么您也必须花时间研究计划。

编辑:我看到了一些误解:) ..我认为您需要统治的一组数学习题取决于您要描述的具体事物。谁都不知道。更好的方法是做到这一点。并不是一开始就学习所有东西,而是学习一点点,使用,学习,使用等。然后,如果您有良好的计划,则可以在开发过程中做到。


1
俄罗斯方块中有多少真实生活?
tenpn 2010年

许多 :)。俄罗斯方块是在前提下进行逻辑思维的。像其他逻辑游戏一样。这是关于练习。更多的实践,更多的把握,您可以处理,并仍然从中获得乐趣。对我来说似乎是真实的生活:)...
samboush 2010年

3
当您未能公平地解决问题时,您就没有任何意义。
Heath Hunnicutt

@希思·洪尼库特,你是对的。
samboush

3
我真的很尊重那个回应。
Heath Hunnicutt 2010年

-2

简单的答案:很多!

详细答案:

在大多数情况下,算术,初等和线性代数都是Trig,如果您要制作3D游戏,则必须进行微积分和物理(物理需要微积分)!


3
你能澄清一下清单吗?您是在说“如果正在制作3D游戏时触发”还是“如果您正在制作3D游戏,一定是微积分”?
yoozer8 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.