超越“新手”游戏项目


22

我读这个答案对数学的类型游戏开发者应该知道,这部分真正站出来为我说:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

我就是这么想的,所以我想这表明了我的技能水平。至少对于我过去制作的2D横向滚动,街机风格的游戏,这就是我所需要的。那和一点三角学。

实际上,在阅读该文章之前,我并没有使用太多线性代数,甚至没有听说过四元数。是因为这些数学在您使用3D之前不会出现,还是因为我的2D游戏相当简单,所以我摆脱了幼稚的实现。

后续问题:如果我想熟悉那种数学,应该从事哪种类型的项目?IE:编写游戏引擎,开发3D游戏等。


1
khanacademy.org非常适合学习初学者和高级数学。加上有成就!没有什么博弈论能使任何无聊的学术界活下去。
deceleratedcaviar

Answers:


16

真正的诀窍是高中水平的科学。你应该做的。如果您没有快速进行Google搜索,则会使您入门。为了说明您如何避免“新手”思维,请以登月器为例。

阅读完后,[change in position] = [velocity] * [time passed]很明显需要跟踪这些变量:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

接下来,您只需将速度应用于每一帧的位置:

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

现在我们想改变每帧的速度,以便增加重力。根据完全相同的来源[change in velocity] = [acceleration] * [time passed]。因此,我们可以应用完全相同的原理:

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

现在,您需要让玩家控制自己的飞船的方法。通过阅读更多有关基本物理的知识,您将了解到运动是力的结果-我找不到来源,但[change in acceleration] = ([force] / [mass]) * time据我所知。因此,当玩家按下某个键时,您只需将fxfy变量设置为某种值,并在更新期间应用等式。

最终,您需要考虑游戏中对象周围的物理现象,而不是试图使它们以您认为的方式运动,而是查找方程式

未来的注意事项:请记住,这绝对不是进行物理学的最佳方法(这被称为Euler积分,并且可能在低帧频下导致某些奇怪的情况)-您需要研究其他的做事方法(该文章有不错的基础知识文章)。但是,现在就坚持使用Euler Integration,因为这意味着您正在尝试少学习一件事。

哪些游戏会教您如何正确地思考?

您将如何测试自己是否正确,以正确的心态做事?Sleep(10 milliseconds)在游戏循环中插入一个,所有内容仍应移动并以与完整帧速率相同的方式做出反应。

最后,请远离3D(并避免使用四元数和矩阵),直到您具有使2D游戏正常工作的大量经验为止。我冒昧地说,相当多的游戏开发人员实际上并不知道四元数或矩阵的工作原理,而只是知道如何使用它们,以后再使用它们(或者永远不会,二维游戏很有趣,而且可能相当有趣)。成功)。您实际上不需要了解线性代数等等就可以在基本级别上做到这一点(但这确实有帮助,因此,如果可以的话,上一些夜校)。

