# Rotationen



## Andre Schaaf (5. Dez 2007)

Schönen guten Tag,

wiedereinmal ein Problem was ich nich wirklich verstehe.

Ich habe zwei TransformGroups, eine für Translation und eine für Rotation.

Als erstes Transliere ich das Object und dann rotiere ich es.
Beim  rotieren drehe ich das Object erst von "hand" auf eine Winkel von 0.785, das funktioniert.
Dann starte ich eine Animation die das Object wieder auf 0.0 zurückdrehen soll. 

Was passiert, nach dem Aufruf wird das Object wieder auf die Position nach dem Translieren zurückgesetzt und dreht sich dann um den gewünschten Winkel von -0.785.

Wo ich nun nicht mitkomme ist warum der immer wieder das Object vor der Rotation auf seinen Ausgangspunkt zurücksetzt, ich hab schon etliches probiert aber zu einer Lösung komme ich nich.

Wenn mir jemand sagem könnte wie ich das Problem beheben könnte wäre ich sehr dankbar dafür.

MFG Andre


----------



## Marco13 (5. Dez 2007)

Zu wenig input. Übergib den Winkel, und es wird die Rotation durchgeführt. (Tja.) Im Zweifelsfall häng' eine Rotation um 0.7 und eine Rotation um [0 ... -0.7] hintereinander.  :roll:


----------



## Andre Schaaf (5. Dez 2007)

Naja so rein von der Sache her hatten wir das ja schonmal 

4 rotation - Um den Ursprung
3 translation - Vom Ursprung weg, da hin, wo das Objekt sein soll
2 skalierung
1 rotation - um die Objekteigene Achse

das ist mein Aufbau. So hängen die TransformGroups ineinander.

Was mache ich als erstes Translieren und dann Rotieren (das mache ich per Befehl von Hand)  um die eigene Achse. Nach der Rotation will ich wieder zurückrotieren und da setzt er mir dann die Position wieder auf die Position zurück die das Object vor der ersten Rotation hatte.


----------



## Marco13 (5. Dez 2007)

Es wird wohl Zeit für ein kleines, compilierbares, alleine Luaffähiges Beispiel ....  :roll:


----------



## Andre Schaaf (5. Dez 2007)

Ok das wird schwierig, das ist zu viel da brauch ich ewigkeiten um diese Situation woanders wieder herzustellen. Ähm machen wir es mal anders.

Ich habe 3 Winkel (x,y,z),

wie kann ich nun zuerst um die X-Achse rotieren dannach um die Y-Achse und schliesslich nach Y um die Z-Achse ?


----------



## Marco13 (5. Dez 2007)

Entweder, indem du 3 TransformGroups hintereinander hänst, die jeweils EINE Rotation enthalten

RotationUmZ -> RotationUmY -> RotationUmX -> Objekt

oder indem du EINE TransformGroup nimmst, in die du die passende Matrix packst

Transform3D t = new ...
t.mul(eineRotationUmZ);
t.mul(eineRotationUmY);
t.mul(eineRotationUmX);
tg.setTransform(t);

EDIT: Als nachtrag vielleicht: Wenn man nur drei Rotationswinkel angibt, läuft man zwangsläufig immer irgendwo in eine Singularität, weil es keinen Homöomorphismus von der Gruppe SO(3) auf den R^3 gibt. (Was das heißt, weiß ich nicht, aber es hört sich toll an   Websuche nach "Euler Angles" und "Gimbal Lock")


----------



## Andre Schaaf (5. Dez 2007)

Hehe, besten dank ich werde das mal so probieren und dann meld ich mich nochmal.


----------



## andreschaaf (6. Dez 2007)

So nun bin ich angemeldet. Marco ich weis nich wenn du nichts dagegen hast dann würde ich mich mit dir mal so unterhalten wollen wegen meinem Problem. Irgendwie mit ICQ oder so. Meine ICQ Nummer steht in meinem Profil. Wär super das würde mein Problem denke ich um ein vielfaches schneller klären. Die Lösung des Problems würde dann natürlich auch hier veröffentlicht werden.

MFG Andre


----------



## Marco13 (6. Dez 2007)

Dagegen hab ich nichts. Aber auch nichts dafür. (D.h. ich habe kein ICQ oder so :wink: )
Aber das Forum tut's doch ... es forciert gelgentlich eben auch präziserere Fragestellungen, und DAMIT dann vielleicht eine schnelle(re) Problemlösung .... :wink:


----------



## andreschaaf (6. Dez 2007)

Das ist wohl wahr. Also ich versuche nochmal mein ganzes Bild vernünftig aufzuschreiben.

Folgende Struktur ist jetzt vorhanden,

