# Rotation um verschobene Achse



## schmiddy123 (7. Feb 2008)

Hi!

Mal wieder ein Rotationsproblem, ich konnts trotz langem Suchen und rumprobieren leider noch nicht lösen.....

Ich habe ein Objekt, sagen wir ein Holzbrett. Dieses soll um die Z-Achse gedreht werden. Mit rotZ(winkel) funktioniert das auch wunderbar, allerdings rotiert es um die markierte Stelle (von vorne betrachtet):


   ========X========     (Brett)


Was ja auch logisch ist, der Ursprung geht durch das zentrum des Objektes, also wird darum gedreht.

Jetzt will ich aber um den Rand des Brettes drehen. D.h. die Drehung soll gleich ablaufen wie bisher, aber es soll um diesen Punkt gedreht werden:

   X================     (Brett)


Wie mache ich das??? Mit setRotation z.B. gehts nicht, da könnt ich ja gleichzeitig um Z und X z.B. drehen, aber ich kann nicht die Lage der Z-Achse verschieben......

Grüße, Chris                  

                  [/img]


----------



## Marco13 (7. Feb 2008)

Verschieb' das Brett so weit nach rechts, dass sein linker Rand im Ursprung liegt, mach dann die Drehung, und mach danach die Verschiebung wieder rückgängig.

Für den 2D-Fall kannst du mal hier schauen
http://java.sun.com/j2se/1.5.0/docs/api/java/awt/geom/AffineTransform.html#getRotateInstance(double,%20double,%20double)

3D ists' genauso...

TransformGroup nachRechts = ... new TransformGroup(translate 10,0,0);
TransformGroup drehen = ... new TransformGroup(rotate 0,0,1, alpha);
TransformGroup zurück = ... new TransformGroup(-10,0,0);
zurück.addChild(drehen);
drehen.addChild(zurück);
nachRechts.addChild(dasBrett);

EDIT: Mit der Reihenfolge kommt man doch immer wieder mal durcheinander   ist jetzt korrigiert ... glaubich


----------



## schmiddy123 (7. Feb 2008)

Hmm, war eine meiner ersten Ideen, die aber leider nicht geklappt hat. Jetzt hab ichs dann wegen deiner Antwort nochmal probiert, diesmal tuts. Naja, typisch Informatik. ;-) Auf jeden Fall Danke!!


----------



## licht400 (20. Mai 2009)

Hallo, eigentlich habe ich genau das selbe Problem, bekomme es aber nicht gelöst.
Das ganze wird mit JAVA3D gemacht. m
Ich möchte einen Quader um 45 Grad kippen. Das Problem ist, das der Quader in der Mitte des des Körpers gedreht wird und nicht am Fuss, so das es gekippt wird. So, das heißt einfach, ich verschiebe den Quader an die XAchse..


```
Box box = new Box(0.08f,0.08f,0.08f, makeAppearance());
PickTool.setCapabilities(box.getShape( Box.TOP),PickTool.INTERSECT_FULL);
PickTool.setCapabilities(box.getShape(Box.BOTTOM),PickTool.INTERSECT_FULL);

Transform3D BoxTransform = new Transform3D();
 Transform3D T3D = new Transform3D();
 T3D.setTranslation(new Vector3f(0.0f,0.0f,0.0f)); //Im NullPunkt, also Mitte des Körpers
 T3D.setTranslation(new Vector3f(0.04f,0.04f,0.0f));//So, die Hälfte von der Breit und Höhe verschoben, so sollte //man dass kippen hinbekommen, will er aber nicht, er dreht immer noch um den Mittelpunkt
 T3D.rotX(Math.PI/-4);

 TransformGroup TGAchse = new TransformGroup(T3D);
 TGAchse.addChild(box);
```

Wie kann ich das kippen hinbekommen?


----------



## Developer_X (20. Mai 2009)

Ganz einfach; erst rotation, dann translation
also im KlarText:

```
Box box = new Box(0.08f,0.08f,0.08f, makeAppearance());
PickTool.setCapabilities(box.getShape( Box.TOP),PickTool.INTERSECT_FULL);
PickTool.setCapabilities(box.getShape(Box.BOTTOM),PickTool.INTERSECT_FULL);

Transform3D BoxTransform = new Transform3D();
 Transform3D T3D = new Transform3D();
T3D.rotX(Math.PI/-4);
 T3D.setTranslation(new Vector3f(0.04f,0.04f,0.0f));//So, die Hälfte von der Breit und Höhe verschoben, so sollte //man dass kippen hinbekommen, will er aber nicht, er dreht immer noch um den Mittelpunkt
 

 TransformGroup TGAchse = new TransformGroup(T3D);
 TGAchse.addChild(box);
```
PS: man kann nicht 2 mal translationieren


----------



## Developer_X (20. Mai 2009)

hey, wenn du eclipse benutzt, und ahung von Java hast, downloade dir diese Jar:
java-forum.org - Blog-Einträge
und dann kannst du ganz einfach dinge positionieren und translantieren.
Sag wenn dus genommen hast,

Adde die Jar zu deinem Class Path, wenn du nicht weißt wies geht, melde dich bei mir mit einer Private Message, und ich erklärs dir


----------



## Marco13 (20. Mai 2009)

:lol: ???:L 


> "Diese Klasse wurde mit Hilfe von Marco13 und Mir entwickelt, ich danke Marco13, der einen Teil dieser Jar geleistet hat"



Der Beitrag war zwar nicht explizit unter "CC Attribution License" veröffentlicht, aber ... WENN du dort schon meinen Namen erwähnst, dann bitte relativierend - also, nicht sagen, dass ich "einen Teil" davon geschrieben habe, sondern dass ich alles (außer dem Test und der Methodensignatur (die DU so haben wolltest)) geschrieben habe, und dass ich das Ding im 
Originalthread *"WierdTransformGroup"* genannt hatte....


----------



## Illuvatar (20. Mai 2009)

Das Problem bei dir hängt damit zusammen, wie die rotX Methode arbeitet.


			
				API hat gesagt.:
			
		

> Sets the value of this transform to a counter clockwise rotation about the x axis. All of the non-rotational components are set as if this were an identity matrix.


Das heißt, deine Translation wird von der Methode einfach ignoriert.
Nebenbemerkung: Dass du zweimal direkt hintereinander die Translation setzt ist nicht sonderlich sinnvoll - es schadet zwar nicht, bringt aber auch nix 

Es gibt zwei Möglichkeiten, das sinnvoll zu lösen:

Mit mehreren Transform3D-Objekten. Du erstellst ein T3D, das den Mittelpunkt an den Rand verschiebt, ein T3D das dreht, und eins das wieder zurückverschiebt. Mit "mul" kannst du die dann in ein T3D zusammenrechnen.
Direkt in einem Objekt. Dafür kannst du z.B. diesen Konstruktor verwenden:
Transform3D (Java 3D 1.5.1)
Die Transformationsmatrix kannst du dir z.B. über die rotX-Methode in Matrix3d erstellen lassen. Beachten musst du noch: Es wird erst gedreht, dann verschoben. Das heißt, du drehst das Ding um 45° und musst es dann ein bisschen nach oben und zur Seite schieben. Mit einer Skizze kann man leicht rauskriegen, wie viel das "bisschen" genau ist, aber es ist gerade zu spät zum Denken  Wenn du magst kann ich das morgen mal probieren - aber vermutlich ist die erste Variante besser. Ich rechne nur immer gern selber^^


----------