最后的好处:我的美术老师经常告诉我的一件事是:“不要画出你看到的东西,不要画出你看到的东西”。同样的事情在这里适用于“不要建模您认为发生的事情(object.position++),建模发生的事情(`object.position + =速度*时间)”-至少要达到合理的极限(您不是在建模一个完美准确的系统,而是很好的模仿)。


我喜欢您插入人工滞后进行测试的想法。此外,地球的引力是9.8,而不是9.1
史蒂夫·史蒂夫(Steve)

除非您要编写实际的模拟,否则请小心“不要为您想到的事情建模,而是为发生的事情建模”。根据您的项目的规模进行缩放。有时,“您认为发生了什么”对您的设计是一个很好的答案。
chaosTechnician 2011年

@chaosTechnician在此级别上是“您认为发生了什么” object.position++。我会澄清答案。
乔纳森·迪金森

-1为 instead of trying to make them move in the way you would think, rather look up the equation。这是关于理解方程式,而不是查找它们。最重要的是让游戏变得有趣,谁知道呢,也许您会发现一些可变加速度使重力变得更有趣。但是,如果您不理解方程式,将很难推理该怎么做。
BlueRaja-Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft正是我向他解释的内容:首先不了解方程式意味着您永远无法理解它-理解它们的唯一方法是在实际情况下使用它们。
乔纳森·迪金森

3

我认为您所链接的答案的某些部分在他们的演讲中有点精英。夸大矢量数学的优点,然后说一个对象需要一个位置,方向和加速度是不一致的,因为它实际上只是归结为类似object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime-基本上与没什么不同object.position.x++。四元数是表示旋转的多种方式之一。我喜欢它们,但是它们对于理解3D旋转并不是必不可少的。尽管许多四元数用户将暗示,但它们并不是旋转数学的圣杯。

线性代数的原理存在于简单的2D运动,旋转等中,但是由于只有二维,数学更简单。 这是一个例子

有很多方法可以学习/提高线性代数的知识:

  1. 我曾考虑过学习线性代数课程,但我的课程负担已经很重,因此我无法证明额外的工作合理。
  2. 当我学习了一系列游戏引擎编程课程时,我对线性代数的理解变得更加重要。对我而言,向量,矩阵等的使用(通常而言)在引擎方面比在游戏方面更为普遍。当然,这并不是说我没有在游戏代码中使用矩阵-我只是不像在引擎代码中那样频繁地使用它们。ymmv
  3. 另外,还有很多书籍可以帮助您理解数学知识。我喜欢这本书的标题为“游戏的3D数学”的一章。

最后,如果您的游戏设计不要求复杂的数学运算,请不要使用它。:)但是,当然,不要让这阻止您去研究一款可以玩的游戏。


0

用于2D的四元数将完全被淘汰,更不用说计算方式也太昂贵了。位图旋转(2D)由许多平台/库隐式处理,因为它是编写任何应用程序的基础,即使在没有应用程序的情况下,2D位图的旋转也不过是简单的触发而已。在3D模式下,对于普通人来说,事情变得不那么直观了,除非当然要说的是,人们长大了应该骑自行车去写3D代码。

线性代数适用于2D,就像适用于3D一样,即使您只是初中数学,它也应该是您熟悉的东西。如果您曾经做过直线相交,或者在直线上进行了周期绘制(积分),那么您已经使用了线性代数。

学习3D数学通常始于在3D空间中放置一个简单的对象(例如立方体),并实现一个可移动的相机,该相机可以从不同的角度查看该对象,并且该角度可以从正交角度开始,以使事情变得更加简单。这是关于将点投影到代表您的屏幕的3D平面上的(此处为公式,除y外,还应将其扩展到x和z轴)。确实,这是编写任何3D引擎的开始,无论您的经验水平如何。Flash和Processing.js是轻松实现此类原型的两种好方法。


0

您是对的,线性代数和更复杂的数学通常涉及3D图形和3D空间。但是在2D游戏中还可以做更多的数学运算。物理数学可能会变得非常顽固,如果您考虑柔体物理和B样条动力学的话,它会变得更加复杂(并且请记住2D)

尝试构建或分解一个物理库,该库将涵盖常见2D形状的碰撞处理和响应。线性代数对于计算碰撞的轨迹矢量非常有用。点积与三角学中使用的单位圆非常相关。但是,将刚体物理应用于3D时,其复杂性呈指数级增长。

3D图形使您对矩阵计算,四元数,线性代数和一些应用的演算有了更深入的了解。您可能要了解的第一件事是使用矩阵在3D空间中移动和操纵对象。


0

如果您正在编写2D游戏,则可能已经在使用线性代数..您就是不知道!正式学习至少有关向量的基础知识非常容易,但是在简化对复杂运动的思考方面还有很长的路要走。

例如,我们在这里有很多问题,要使用什么方程式来模拟弯曲的运动,例如用大炮发射的炮弹或制导导弹。但是,如果您了解向量,则唯一需要的“等式”就是将两个向量相加。不仅如此,添加空气阻力或摩擦之类的东西变得非常简单-只需计算阻力矢量,并将其添加到速度即可。快点!

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.