Simulation einer Magnetischen Flasche

frostbyte

Aktives Mitglied
Hallo,

Ich möchte eine Simulation einer Magnetischen Flasche bauen. Ein ähnliches Programm habe ich schon in 2D geschrieben, jedoch ist dort das Magnetfeld homogen.

Jetzt habe ich zwei Fragen: Wie modelliere ich ein inhomogenes Magnetfeld in Java? Die Kraft, die auf das Elektron wirkt ist das Vektorprodukt der Geschwindigkeit v sowie des Magnetfeldes B, also F = v x B. Ist es dann sinnvoll ein 3D Array mit Vektoren zu erzeugen, so dass ich an jedem Punkt, wo sich das Teilchen aufhält, einfach den Kraftvektor ausrechnen kann?

Und dann noch eine Frage:

Das ganze soll eigentlich Kugelsymmetrisch (siehe Magnetfeld hier) werden, da das Erdmagnetfeld dargestellt werden soll. Als Näherung würde ich es so darstellen.

Intern muss das ganze auf jeden Fall in 3D berechnet werden, das ist aber von der Mathematik her kein Problem. Bei der Anzeige weiß ich aber gar nicht, wie ich das machen soll. Bisher habe ich nur 2D Programme geschrieben, in dem ich die paintComponent(Graphics g) im JPanel überschrieben habe und dort mit g.drawLine() gebastelt habe.

Wie schwer ist es, das ganze in 3D darzustellen und am Besten so, dass man die ganze Szene mit der Maus um den Mittelpunkt drehen kann?

Vielen Dank für Hinweise!

Iteranium
 

Steev

Bekanntes Mitglied
Für 3d benutzt man in der Regel entweder Java3d, JOGL oder LWJGL. Auf jedem Fall müssen externe Bibliotheken eingebunden werden. Auser natürlich, man schreibt sich die Projektion selbst. Je nachdem, wie komplex du das gestalten willst, kann es schon recht komplex werden. Wie gesagt, es kommt dabei darauf an, wie komplex du das darstellen willst. Einige Primitiven in einer 3d-Szene darzustellen ist nicht so das Problem.

Bei dem Magnetfeld gibt es ja verschiedene Möglichkeiten. Ich bin eigendlich nicht dafür, dass man einen 3d-Array mit Kraftvektoren verwendet, da diese Variante dazu noch Recht ungenau ist... Mir fällt allerdings auf Anhieb nicht ein, wie man es besser machen könnte :) ...
 

Illuvatar

Top Contributor
Zur Modellierung: Was spricht denn dagegen, dass du dir eben die Funktion überlegst die das Feld berechnet, und dann hast du zB ne Klasse
Java:
public class MagneticField
{
  public Vector at (Vector x)
  {
    // berechnen
  }
  // andere methoden
}
Und dann halt wenn du die Kraft brauchst:
Java:
Vector B = magneticField.at(currentLocation);
Vector F = velocity.crossProduct(B).multiply(charge);

Zur Anzeige hat steev eigentlich schon alles gesagt ;) Wenn du in der Materie bist, ist eine solche einfache Animation nicht schwierig. Wenn du dich erst reinarbeiten musst, dauert es natürlich bisschen.
In dem Fall würd ich übrigens sogar Java3D für ziemlich geeignet halten.
 

frostbyte

Aktives Mitglied
Natürlich, das Magnetfeld sollte spontan berechnet werden, das ist dann viel genauer und schont den Speicher. Vielen Dank für den Anstoß!

Ich war schon dabei mich ins Unglück zu stürzen …

Java:
bfeld = new Vektor[10][10][20];

for (int x = 0; x < bfeld.length; x++) {
	for (int y = 0; y < bfeld[x].length; y++) {
		for (int z = 0; z < bfeld[x][y].length; z++) {
			// Berechne den Vektor an dem Punkt (X|Y|Z)
			
		}
	}
}

Was 3D betrifft bin ich definitiv nicht in der Materie, dann schreibe ich fürs erste einfach nur eine Z- und eine X-Projektion mit meiner bewährten Technik des JPanel.paintComponent() und kann dann, wenn das Programm an sich läuft mich mal in 3D einarbeiten.
 

