2012-09-11 21 views
8

Ho iniziato a utilizzare recentemente il motore jMonkey, che è molto bello. Ma mi sono bloccato cercando di implementare la gravità relativa.Gravità relativa

Voglio rendere i pianeti in orbita attorno a loro (non necessariamente in orbita perfettamente circolare, dipende dalla velocità). Quindi ogni oggetto dovrebbe influenzare altri oggetti.

Quello che ho in questo momento:

spegnendo gravità globale

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

inizializzazione sfere e l'aggiunta di Fisica dello Spazio

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); 

ho notato che non c'è metodo setGravity nella classe RigidBodyControl, ma imposta solo la direzione. Quindi l'oggetto va in quel modo finché non scompare.

Non vedo l'ora di ricevere risposte.

risposta

1

La gravità in bulletphysics è una direzione per tutti gli oggetti.

È necessario impostare la gravità per 0 come avete fatto e applicare la forza anche tutti gli oggetti dopo ogni passo di simulazione utilizzando seguente formula

F = m * a 

F - force 
m - objects mass 
a - acceleration 

accelerazione regolare sulla terra è g == 9.8

In accelerazione spazio può ogni dipendono distanza dal pianeta o dai pianeti.

Se ti piace di simulare gioco come Angry Birds Space allora si dovrebbe prendere in considerazione la lettura di un articolo sulla gravità in quella partita http://www.wired.com/wiredscience/2012/03/the-gravitational-force-in-angry-birds-space/

+0

È possibile applicare la forza con metodo applyCentralForce – Max

+0

Grazie, ho pensato che ci potrebbe essere il modo "più semplice" per attuare tale.Ma nessun problema, proverò come hai suggerito :) –

0

Se vuoi sistema stabile, non utilizzare la fisica simulata. (Ma se il sistema ha abbastanza corpi significativi, nessuno sa come dovrebbe comportarsi, quindi non importa).

Per cose come il sistema solare, userei la modalità cinematica per i pianeti (spostarli da soli) e per le navi, gli asteroidi ecc. Usare le forze. (A meno che non si fanno biliardo nel sistema solare)

3

La legge di gravitazione dice F = G (m1 * m2)/r^2 dove m1 e m2 sono le masse dei due corpi, e r è la distanza. G è la costante gravitazionale.

secondo la legge di Newton dice F = m * a, quindi se li mettiamo insieme, il corpo di massa m1 subirebbe un'accelerazione a = G * m2/r^2 dalla forza gravitazionale del corpo di massa m2.

Ora, ciò che dovresti fare è: in ogni fase della simulazione, per ogni corpo, somma gli a s per ogni altro corpo e applica tale accelerazione alla velocità del corpo.

a(body1) = G * sum[ mass(body2)/dist(body1, body2)^2 , for each body2 ]