ich habe ein SimpleUniverse, dort drinn habe ich eine Branch die sich
"Kamera" nennt ... dieser Branch hat erstmal diese 4 TGs drinn wie schon weiter oben geschrieben. Unter der letzten TG hängen meine ganzen Objekte. Die einzelnen Objekte haben alle den selben Aufbau wie die "Kamera". Was ich nun nicht verstehe ist warum der die Rotation der Kamera nich macht wie ich das gerne hätte. Die Translation,Skalierung und Rotation der einzelnen Objekte klappt wunderbar. Aber die Kamera bekomme ich einfach nicht vernünftig animiert, was heist nur die Rotation bekomme ich nich hin .. Translation und Skalierung klappt perfekt. 

Ich poste mal meine ganze Rotationsfunktion, vielleicht siehst du ja etwas 


```
if(this.rotVector1.x==0.0f && this.rotVector1.y==0.0f && this.rotVector1.z==0.0f){
				if(!this.rotSteppingSet){														
					this.rotStepping=this.rotAngle/this.duration;
									
					this.rotSteppingSet=true;
				}
				
				Vector3f rotVec=new Vector3f(this.rotVector1.x,this.rotVector1.y,this.rotVector1.z); 
				Transform3D trans=new Transform3D();
				trans.set(rotVec);
				
				this.rot=rotStepping*timeStep;
				
				AxisAngle4f axis=new AxisAngle4f(new Vector3f(this.rotVector2.x,this.rotVector2.y,this.rotVector2.z),this.rotAngle+this.rot);
															
				this.object.getRotationAngleT3D().setRotation(axis);
				this.object.getRotationAngleT3D().setTranslation(rotVec);
															
				this.object.getRotationAngleTG().setTransform(this.object.getRotationAngleT3D());
			}
			else {
				if(!this.rotSteppingSet){														
					this.rotStepping=this.rotAngle/this.duration;
									
					this.rotSteppingSet=true;
				}

				this.rot=rotStepping*timeStep;
				
				Vector3f rotVec=new Vector3f(this.rotVector1.x,this.rotVector1.y,this.rotVector1.z); 
								
				AxisAngle4f axis=new AxisAngle4f(new Vector3f(this.rotVector2.x,this.rotVector2.y,this.rotVector2.z),this.rot);
				
				this.object.getTransform3D().setTranslation(rotVec);				
				this.object.getTransformGroup().setTransform(this.object.getTransform3D());
				this.object.getRotationAxisT3D().setRotation(axis);	
				this.object.getRotationAxisT3D().setTranslation(rotVec);
								
				this.object.getRotationAxisTG().setTransform(this.object.getRotationAxisT3D());
			}
		}
```


----------



## Marco13 (6. Dez 2007)

Das ist jetzt ein Stück code, das "irgendwas" macht, und das einzige, was ich darüber weiß, ist dass es nicht das macht, was du willst (was auch immer DAS ist....)


----------



## andreschaaf (6. Dez 2007)

Hehe ok ... ja das ist mein rotationsteil in einer großen datei die dann wieder von irgendwas benutzt wird ... egal ... was ist das 

jedes objekt soll animiert werden einschliesslich der kamera so habe ich mir eine animationsklasse gebaut die für jedes objekt gleich ist ... 

also ich habe ein "AnimatorObjekt" wo dieser teil da drinn steckt und für die berechnung der einzelschritte innerhalb der animaton zuständig ist. Der Source ist dabei in dem AnimatorObject der teil der die Rotation berechnet ... 

Das AnimatorObject bekommt für die Rotation Parameter gegeben, 

rotVec -> Das soll einen Punkt auf einer Achse Darstellen,
rotVector2 -> Das ist der Richtungsvektor

Der rest sollte dann eigentlich klar sein

rotStepping -> Das ist die Winkelschrittweite die mit jedem Durchlauf animiert wird

rot -> ergibt sich aus der Schrittweite * dem aktuellen animationszeitindex

Brauchst du noch mehr Infos ?


----------



## andreschaaf (6. Dez 2007)

EDIT: Ja wie gesagt, Problem wäre dann das, 

ich rotiere die Kamera, klappt alles auch soweit, dann nach dem rotieren will ich nochmals rotieren um eine andre achse, was passiert dann, die Kamera nimmt wieder die Position ein die sie hatte vor der ersten Rotation. Die Rotationsfunktion der Kamera ist die selbe für Objekte.

so baue ich meine TGs zusammen (auch für alles gleich)