frostbyte

Aktives Mitglied
Ich habe jetzt eine Funktion für das Magnetfeld, die liefert in der X-Y Ebene auch brav immer nur B(0, 0, 1), also einfach ein homogenes Magnetfeld nach oben. Das Teilchen bewegt sich momentan auch nur in der X-Y Ebene.

Aber irgendwie wird das Teilchen immer schneller, obwohl die einzige Kraft senkrecht darauf wirkt. Bei einem sehr ähnlichen Programm hatte das auch super geklappt …

Mein Teilchen:
Java:
public abstract class Teilchen {
	// Die Position des Teilchens
	Vektor position;
	
	// Die Geschwindigkeit des Teilchens
	Vektor v;
	
	// Farbe in der Anzeige
	Color farbe;
	
	// Materialkonstanten
	double masse;
	double ladung;
	
	void bewegen () {
		// Kraft bestimmen
		Vektor f = v.kreuzprodukt(MagnetischeFlascheSimulator.bfeld(position)).skalarmul(ladung);
		
		// Beschleunigung (a = F/m) auf die Geschwindigkeit addieren
		v = v.add(f.skalarmul(1/masse));
		
		// Bewegung aufrechnen
		position = position.add(v);
	}

}


Mein Vektor:
Java:
public class Vektor {
	double x, y, z;
	
	public Vektor kreuzprodukt (Vektor b) {
		Vektor c = new Vektor();
		
		c.x = y*b.z - z*b.y;
		c.y = z*b.x - x*b.z;
		c.z = x*b.y - y*b.x;
		
		return c;
	}
	
	public Vektor add (Vektor b) {
		Vektor c = new Vektor();
		
		c.x = x + b.x;
		c.y = y + b.y;
		c.z = z + b.z;
		
		return c;
	}
	
	public Vektor skalarmul (double b) {
		Vektor c = new Vektor();
		
		c.x = x * b;
		c.y = y * b;
		c.z = z * b;
		
		return c;
	}

}

MagnetischeFlascheSimulator.bfeld(position) ist an jeder Position der X-Y Ebene (0, 0, 1), das habe ich überprüft.

Schaut man sich die Z-Projektion an, wandert das Teilchen in einer Spirale ab …


Was ist da los?
 

0x7F800000

Top Contributor
I
Java:
		// Beschleunigung (a = F/m) auf die Geschwindigkeit addieren
		v = v.add(f.skalarmul(1/masse));
		
		// Bewegung aufrechnen
		position = position.add(v);
Und dir ist nicht aufgefallen, dass es zumindest mal von den einheiten überhaupt nicht passt?
Man kann doch nicht einfach beschleunigungen mit geschwindigkeiten zusammenaddieren, und das ganze dann wieder als geschwindigkeit bezeichnen.

Wenn du das in ganz kleine Zeitschritte unterteilen willst, und dann so tust, als ob die beschleunigung während dieser zeitschritte annähernd konstant ist, dann würde das etwa so aussehen:
Java:
public void move(double dt){
   a = F(x,v)/m;
   x = x+v*dt+(a*dt^2)/2 
   v = v+a*dt
}
wenn du das "dt", also diese kleine Zeitschritte weglässt, dann rechnest du so, als ob du in 1-sekunden schritten iterieren würdest (vorausgesetzt alles andere ist in SI), und das könnte unter umständen etwas grob werden, auch nichtrelativistisch: wenn man unter 10%c ist, kann man auch klassisch rechnen. In einer Sekunde ist da das teilchen schon drei tausend Kilometer weiter, und das Magnetfeld sieht dort evtl. merkbar anders aus. Dann benehmen sich die Teilchen so, als ob sie sich dauernd verlustfrei hin und her beamen würden. Insbesondere kann es dadurch dazu kommen, dass beispielsweise die Energierhaltung nicht mal annähernd gilt, solche Systeme fabrizieren dann nach kürzester zeit totalen Schrott.
=> dt runtersetzen
=> evtl. ein besseres Verfahren anwenden ( -> Runge Kutta)
 
