8

我最近开始使用 jMonkey 引擎,非常好。但是我在尝试实现相对重力时遇到了困难。

我想让行星围绕彼此运行(不一定在完美的圆形轨道上,取决于速度)。所以每个对象都应该影响其他对象。

我现在拥有的:

关闭全球重力

bulletAppState.getPhysicsSpace().setGravity(Vector3f.ZERO);

初始化球体并添加到物理空间

Sphere sphere = new Sphere(50, 50, 5);
Geometry sun = new Geometry("Sun", sphere);

sun.setMaterial(stone_mat);
rootNode.attachChild(sun);
sun.setLocalTranslation(0, 0, 0);

sunPhysics = new RigidBodyControl((float) (50*Math.pow(10, 5)));
sun.addControl(sunPhysics);
bulletAppState.getPhysicsSpace().add(sunPhysics);

Geometry mercury = new Geometry("Mercury", sphere);

mercury.setMaterial(stone_mat);
rootNode.attachChild(mercury);
mercury.setLocalTranslation(15f, 0, 0);

mercuryPhysics = new RigidBodyControl((float) (5));
mercury.addControl(mercuryPhysics);
bulletAppState.getPhysicsSpace().add(mercuryPhysics);

我注意到 RigidBodyControl 类中有 setGravity 方法,但它只是设置方向。所以物体会一直走下去,直到它消失。

我真的很期待答案。

4

3 回答 3

3

万有引力定律说明了两个物体的质量在F = G (m1 * m2) / r^2哪里m1,是距离。是引力常数。m2rG

牛顿第二定律说F = m * a,如果我们把它们放在一起,有质量的物体会受到来自有质量物体的引力m1的加速度。a = G * m2 / r^2m2

现在,您需要做的是:在模拟的每一步中,对于每个物体,将每个物体的as 相加,并将该加速度应用于物体的速度。

a(body1) = G * sum[ mass(body2) / dist(body1, body2)^2 , for each body2 ]
于 2012-09-14T10:39:23.173 回答
1

子弹物理学中的重力是所有物体的一个方向。

您应该像以前一样将重力设置为 0,并在每个模拟步骤后使用以下公式对所有对象施加力

F = m * a

F - force
m - objects mass
a - acceleration 

地球上的常规加速度是g == 9.8

在太空中,加速度可能都取决于与行星或行星的距离。

如果您喜欢模拟《愤怒的小鸟太空》之类的游戏,那么您应该考虑阅读有关该游戏中重力的文章 http://www.wired.com/wiredscience/2012/03/the-gravitational-force-in-angry-birds-space /

于 2012-09-12T11:33:34.037 回答
0

如果您想要稳定的系统,请不要使用模拟物理。(但如果系统有足够多的重要实体,没有人知道它应该如何表现,所以没关系)。

对于像太阳系这样的东西,我会对行星使用运动学模式(自己移动它们),而对于船舶、小行星等则使用力。(除非你在太阳系做台球)

于 2012-09-14T10:00:56.833 回答