```
this.objTransGrp.setTransform(this.objTrans3D);
this.objRotAxisGrp.setTransform(this.objRot3DAxis);
this.objRotAngleGrp.setTransform(this.objRot3DAngle);
this.objScaleGrp.setTransform(this.objScale3D);
		
/*this.objRotAxisGrp.addChild(this.objRotAngleGrp);
this.objScaleGrp.addChild(this.objRotAxisGrp);
this.objTransGrp.addChild(this.objScaleGrp);
this.objBranch.addChild(this.objTransGrp);*/
			
/*4 rotation - Um den Ursprung
	3 translation - Vom Ursprung weg, da hin, wo das Objekt sein soll
	2 skalierung
1 rotation - um die Objekteigene Achse*/

this.objTransGrp.addChild(this.objRotAxisGrp);
this.objScaleGrp.addChild(this.objTransGrp);
this.objRotAngleGrp.addChild(this.objScaleGrp);
this.objBranch.addChild(this.objRotAngleGrp);
```

AngleGrp -> rotation um die Objekteigene Achse
AxisGrp -> Rotation um eine Rotationsachse


----------



## andreschaaf (6. Dez 2007)

Gut ich habe mein Problem gelösst, nachdem ich gemerkt habe das ich ein wenig falsch an die ganze sache rangegangen bin habe ich meine kamera nun umprogrammiert und sie macht nun das was sie auch soll ... bleibt noch eine frage offen wie bekomme ich aus  einer transform 3d die aktuellen drehwinkel heraus ?


----------



## Marco13 (6. Dez 2007)

Und was WAR dann das Problem? (Es interessiert mich nur am Rande - vielmehr interessiert mich, ob man (ich) es anhand der geposteten Fragen und Codes hätte erkennen können :wink: )

Die Frage mit den Drehwinkel verwirrt mich etwas. Auch nur indirekt - nämlich nicht von der Sache her, sondern wegen
http://www.java-forum.org/de/viewtopic.php?t=58402&highlight=winkel
und
http://www.java-forum.org/de/viewtopic.php?t=58466&highlight=winkel

Wenn du "die Drehwinkel" berechnen willst, mit denen nacheinander um X, Y und Z gedreht wurde: Das geht nur bedingt, weil die Rotationen (wie oben schon angedeutet) nicht eindeutig sind und Singularitäten haben können. Aber du kannst dir das Quaternion aus der Matrix4f aus der Transform3D holen, und das dann mit
http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
bzw 
http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm (mit Source code)
verwursten. 

Besser wäre es aber vermutlich, sich die Drehwinkel (die man ja schließlich selbst anwendet) irgendwo zu speichern.


----------



## andreschaaf (8. Dez 2007)

Jo, das problem war das der die Positionen nicht gespeichert hat. 

Ich habe den code von oben für die Rotation mit folgendem Code ersetzt und meine "Kamera" direkt auf die View Platform gelegt.


```
tmp=this.camera.getAbsRotate().z;
		
		while(tmp<0){
			angle=0.01f;
			
			tmp+=angle;
			
			Transform3D trans=new Transform3D();
			this.camera.getTransformGroup().getTransform(trans);
			
			Transform3D rotTrans=new Transform3D();
			rotTrans.rotZ(angle);
			
			rotTrans.mul(trans);
			
			this.camera.getTransformGroup().setTransform(rotTrans);
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {				
				e.printStackTrace();
			}
		}
		
		tmp=this.camera.getAbsRotate().y;
		
		while(tmp<0){
			angle=0.01f;
			
			tmp+=angle;
			
			Transform3D trans=new Transform3D();
			this.camera.getTransformGroup().getTransform(trans);
			
			Transform3D rotTrans=new Transform3D();
			rotTrans.rotY(angle);
			
			rotTrans.mul(trans);
			
			this.camera.getTransformGroup().setTransform(rotTrans);
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {				
				e.printStackTrace();
			}
		}
		
		tmp=this.camera.getAbsRotate().x;
		
		while(tmp<0){
			angle=0.01f;
			
			tmp+=angle;
			
			Transform3D trans=new Transform3D();
			this.camera.getTransformGroup().getTransform(trans);
			
			Transform3D rotTrans=new Transform3D();
			rotTrans.rotX(angle);
			
			rotTrans.mul(trans);
			
			this.camera.getTransformGroup().setTransform(rotTrans);
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {				
				e.printStackTrace();
			}
		}
```

Das bringt mir das gewünschte Ergebniss, nur noch ein bischen umbauen und wild verpacken.

Das mit dem Winkel ist sone Sache weil ich zu einem das ganze festlege und aber auch durch den Behaviour verändert wird deswegen muss ich die aktuelle Drehung auch aus der Transform3D der Kamera rauszerren können. So und da ich nun weis wie werde ich keine Frage mehr nach nem Winkel stellen ;-) .

Aber Marco wie immer besten Dank für deine Zeit und Mühe mir geholfen zu haben.


----------