Zuletzt bearbeitet:

frostbyte

Aktives Mitglied
Die Einheiten stimmen nicht, da das dt=1 war und von daher nicht explizit hingeschrieben worden ist.

Ich habe dt jetzt mal auf 1/1000 gesetzt, jetzt wird das ganze deutlich besser, die Beschleunigung war bei 1/100 minimal, bei 1/1000 sollte es nicht mehr auffallen.

Danke für den Tipp, schließlich müsste man eigentlich das Integral bilden, und nicht einfach nur grob iterieren. Jetzt habe ich eine ausreichend genaue Näherung.
 

frostbyte

Aktives Mitglied
So, jetzt versuche ich mich an einer 3D Darstellung nach der Tutorial-Zusammenschneiden-Methode.

Java:
Canvas3D canvas = new Canvas3D(config); 
SimpleUniverse universe = new SimpleUniverse(canvas);
BranchGroup group = new BranchGroup();

tgalles = new TransformGroup();

tgalles.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
tgalles.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );


Sphere erde = new Sphere((float)VanAllenGuertel.ERDRADIUS);

tgalles.addChild(erde);

for (Teilchen t : VanAllenGuertel.teilchen) {
	tgalles.addChild(t.tg);
}

group.addChild(tgalles);

BoundingSphere bounds = new BoundingSphere( new Point3d(0.0,0.0,0.0), 100.0 );

universe.getViewingPlatform().setNominalViewingTransform();

universe.addBranchGraph(group);

Die Teilchen haben jeweils eine Sphere und eine TransformationGroup:

Java:
public abstract class Teilchen {


	TransformGroup tg = new TransformGroup();
	Transform3D transform = new Transform3D();
	Sphere sphere = new Sphere(0.05f);
	Vector3f position3f;
	
	public Teilchen () {
		position3f = new Vector3f();
	
		tg.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE );
		tg.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
		tg.addChild(sphere);
	}


	void bewegen () {
		for (int i = 0; i < iter/4; i++) {
			// ... Position in Vektor "position" schreiben ...

			position3f = new Vector3f((float)position.x, (float)position.y, (float)position.z);

			transform.setTranslation(position3f);

			tg.setTransform(transform);
		}
	}
}

Die Kugeln kreisen jetzt auch wunderbar hin und her, aber wenn ich eine weitere hinzufügen möchte mit:

Java:
Teilchen t = new Elektron()

VanAllenGuertel.frame3d.tgalles.addChild(t.tg);

Dann kommt
Code:
Exception in thread "Timer-0" javax.media.j3d.RestrictedAccessException: Group: only a BranchGroup node may be added
	at javax.media.j3d.Group.addChild(Group.java:260)
	at erdmagnetfeld.TeilchenBeweger.run(TeilchenBeweger.java:42)

Ich mache doch letztlich nichts anderes, als in der Methode, wo alle Teilchen in die 3D Welt hinzugefügt werden, warum ist es jetzt ein Problem von außerhalb noch welche hinzuzufügen?
 

Illuvatar

Top Contributor
Wenn der SceneGraph schon live ist, darfst du nur noch BranchGroups hinzufügen.
Das ist aber kein Problem, einfach so in der Art:
Java:
BranchGroup bg = new BranchGroup();
bg.addChild(t.tg);
VanAllenGuertel.frame3d.tgalles.addChild(t.tg);
 

frostbyte

Aktives Mitglied
Ich musste den entsprechenden Knoten im Baum noch sagen, dass man sie verändern darf. Jetzt klappt das alles.

Und inzwischen habe ich das Licht auch mit in den Baum eingehängt, jetzt dreht sich das Licht mit, man dreht nicht mehr die Erde unter einer Lampe, sondern jetzt eher das ganze Sonnensystem. Wunderbar.


Jetzt würde ich gerne noch die Magnetfeldlinien da reinpacken, ich kann nacheinander einen Haufen 3D Punkte ausrechnen, jedoch weiß ich nicht, wie ich diese dann als feine Linie darstelle … Wie mache ich das am Besten?
 

