# Java 3d Schwerkraft



## Runtime (3. Jan 2010)

Hallo,
ich möchte wissen, wie ich Schwerkraft in Java 3d bringen könnte.
Wäre echt toll wenn ihr keine Mathematische Formeln angibt, weil ich
zu schlecht in Mathe bin.


----------



## javimka (3. Jan 2010)

v = v0 + a*t
s = s0 + v0*t + a*t^2/2

a = Beschleunigung
s = Weg
s0 = Anfangsweg
v = Geschwindigkeit
v0 = Anfangsgeschwindingkeit
t = Zeit

s0 und v0 sind meistens 0.


----------



## Runtime (3. Jan 2010)

Kannst du mir das in Source code geben?


----------



## javimka (3. Jan 2010)

```
v = v0 + a*t
s = s0 + v0*t + a*t^2/2
```


----------



## Runtime (3. Jan 2010)

???:L
Könntest du mir irgend ein Beispiel machen mit einer Box oder so...


----------



## Noctarius (3. Jan 2010)

Du hast doch die Bedeutungen der Platzhalter schon da oben stehen. Brauchst doch nur noch Werte einsetzen? Oo


----------



## javimka (3. Jan 2010)

Runtime hat gesagt.:


> wie ich Schwerkraft in Java 3d bringen könnte.


Präzisier das doch mal bitte.

Wenn du ein Objekt zur Zeit 0 an irgendeiner Position hast und es fällt im freien Fall, dann weisst du mit obiger Formel, wie viel Weg sie in der Zeit t zurückgelegt hat. Sind ja nur ein paar algebraische Ausdrücke, aber ohne die kannst du keine Gravitation realisieren.


----------



## Developer_X (3. Jan 2010)

Schau mal, hier

```
//...
float x,y,z;
Transform3D aa;
TransformGroup a;
public BranchGroup createUniverse(BranchGroup bg)
{
// ... Licht an und so muss du können

Transform3D aa = new Transform3D();
aa.setTranslation(new Vector3f(x,y,z));
TransformGroup a = new TransformGroup(aa);
a.setCapabilities(TransformGroup.ALLOW_TRANSFORM_WRITE);
a.addChild(new Box(1,1,1));

}
```

So, dann hast du ja erstmal deine BranchGroup.
Danach kannst du nur in einer Hauptklasse, die den Componenten mit der Branchgroup und .... added, einen Thread einbauen.
Am besten in den Konstruktor ganz am Ende

```
int schleifen_dauer_milisekunden = 10;
float fall_pro_zehn_milisekunden = 0.005f;
int t = 0;

new Thread()
{
public void run()
{
while(true)
{
y -= (fall_pro_zehn_milisekunden * t/2);

aa.setTranslation(new Vector3f(x,y,z));
a.setTransform(aa);
try{
Thread.sleep(schleifen_dauer_milisekunden );
t += schleifen_dauer_milisekunden ;
}
catch(Exception e)
{
}

}
}
}.start();
```

Das ist net die richtige Formel, verursacht aber auch eine verschnellerung des falls, mithilfe
von t.

Ich hoffe das reicht dir, wenn nicht schreibe ich dir ne ganze Applikation, musste mir nur sagen.


----------



## Developer_X (3. Jan 2010)

```
package Excercise_02;

import java.awt.*;
import javax.media.j3d.*;
import javax.swing.JFrame;
import javax.vecmath.*;

import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;

@SuppressWarnings("serial")
public class Problem_3D extends JFrame
{
//	Attribute
	Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	
	int wait_time = 10;
	int t = 0;

	float beschleunigung = 0.002f;
	float abzug = 0.0001f;
	float x = 0,y = 8,z = -40;
	
	float grenze = -8;
	
	Transform3D a;
	TransformGroup A;
	
//	Konstruktor
	public Problem_3D()
	{
		setTitle("3D-Faszination-Gravitation");
		setSize(d.width/2,d.height/2);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout());
		
		GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

		Canvas3D canvas3D = new Canvas3D(config);
		add("Center", canvas3D);

		BranchGroup scene = createSceneGraph();
		SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
		simpleU.getViewingPlatform().setNominalViewingTransform();
		simpleU.addBranchGraph(scene);
		
		setVisible(true);
		
		new Thread()
		{
			public void run()
			{
				while(true)
				{
					abzug += beschleunigung;
					y -= abzug;
					
					if(y<grenze)
					{
						y += abzug;
					}
					a = new Transform3D();
					a.setTranslation(new Vector3f(x,y,z));
					A.setTransform(a);
					
					try{Thread.sleep(10); t+=10;}catch(Exception e){}
				}
			}
		}.start();
	}
	
	public BranchGroup createSceneGraph() 
	{
		BranchGroup X = new BranchGroup();

		a = new Transform3D();
		a.setTranslation(new Vector3f(x,y,z));
		A = new TransformGroup(a);
		A.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		A.addChild(new ColorCube(1));
		X.addChild(A);
		
		return X;
	} 
	
	public static void main(String[]args)
	{
		new Problem_3D();
	}
}
```

Hier mal ein Beispiel.
Sieht ja auch gut aus.


----------



## Landei (3. Jan 2010)

Wenn es nicht ein *ganz* einfaches Spiel ist, nimmt man für sowas gewöhnlich Physik-Engines (ODE, Nvidia PhysX ...)


----------



## Meldanor (4. Jan 2010)

Wenn du genau sein willst, dann errechnest du die Fallbeschleuning über:
Newtonsches Gravitationsgesetz ? Wikipedia
aus.
Die "Welt" zieht das "Objekt" an.
Du weist beiden ein Gewicht(Welt = Eventuel Gewicht der Erde, Objekt 100 kilo )  zu und errechnest über die gegebene Formel die Fallgeschwindigkeit.
Das kannst du dann in die obenen Formels einsetzen ^^


----------



## javimka (4. Jan 2010)

Zu beachten ist, dass eine Welt jedes Objekt (unabhängig seines Gewichtes) mit der gleichen Fallbeschleunigung beschleunigt. D.h. die Fall beschleunigung ist nun abhängig von der Welt.


----------

