【发布时间】:2011-11-15 07:44:51
【问题描述】:
我正在尝试为我开始编码的游戏做计划。 (非常开始)
我的问题是我希望所有游戏对象的加速/移动部分都基于加速力与阻力(因此导致终端速度作为可用速度的上限)
虽然我可以走另一条路,但如果可能的话,我宁愿不走。此外,(朋友)建议我可以使用物理库,但这似乎有点矫枉过正,此外,我想自己学习和理解这些概念 - 我总是觉得当我更好地理解自己的程序时做。
我正在制作一个 2D 游戏,并使用 Vector2 变量来表示位置、航向和推力(施加的加速力)。它是自上而下的,所以重力不是方程式的一部分。
在编写代码之前,我会在 Excel 中编写测试用例 - 这是我在将数学提交到代码之前检查数学的方式。而且我发现我对阻力方程的使用正在使有问题的对象帧率依赖! 具体来说,帧率越高,最终的终端速度就越低。
我一直在尝试根据需要修改方程式以考虑帧速率,但它让我望而却步。
如果您想使用与我相同的电子表格,you can download the spreadsheet here。
但您不必这样做 - 这是具体细节。
我理解的阻力方程是:
Drag = 0.5 * FluidDensity * Velocity * Velocity * DragCoefficient * IncidenceArea
使用凭空挑选的一些数字进行计算,如果流体密度为 0.233,阻力系数为 0.4,入射面积为 0.1,加速度为每秒 50 像素,那么会发生以下情况:
如果我计算出每 0.25 秒(每四分之一秒一次)以 1/4 的加速力(以匹配时间)施加加速度,那么我们会以大约每秒 39.3 像素的速度达到最终速度。
如果我每隔一秒计算一次加速度,我们会以大约每秒 53.6 像素的速度达到终端速度。
具体来说,每次我计算给定的 DeltaTime 时,结果速度都会计算为(代码来自我的头脑 - 不是来自 IDE - 如果其中有错误,请致歉):
//In globals / initialization:
Vector2 Position;
Vector2 Speed;
Vector2 ThrustForce;
float Density = 0.233f;
float DragCoefficient = 0.4f;
float IncidentalArea = 0.1f;
//In the update loop
//DeltaTime is a float based upon how much of a second passed
Vector2 AccelerationToApply = ThrustForce * DeltaTime;
Vector2 NewSpeed = Speed + AccelerationToApply;
Vector2 Drag = Speed * Speed * 0.5f * Density * DragCoefficient * IncidentalArea;
NewSpeed -= Drag;
Speed = NewSpeed;
这就是数学问题。问题来了:
这应该如何表达以使其与帧率无关?
【问题讨论】:
-
Drag 是一种类似于 ThrustForce 的力,但您不能将其乘以 DeltaTime。这闻起来像个虫子。
-
其实我也试过了(这是在 Excel 中进行前期工作的乐趣——我可以快速修改并查看结果),但结果仍然大不相同。
-
我整天都在玩 Excel,终于找到了正确的答案。您的答案实际上是解决方案的一半,因此将其作为答案提交,我会接受。同时,我将更新原始帖子并添加完整答案。
-
请不要将您的解决方案放入问题的正文中。创建并接受您自己的答案。
-
好的,没问题 - 我现在就这样做。
标签: c# xna xna-4.0 game-physics