Illuvatar

Top Contributor
Vermutlich am besten ein Shape3D mit einem LineStripArray.

Edit: das hier erklärt eigentlich ganz gut die Verwendung. Wenn du es farbig haben willst: entweder über die Appearance des Shape3D, oder punktweise im LineStripArray (im Konstruktor das Flag COLOR_3 setzen, und dann funktioniert das Setzen der Farben für die einzelnen Punkte wie das Setzen der Koordinaten).
 
Zuletzt bearbeitet:

frostbyte

Aktives Mitglied
Kann man die Linien denn auch noch so beleuchten, die die Kugeln? Die sind bisher aus jedem Winkel immer die gleiche Farbe.

Auf die Erdkugel habe ich jetzt eine Textur gesetzt:

Java:
Appearance ap = new Appearance();

TextureLoader loader = new TextureLoader("bin/erde.jpg", "RGB", new Container());
Texture texture = loader.getTexture();
texture.setBoundaryModeS(Texture.WRAP);
texture.setBoundaryModeT(Texture.WRAP);
texture.setBoundaryColor( new Color4f( 0.0f, 1.0f, 0.0f, 0.0f ) );

int primflags = Primitive.GENERATE_NORMALS + Primitive.GENERATE_TEXTURE_COORDS; 
		
TransformGroup erdeGruppe = new TransformGroup();
Transform3D erdeTransform = new Transform3D();
erdeTransform.setRotation(new AxisAngle4d(1, 0, 0, Math.PI/2));
erdeGruppe.setTransform(erdeTransform);

Sphere erde = new Sphere((float)VanAllenGuertel.ERDRADIUS, primflags, ap);

erdeGruppe.addChild(erde);


// Set up the texture attributes
TextureAttributes texAttr = new TextureAttributes();
texAttr.setTextureMode(TextureAttributes.REPLACE);
ap.setTexture(texture);
ap.setTextureAttributes(texAttr);

erde.setAppearance(ap);

tgalles.addChild(erdeGruppe);

Jedoch sieht man die Textur auch, wenn die Erde gar nicht beleuchtet wird, die sollte dann schwarz sein. Wie stelle ich das dann an?
 

frostbyte

Aktives Mitglied
Ich bin jetzt auf ein ganz anderes Problem gestoßen:

Auf meine Mac mit Eclipse, auf dem ich das Programm entwickelt habe, klappt das Programm super. Auch auf einem anderen Mac. Jedoch habe ich es jetzt unter Windows aufrufen wollen, da meckerte der, dass er die Klasse "Canvas3D" nicht finden kann.

Muss ich die noch in meinem .jar Archiv mitliefern? Und woher bekomme ich ein Java3D Paket, das plattformunabhängig ist?
 

Illuvatar

Top Contributor
Also, wenn Canvas3D nicht gefunden wird ist vermutlich einfach kein Java3D installiert, was anderes kann ich mir eigentlich nicht vorstellen...
Und Java3D ist eben per se etwas plattformabhängiges, da es auf plattformspezifische Funktionen zurückgreift um das 3D darzustellen (auch wenn es normalerweise immer auf OGL rausläuft). Die Frage nach einem plattformunabhängigen Java3D ist meiner Meinung nach ein bisschen wie die Frage nach einer plattformunabhängigen JVM ;)

Das mit der Textur weiß ich grad nicht auswendig, da müsste ich mit rumspielen ;) Schau doch einfach mal die ganzen Parameter von den ColoringAttributes, den TextureAttributes, der Texture und vielleicht dem Material an.

Die Linien mit dem LineStripArray wird man eher nicht beleuchten können: Das Problem ist hier, dass es bei einer unendlich dünnen Linie nicht möglich ist, einen Normalenvektor zu definieren, und dann kann man auch keine Beleuchtungseffekte machen. Dafür müsstest du soweit ich weiß die Linie aus echten Polygonen zusammensetzen, möglicherweise aus Cylinder-Objekten.
 

guni

