Hilfe: Rotation X und Y Achse (Java3d)

Status
Nicht offen für weitere Antworten.

JavaPhil

Mitglied
Hi,

ich versuche eine Steuerung für ein Raumschiff in Java3d zu schreiben. Probleme hab ich bei der Perechnung der Rotationen um X und Y Achse. Zur zeit kann ich in Ausgangsstellung das Schiff komplett um die Y achse rotieren und auch um die X Achse, jedoch nicht ganz so wie das sein soll.

Kurz: wenn ich zb senkrecht nach oben oder unten schaue und dann eine Linksdrehung einleite Rotiert das Schiff nur... aber es soll nach Links schwenken :-(

Ich hab es mit einer und mit zwei TransformGroups Probiert beide male das selbe Ergebnis.

Muss ich noch irgendeine Flag setzen oder eventuel die Rotation selber berechnen also nicht mit rotX rotY?? aber wie???

MfG
Philipp

Edit: Versteht das keiner? Soll ichs nochmal anders erklären? Oder wisst ihr das auch nicht?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Den Unterschied zwischen "Rotieren" und "Schwenken" könntest du vielleicht nochmal näher erläutern.
Aber ganz allgemein: Über die Auführungsreihenfolge der Rotationen und solche Begriffe wie "Gimbal Lock" sollte man sich schon genau Gedanken machen...
 

JavaPhil

Mitglied
Whaa ich dreh durch... ;(

hab ein Tutorial für Delphi gefunden, das sich genau mit meinem Problem auseinander setzt.

Tutorial Objekt immer um eigene Achse drehen ? DGL Wiki

Es beschreibt im grunde die Vorgehensweise wie ich mir das selber auch gedacht hab. Hab es mal auf java umgeschrieben und funzt nicht..

hier ein teil meines Java Codes... will hier nicht alles postenn wäre wohl zu viel

Java:
//wird von der processStimulus mit Enum RotationsVector und winkel aufgerufen
private void updateRotation(ROT rot , double angle)
	{
		
		if (rot == ROT.rotX)
		{	
                        //Quaternion Rotation anlegen		
			vect.set(vectX);
			vect.scale(Math.sin(angle/2.0));
			scalar = Math.cos(angle/2.0);	
			quat.set(vect.x, vect.y, vect.z, scalar);

                        //Hilfsmatrix mit Quaternion rotieren
			matr_temp.setIdentity(); 
			matr_temp.set(quat);
			
                        //bei rotation um X verändern sich die Lokalen Vetoren Y und Z
			matr_temp.transform(vectY);
			matr_temp.transform(vectZ);

                        //die ObjectMatrix mit der Temporären multiplizieren, Transform3d setzen
			matrix3d.mul(matr_temp);			
			tf_koords.set(matrix3d);
		}
                
                //andere Richtugen

                vectX.normalize();	
		vectY.cross(vectZ, vectX);
		vectY.normalize();	
		vectZ.cross(vectX, vectY);
		vectZ.normalize();

                //transformGroup setzen
		tg_koords.setTransform(tf_koords);

        }

Das ganze funktioniert für rotation um x oder y, aber nicht für X und Y da kommt Käse bei raus.

per Sysout hab ich festgestellt das die Lokalen Vectoren nicht mit dem Object übereinstimmen. Hab mir als object 3 Pfeile gebastelt welche Anfangs in XYZ richtung schauen. Wurschtel ich jetzt mit meinen rotationen rum biss sie ungfähr wieder in Ausgangsstellung stehen sollten ja auch die lokalen Vectoren wieder in ausgangsstellung stehen.. Dies ist aber nicht der fall die schauen sonnst wo hin...

Meine vermutung ist daher das irgendwas an dem rotieren der Lokalen falsch ist
matr_temp.transform(vectY);
matr_temp.transform(vectZ);

oder an der rotation der ObjectMatrix
matrix3d.mul(matr_temp);

Hat jemand da eine Idee?

Danke,
Philipp
 

Marco13

Top Contributor
Ja, niemand weiß, was die ganze Fields sind (matr_temp, tf_koords, vectX, ...Schau dir auch mal die Java naming conventions an.... :autsch: ).

Mich irritiert allein schon die if-Abfrage - was auch immer da gemacht wird, es wird ja NUR bei einer Rotation um die X-Achse gemacht ???:L

Wie auch immer, das allgemeine Schema ist grob sowas wie
Java:
Matrix4f gesamtRotation = (am Anfang: Matrix4f mit setIdentity)

void rotateX(float angle)
{
    Matrix4f rotation = new Matrix4f();
    rotation.setIdentity();
    rotation.rotX(angle);
    gesamtRotation.mul(matrix, gesamtRotation); // Von LINKS dranmultiplizieren!!!

    someTransformNode.setTransform(... Transform3D mit 'gesamtRotation'  ...);
}

// Für rotation um Y ganz analog...
...

Ansonsten wäre ein Compilierbarer Codeschnipsel evtl. ganz hilfreich...
 

JavaPhil

Mitglied
hmm

Also ich hab da //andere Richtungen geschrieben was so viel heisst wie:

if (rot == ROT.rotY)...
if (rot == ROT.rotZ)...

ROT ist einfach ne Enum

Die methode wird vom ProzessStimulus aufgerufen, der je nach Tastendruck entscheidet welche enum übergeben wird..

vect ist ein Hilfsvector der für die Quaternion Berechnung benötigt wird
und je nach wahl mit dem jeweiligem lokalen Vector vecX vecY oder vecZ gesetzt wird

Das heist es wird (sollte) dann genau um diesen Vector und nicht um das Weltkoordinatensystem gedreht werden. --> je nach Rotation werden die beiden Anderen Lokalen Vectoren mitgedreht.. hier
vectY und vectZ da rotation um X

matr_temp ist einfach eine temporäre Matrix3d
tf_koords ist die Transform3D der tg_koords welche die TransformGroup des Objects ist.

das normalisieren passiert um rundungsfehler auszumerzen...

wenn ich heut abend zu hause bin post ich mal das ganze behavior...

Aber schon mal vornweg .. ich will halt nicht "rotation.rotX(angle);" verwenden weil dies immer um das Weltkoordinatensystem dreht.. und das ist gerade das was ich nicht will..

Ich hoffe das klärt ein paar Ungenauigkeiten in meinem code...

Danke,
Philipp
 

Marco13

Top Contributor
Aber schon mal vornweg .. ich will halt nicht "rotation.rotX(angle);" verwenden weil dies immer um das Weltkoordinatensystem dreht.. und das ist gerade das was ich nicht will..

Das ist erstmal nur eine Rotation um die X-Achse - in Weltkoordinaten, ja, aber zu einer Rotation um lokale Koordinaten wird das, indem man es an der richtigen Stelle von links oder rechts an eine andere Matrix dranmultipliziert...
 

Empire Phoenix

Top Contributor
Zu Quaternions kann ich nur empfehlen bei google nach dem einnen Referat zu suchen, "Einführung in quaternions" oder so. Das ist relativ hilfreich, wenna uch mathematisch etwas anpruchsvoller, dennoch lohnt sich der aufwand.
 

JavaPhil

Mitglied
So hier mal der ganze code... unkommentiert hab leider keine zeit, aber im grunde sollte man alles verstehen.

Java:
public class RotBehavior extends Behavior{
	
	enum ROT {rotX , rotY, rotZ};
	static double rotSpeed = 0.1;
	
	private WakeupCondition cond;
	private TransformGroup tg_koords;
	private Transform3D tf_koords = new Transform3D();
	
	private Matrix3d matrix3d = new Matrix3d();
	private Matrix3d matr_temp = new Matrix3d();
	
        //Quaternion + das was zum bauen noetig ist
	private Quat4d quat = new Quat4d();
	private Vector3d vect = new Vector3d();
	private double scalar;
	
        //lokale Vectoren
	private Vector3d vectX = new Vector3d();
	private Vector3d vectY = new Vector3d();
	private Vector3d vectZ = new Vector3d();
	

	public RotBehavior(TransformGroup tg_koords)
	{
		this.tg_koords = tg_koords;
	}
	
	@Override
	public void initialize() {	
		cond = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);	
		this.wakeupOn(cond);	

                //Vectoren und Matrix initialisieren (ganz unten)
		reset();
	}

	@Override
	public void processStimulus(Enumeration criteria) {
		
		WakeupOnAWTEvent event = (WakeupOnAWTEvent) criteria.nextElement();	
		KeyEvent key = (KeyEvent) event.getAWTEvent() [0];
				
		tg_koords.getTransform(tf_koords);

		if (key.getKeyChar()=='d')
			updateRotation(ROT.rotY, rotSpeed);
		if (key.getKeyChar()=='a')
			updateRotation(ROT.rotY, -rotSpeed);		
		if (key.getKeyChar()=='w')
			updateRotation(ROT.rotX, rotSpeed);
		if (key.getKeyChar()=='s')
			updateRotation(ROT.rotX, -rotSpeed);

                //Ausgabe zum Kontrollieren.. was der so für Mist macht
		System.err.println("vectX: "+ vectX);
		System.err.println("vectY: "+ vectY);
		System.err.println("vectZ: "+ vectZ);

		this.wakeupOn(cond);
	}
	
	
	private void updateRotation(ROT rot , double angle)
	{
		
		if (rot == ROT.rotX)
		{			
			vect.set(vectX);
			vect.scale(Math.sin(angle/2.0));
			scalar = Math.cos(angle/2.0);	
			quat.set(vect.x, vect.y, vect.z, scalar);

			matr_temp.setIdentity(); 
			matr_temp.set(quat);
			
			matr_temp.transform(vectY);
			matr_temp.transform(vectZ);

			matrix3d.mul(matr_temp);			
			tf_koords.set(matrix3d);
						
		}
		
		if (rot == ROT.rotY)
		{
						
			vect.set(vectY);
			vect.scale(Math.sin(angle/2.0));
			scalar = Math.cos(angle/2.0);	
			quat.set(vect.x, vect.y, vect.z, scalar);		
			
			matr_temp.setIdentity(); 
			matr_temp.set(quat);
			
			matr_temp.transform(vectZ);
			matr_temp.transform(vectX);

			matrix3d.mul(matr_temp);
			tf_koords.set(matrix3d);
		
		}
		
		if (rot == ROT.rotZ)
		{			
			vect.set(vectZ);
			vect.scale(Math.sin(angle/2.0));
			scalar = Math.cos(angle/2.0);	
			quat.set(vect.x, vect.y, vect.z, scalar);

			matr_temp.setIdentity(); 
			matr_temp.set(quat);
			
			matr_temp.transform(vectX);
			matr_temp.transform(vectY);

			matrix3d.mul(matr_temp);
			tf_koords.set(matrix3d);
		}
		
		vectX.normalize();	
		vectY.cross(vectZ, vectX);
		vectY.normalize();	
		vectZ.cross(vectX, vectY);
		vectZ.normalize();

		tg_koords.setTransform(tf_koords);
	}
	
	private void reset()
	{
		vectX.set(1.0, 0.0, 0.0);
		vectY.set(0.0, 1.0, 0.0);
		vectZ.set(0.0, 0.0, 1.0);
		
		matrix3d.setIdentity();
	}

}
 

Marco13

Top Contributor
Hmmmm ???:L mit welchen... Aufwänden rechnest du, wenn man jetzt versuchen sollte, daraus ein Beispiel zu machen, wo man den Fehler nachvollziehen kann?

Schreib' mal überall da, wo bisher
matrix3d.mul(matr_temp);
steht, stattdessen
matrix3d.mul(matr_temp, matrix3d);
hin... *rumrat*
 

JavaPhil

Mitglied
matrix3d.mul(matr_temp, matrix3d); das hat ich schonmal so aber is ja im Grunde das gleiche...

DEr aufwand besteht darín schon en kleines programm zu haben das ein object in nem fenster anzeigt.. und da setzte das object in ne transformgroup und übergibst die dem behavior und natürlich noch boundingsphere setzen...

sollte jeder hinbekommen der mir dabei helfen möchte.

Danke,
Philipp
 

Marco13

Top Contributor
Ein KSKB zu bauen sollte auch jeder hinbekommen, der geholfen bekommen möchte. Meine Zeit ist kostbar. Nur noch so viel:
matrix3d.mul(matr_temp, matrix3d);
und
matrix3d.mul(matr_temp);
ist NICHT das gleiche, es ist grundverschieden, und wenn du glaubst, dass beides das gleiche ist, hast du (unter anderem!) meine erste Antwort nicht berücksichtigt. Es ist ein Unterschied, in welcher Reihenfolge man die Matrizen miteinander multipliziert, weil die Matrizenmultiplikation nicht kummutativ ist.
 

JavaPhil

Mitglied
stimmt... hab die Reihenfolge nicht beachtet :oops: (andersrum wärs aber das selbe)... werd das mal morgen ausprobieren.
Morgen hab ich auch wieder mehr zeit genauer im Forum zu lesen und alles auszuprobieren.

Danke Philipp
 

JavaPhil

Mitglied
Waahhooo

Hattest recht... :oops::oops::oops::oops::oops::oops::oops:

matrix3d.mul(matr_temp, matrix3d);

und funzt... :applaus::applaus::applaus:



DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE DANKE :toll::toll::toll::toll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Atten007 Minecraft Hilfe bei benutzerdefinierten Bannervorlagen in MCreator benötigt Spiele- und Multimedia-Programmierung 0
R Flappy Bird Hilfe Spiele- und Multimedia-Programmierung 1
Atten007 Minecraft Hilfe bei der Fehlerbehebung in MCreator benötigt Spiele- und Multimedia-Programmierung 1
Atten007 Minecraft Hilfe beim MCreator Plugin benötigt Spiele- und Multimedia-Programmierung 0
Atten007 Minecraft Hilfe beim MCreator Plugin benötigt Spiele- und Multimedia-Programmierung 5
A [HILFE] - Minecraft-Problem! Spiele- und Multimedia-Programmierung 1
JEP1 Hilfe bei Spiel Spiele- und Multimedia-Programmierung 1
J TreeNode erstellen [Hilfe beim Konstruktor, Zeile 16] Spiele- und Multimedia-Programmierung 2
Z Minecraft Hilfe bei Minecraft PvP Client Spiele- und Multimedia-Programmierung 21
T Hilfe beim Platzieren der Schiffe Spiele- und Multimedia-Programmierung 14
M Brauche Hilfe was zu Programmieren Spiele- und Multimedia-Programmierung 4
P Snake Java Hilfe Spiele- und Multimedia-Programmierung 4
RalleYTN Brauche Hilfe beim Einlesen von PNGs Spiele- und Multimedia-Programmierung 14
P Hilfe für Seminar Arbeit Spiele- und Multimedia-Programmierung 9
T Pong Hilfe bei einer Website Spiele- und Multimedia-Programmierung 4
T Hilfe bei decompilen von Plugin Spiele- und Multimedia-Programmierung 6
E Brauche Hilfe was soll ich tun Spiele- und Multimedia-Programmierung 7
B HILFE bei Spieleprogrammierung mit Slick2D Spiele- und Multimedia-Programmierung 9
S Würfelspiel; Hilfe Spiele- und Multimedia-Programmierung 3
M Hilfe bei vier gewinnt Spiele- und Multimedia-Programmierung 4
S Hilfe bei Java Gui Spiele- und Multimedia-Programmierung 2
C Visual Story programieren/hilfe Spiele- und Multimedia-Programmierung 5
L Hilfe: Moog VCF Diskretisierungs Algorithmen (Smith/Stilson u.A.) Spiele- und Multimedia-Programmierung 0
J Spielfiguren laufen lassen auf einer html Tabelle mit Hilfe von Servlets Spiele- und Multimedia-Programmierung 2
M Hilfe bei Snake Spiele- und Multimedia-Programmierung 4
T Hintergrundmusik eines Spiels mit Hilfe von JLayer Spiele- und Multimedia-Programmierung 12
S 2D mit Slick - Anfänger sucht Hilfe Spiele- und Multimedia-Programmierung 4
C Generelle Hilfe zur lwjgl Spiele- und Multimedia-Programmierung 0
J Hilfe bei Fußballmanager Spiele- und Multimedia-Programmierung 0
C Hilfe bei einem Mosaikspiel Spiele- und Multimedia-Programmierung 16
J Java Steuerberechnung hilfe Spiele- und Multimedia-Programmierung 17
U Hilfe bei Implementierung eines PointSounds in Java3D Spiele- und Multimedia-Programmierung 1
E Hilfe bei Labyrinth Programmierung. Spiele- und Multimedia-Programmierung 9
S Hilfe bei Spiel Spiele- und Multimedia-Programmierung 6
T Aim-Hilfe Spiele- und Multimedia-Programmierung 4
S Shiritori / word chain / Wörterkette Hilfe Spiele- und Multimedia-Programmierung 1
J Hilfe bei mastermind dringend !!!!! Spiele- und Multimedia-Programmierung 3
S Hilfe bei Spielumsetzung Spiele- und Multimedia-Programmierung 6
M Kleines Spongebobspiel / Hilfe gesucht Spiele- und Multimedia-Programmierung 2
L Hilfe bei Entities benötigt Spiele- und Multimedia-Programmierung 6
L Hilfe bei Klassendesign für Spiel Spiele- und Multimedia-Programmierung 2
A Minecraft Hilfe bei Minecraft Mod Spiele- und Multimedia-Programmierung 1
F Einen Sound mit veränderter Tonhöhe und Geschwindigkeit abspielen - Hilfe erbeten Spiele- und Multimedia-Programmierung 29
V Keine Ahnung von OpenGL! Hilfe wäre lieb! Spiele- und Multimedia-Programmierung 8
L Minecraft Minecraft Bukkit Plugin hilfe Spiele- und Multimedia-Programmierung 9
E Hilfe bei Highscore programmierung Spiele- und Multimedia-Programmierung 3
G Acht-Damen-Problem HILFE! Spiele- und Multimedia-Programmierung 11
R Hilfe bei Snake-Programmierung Spiele- und Multimedia-Programmierung 6
B Hilfe bei Minecraft Plugin Spiele- und Multimedia-Programmierung 3
C Java Brauche Hilfe Spiele- und Multimedia-Programmierung 5
M Hilfe bei Spiel Programmierung Spiele- und Multimedia-Programmierung 4
B Hilfe bei GameGrid Spiele- und Multimedia-Programmierung 11
J Spiel mit Java SWING, LWJGL und JMonkey [Anfänger braucht Hilfe] Spiele- und Multimedia-Programmierung 10
N Hilfe bei Tower Defense Spiele- und Multimedia-Programmierung 22
R hilfe bei 2DSpiel. Spiele- und Multimedia-Programmierung 3
S AirHockey Kollisionsprobleme, bitte um Hilfe Spiele- und Multimedia-Programmierung 2
L Abfrage-Fehler? - Hilfe bei Tetris Spiele- und Multimedia-Programmierung 9
R Hilfe bei Reversi/Othello Spiele- und Multimedia-Programmierung 6
B Hilfe bekomme den IF befehl nicht hin Spiele- und Multimedia-Programmierung 10
C RFID Überwachung - Hilfe Spiele- und Multimedia-Programmierung 3
javajavajava Java Lotto Zahl 6 aus 49 - Brauche Hilfe Spiele- und Multimedia-Programmierung 3
radiac FullScreenExlusiveMode HILFE!!! Spiele- und Multimedia-Programmierung 6
E TetrisApplet Thread Hilfe Spiele- und Multimedia-Programmierung 6
H PingPong HILFE !!! Spiele- und Multimedia-Programmierung 3
G GO-Spiel in Java noch fehlerhaft hoffe um hilfe Spiele- und Multimedia-Programmierung 7
N Brauche Hilfe bei kleinem Spiel Spiele- und Multimedia-Programmierung 40
N In einem Kasten springende Bälle programmieren...Hilfe Spiele- und Multimedia-Programmierung 7
L Brauche hilfe mit KeyEvent Spiele- und Multimedia-Programmierung 4
B brauche hilfe bei der tastenzuodnung Spiele- und Multimedia-Programmierung 3
E Hilfe bei einer GUI Programmierung mit Graph Spiele- und Multimedia-Programmierung 30
H Decke zeichnen mit Hilfe eines Polygons Spiele- und Multimedia-Programmierung 2
W Hilfe bei Pong mit Bluej Spiele- und Multimedia-Programmierung 4
A Hilfe bei der Methode COLOR (Java) Spiele- und Multimedia-Programmierung 10
S Hilfe: Ich sehe durch die ganze Api's nicht mehr durch! Spiele- und Multimedia-Programmierung 15
N Hilfe bei snake Spiele- und Multimedia-Programmierung 37
C Hilfe bei einfachen Game Spiele- und Multimedia-Programmierung 15
T Bitte um Hilfe bei Animationen Spiele- und Multimedia-Programmierung 10
G Fragespiel, Hilfe ! like Wer wird Millinär Spiele- und Multimedia-Programmierung 12
D Hilfe mit mini-spiel für die Schule. Spiele- und Multimedia-Programmierung 1
F Brauche Hilfe bei Bewegung eines Rechtecks [Applet] Spiele- und Multimedia-Programmierung 5
G Hilfe bei 3Gewinnt! Spiele- und Multimedia-Programmierung 2
C anfänger braucht hilfe für info unterricht Spiele- und Multimedia-Programmierung 21
A Hilfe bei Programmierung von Abalone Spiele- und Multimedia-Programmierung 6
S Hilfe bei Galgenmännchen Spiele- und Multimedia-Programmierung 4
M 'Mensch ärgere Dich nicht' - Hilfe! Spiele- und Multimedia-Programmierung 12
K Hilfe bei Grafikeinbindung in einem Spiel Spiele- und Multimedia-Programmierung 6
H Ich benötige Hilfe [Noob] Spiele- und Multimedia-Programmierung 9
R Probleme mit Sound in Applikation. HILFE Spiele- und Multimedia-Programmierung 5
B Hilfe gesucht!! (bewegen von grafischen Objekten) Spiele- und Multimedia-Programmierung 3
BraunBerry Rotation mit Radiusänderung Spiele- und Multimedia-Programmierung 0
BraunBerry Rotation von Objekten um ein Raumschiff Spiele- und Multimedia-Programmierung 6
E Rotation um Bildmittelpunkt ohne Affine Transform!!!!! Spiele- und Multimedia-Programmierung 13
RalleYTN LWJGL Rotation Spiele- und Multimedia-Programmierung 1
P Rotation von Sprite klappt nicht Spiele- und Multimedia-Programmierung 4
J Java 3d Rotation Spiele- und Multimedia-Programmierung 6
B j3d Rotation um mehr als eine Achse Spiele- und Multimedia-Programmierung 9
B j3d Kamera Rotation durch Tastendruck Spiele- und Multimedia-Programmierung 12
H Rotation auf Knopfdruck Spiele- und Multimedia-Programmierung 20
T [gelöst] Java3D: Unerwünschte Rotation um die 3.Achse vermeiden? Spiele- und Multimedia-Programmierung 3
W Rotation aller Objekte einer 3D-Szene Spiele- und Multimedia-Programmierung 8

Ähnliche Java Themen

Neue Themen


Oben