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

重力の法則は、2つの物体の質量がF = G (m1 * m2) / r^2どこm1にあるかを示し、距離です。は重力定数です。m2rG

ニュートンの第2法則によるとF = m * a、これらを組み合わせると、質量のある物体は、質量のある物体からの引力によるm1加速を経験します。a = G * m2 / r^2m2

ここで、実行する必要があるのは次のとおりです。シミュレーションの各ステップで、各ボディaについて、他の各ボディのsを合計し、その加速度をボディの速度に適用します。

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

宇宙では、加速はすべて惑星からの距離に依存する可能性があります。

Angry Birds Spaceのようなゲームをシミュレートしたい場合は、そのゲームの重力に関する記事を読むことを検討して ください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 に答える