Bekanntes Mitglied
wow. interessantes programm.
ich schließe mich Illuvatar an. Bin zwar kein Physikstudent aber es wäre ein netter Einstieg in Java3d - also wenn's geht: bitte uppen ;-)

thx. guni
 

frostbyte

Aktives Mitglied
Hier erstmal die Programme:
Magnetische Flasche
Van-Allen-Gürtel

Dass man Linien nicht beleuchten kann erscheint logisch. Jedoch würde ich annehmen, dass man eine Linie nicht sehen kann, wenn man sie ausschließlich im Gegenlicht betrachtet, dann nur noch als Schatten. Aber okay, das kann ich mit Leben.

Mit den Texturen werde ich dann mal ein wenig herumspielen, vielleicht bekomme ich das noch hin.


Aber wenn Java3D nicht plattformunabhängig ist, bedeutet das, dass also jeder, der das Programm unter Windows oder Linux benutzen möchte erst Java3D installieren muss? Das wäre mir doch etwas unangenehm, weil die Programme direkt laufen sollten …
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Gas Molekül Simulation Spiele- und Multimedia-Programmierung 2
Furtano Vektoren für Bewegung für eine 2D-Simulation Spiele- und Multimedia-Programmierung 3
N Simulation Spiele- und Multimedia-Programmierung 6
J Simulation mit vielen Objekten: Datenbank? Spiele- und Multimedia-Programmierung 6
S Simulation in der Art eines Schachbrett Spiele- und Multimedia-Programmierung 2
YangLee Ausgabe von einer Bewegung bei mehrzeiligen Strings Spiele- und Multimedia-Programmierung 1
E relevanter bereich einer isometrischen karte zeichnen (AffineTransform) Spiele- und Multimedia-Programmierung 0
M Audio Track einer Musik CD abspielen mittels vlcj-Bibliothek Spiele- und Multimedia-Programmierung 0
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
D Programmierung einer Tor-Anzeige Spiele- und Multimedia-Programmierung 8
C Optimale Wegberechnung einer KI Spiele- und Multimedia-Programmierung 6
T Pong Hilfe bei einer Website Spiele- und Multimedia-Programmierung 4
R Einfärben von Gemeinden auf einer Karte Spiele- und Multimedia-Programmierung 14
S ECS: "deep copy" einer Entity-Vorlage Spiele- und Multimedia-Programmierung 9
R Aufruf einer render-Methode Spiele- und Multimedia-Programmierung 12
E A-Stern Algorithmus Problem und Implementierung einer Map Spiele- und Multimedia-Programmierung 6
J Frage zum Einlesen einer .wav in ein byte Array Spiele- und Multimedia-Programmierung 3
J Spielfiguren laufen lassen auf einer html Tabelle mit Hilfe von Servlets Spiele- und Multimedia-Programmierung 2
T Alle Referenzen zu einer Klasse aus Java Bytecode ersetzt, JVM sucht trotzdem diese Klasse Spiele- und Multimedia-Programmierung 1
M Kamera "am Rande einer Kugel bewegen" Spiele- und Multimedia-Programmierung 4
B Den KeyListener in einer JavaFXML Application benutzen Spiele- und Multimedia-Programmierung 2
gamebreiti Index eines Elements einer ArrayList abfragen Spiele- und Multimedia-Programmierung 1
F Das sag mir einer Java ist plattform unabhänig ! Spiele- und Multimedia-Programmierung 10
M Scrolling einer 2D Map Spiele- und Multimedia-Programmierung 8
J In einer While-Schleife auf Event warten Spiele- und Multimedia-Programmierung 3
TheSorm Collision an einer bestimmten Seite eine Rectangles abfragen Spiele- und Multimedia-Programmierung 3
windl Frage zu Airplay und zur Mitarbeit bei einer Mediaanlage Spiele- und Multimedia-Programmierung 0
A Aufbau einer JOGL Anwendung Spiele- und Multimedia-Programmierung 12
L Werte aus einer .yml Datei lesen Spiele- und Multimedia-Programmierung 9
H Java3D - Textur aufs innere einer Sphere mappen Spiele- und Multimedia-Programmierung 9
F Download und Update einer Java-Anwendung Spiele- und Multimedia-Programmierung 10
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
B Video von einer IP kamera Spiele- und Multimedia-Programmierung 5
W Java3D: Eckkoordinaten einer Box herausfinden Spiele- und Multimedia-Programmierung 18
W Rotation aller Objekte einer 3D-Szene Spiele- und Multimedia-Programmierung 8
2 Ein Zufallsweg bzw. Weg in einer 2dim Matrix finden. Spiele- und Multimedia-Programmierung 21
aze Schnittmenge zwischen Linie und einer Area wegschneiden Spiele- und Multimedia-Programmierung 3
A Bild einer Webcam auffangen Spiele- und Multimedia-Programmierung 20
G Ballerkennung aus einer Bilddatei Spiele- und Multimedia-Programmierung 24
B Generierung einer Wertetabelle aus einem Bild Spiele- und Multimedia-Programmierung 3
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
M Realisierung einer Sichtweise in Java2D Spiele- und Multimedia-Programmierung 3
B String zu Objekt einer eigenen Klasse casten Spiele- und Multimedia-Programmierung 13
H Screenshot einer Graphics2D Anwendung erstellen Spiele- und Multimedia-Programmierung 6
F Meine Aufgabe: Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles Spiele- und Multimedia-Programmierung 7
J Fehlverhalten einer Spielfigur Spiele- und Multimedia-Programmierung 7
N Jogl Probleme mit dem Buffer beim laden einer Textur Spiele- und Multimedia-Programmierung 2
M Das Frequenzspektrum einer WAV/MP3-Datei anzeigen Spiele- und Multimedia-Programmierung 6
M Rechteck erkennung innerhalb einer Matix Spiele- und Multimedia-Programmierung 4
S Problem beim laden eines Bildes in einer Methode Spiele- und Multimedia-Programmierung 14
E Pinball Abprall an einer schrägen Bande Spiele- und Multimedia-Programmierung 19
0x7F800000 weiß einer wozu ANTLR beim build von JOGL verwendet wird? Spiele- und Multimedia-Programmierung 3
E Hilfe bei einer GUI Programmierung mit Graph Spiele- und Multimedia-Programmierung 30
A Tutorial für die Entwicklung einer Fussball-KI gesucht Spiele- und Multimedia-Programmierung 7
S Rotation relativ zur Rotation einer anderen Transform Group Spiele- und Multimedia-Programmierung 3
A Screenshots von einer Scene erstellen Spiele- und Multimedia-Programmierung 5
G Land aus einer Weltkarte selektieren Spiele- und Multimedia-Programmierung 10
D Kräftesimulation auf einer 2D-Oberfläche Spiele- und Multimedia-Programmierung 5
T Geschwindigkeit einer Animation aendern Spiele- und Multimedia-Programmierung 6
G Ermitteln eines Punktes in einer anderen TransformGroup Spiele- und Multimedia-Programmierung 2
N Background in Java3D ähnlich einer Skybox erzeugen Spiele- und Multimedia-Programmierung 5
H zB Punkte darstellen und mit einer Linier verbinden Spiele- und Multimedia-Programmierung 5
F Darstellung einer tierischen Zelle Spiele- und Multimedia-Programmierung 3
S Text an einer Seite eines Cubes Spiele- und Multimedia-Programmierung 7
F Das SPiel ruckelt nach einer Zeit Spiele- und Multimedia-Programmierung 19
D wieder einer von anfang an. Spiele- und Multimedia-Programmierung 4
M Darstellung einer schwingenden Membran? Spiele- und Multimedia-Programmierung 23
raptorrs Teile einer CAD-Assembly Gruppe in JAVA animieren? Spiele- und Multimedia-Programmierung 3
K Beschriftung von Punkten in einer "Punktwolke" Spiele- und Multimedia-Programmierung 2
S Zur Laufzeit auf die Methode einer anderen Klasse zugreifen Spiele- und Multimedia-Programmierung 5
K Klick in der nähe einer Strecke Spiele- und Multimedia-Programmierung 14

Ähnliche Java Themen

Neue Themen


Oben