在XNA中计算重力

3

好的,我正在尝试为我的3D XNA游戏创建自己的物理引擎,并且我在计算重力时遇到了麻烦。

XNA的游戏计时器每16毫秒发生一次,因此经过一些计算,并使用9.81米/秒作为我的重力速度,您可以看到应该通过以下方式增加具有重力的对象的速度:

0.15696 米/ 16 毫秒
- 基本上每个更新调用都应将对象增加 0.15696 米

问题是,如何将 0.15696 米转换为像素。 显然,如果我只使用1:1的比例关系,那么物体每秒只会移动9.81个像素。 这并不能真正模拟重力:P 是否有人有好主意,可以确定我应该将对象移动多少像素?

感谢所有帮助!


你为什么要创建自己的框架? - Tomas McGuinness
只是为了好玩 :) 基本上只是想在Xna中体验物理效果。 - cush
我正在尝试为一个3D XNA游戏创建自己的物理引擎。 - cush
7
虽然游戏开发中的物理引擎只是近似于真实物理,但你应该尽力提高引擎的准确性... 游戏时钟并不是每16毫秒就会发生一次。如果你以60FPS运行,它大约每16.666667秒发生一次,并且有时会因工作负荷而错过一拍... 这可能在整合过程中造成很大的差异。使用gameTime.ElapsedGameTime.TotalSeconds而不仅仅是16,以尽可能提供最佳精度给引擎。 - Steve H
2个回答

5
尽管2D游戏开发更加像素为中心,但3D游戏开发在这种情况下并不关注像素,而是单位。单位大小完全是任意的。
通常,您有一个速度向量,其大小等于对象每秒移动的米数(或英尺数等)。这样,通过将此速度*自上一帧以来经过的时间(16.6666毫秒)添加到位置中,每帧更新位置。重力加速度以相同的方式添加到速度向量中:
Vector3 gravity = Vector3.Down * 9.81f;


//in the update loop
float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;//0.01666667 (or 16.67 ms) @ 60FPS
velocity += gravity * elapsed; 
position += velocity * elapsed;

在这个例子中,我随意地规定1个xna单位等于1米。

1

你只需要弄清楚你的屏幕代表了多大的“区域”,然后进行简单的缩放。如果你有一个卫星绕地球运行的二维表示,那么你的“Y”像素代表地面到卫星的距离(大约35,000米)。

使用经典物理学方程(http://en.wikipedia.org/wiki/List_of_equations_in_classical_mechanics),然后将真实尺寸缩放到你的屏幕上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接