# Jogl: Objekt trotz Rotation immer in gleiche Richtung bewegen



## Verwirrter (20. Nov 2010)

Hallo Leute

Ich versuche mich gerade an Jogl. Und zwar möchte ich ein Objekt nach hinten bzw. nach vor bewegen. Dazu verschiebe ich es einfach entlang der z-Achse. Das funktioniert auch aber nun stehe ich vor einem Problem: Wenn ich die gesamte Szene drehe schaut meine z-Achse nicht mehr gerade nach hinten sondern eben irgendwie schräg oder nach oben oder wie auch immer die Szene gedreht wurde. Mit "nach hinten" meine ich in den Bildschirm rein. Ich hoffe das ist verständlich ;-)

Ich dachte mir nun ich nehme einfach einen Vektor der immer nach hinten zeigt und verschiebe das Objekt dann immer entlang dieses Vektors. Zu Beginn ist der Vektor (0|0|-1). Wenn ich nun die gesamte Szene z.B. um die x-Achse rotiere rotiere ich auch diesen Vektor um die x-Achse, aber eben in die entgegengesetzte Richtung. Der Vektor müsste dann ja immer noch "in den Bildschirm rein" zeigen. 

Im Code sieht das so aus:

```
Matrix m = new Matrix();
    	m.setRotateX(-xRot);
    	Vector v=m.rotateVector(vBack);
    	v.normalize();
    	    	
    	pe.setXPos(pe.getXPos()+(float)(v.x*0.1));
    	pe.setYPos(pe.getYPos()+(float)(v.y*0.1));
    	pe.setZPos(pe.getZPos()+(float)(v.z*0.1));
```

Die Methode rotateVector multipliziert die Rotationsmatrix mit dem Vektor:

```
back.x = m[0][0] * x + m[0][1] * y + m[0][2] * z ;
		back.y = m[1][0] * x + m[1][1] * y + m[1][2] * z ;
		back.z = m[2][0] * x + m[2][1] * y + m[2][2] * z ;
```
Leider funzt das aber nicht so wie gedacht. Mein Objekt wird in alle möglichen Richtungen verschoben, aber eben nicht in die in die es soll. Jemand eine Idee?


----------



## Marco13 (20. Nov 2010)

Eigentlich muss man dafür "nur" aufpassen, in welcher Reihenfolge man die Matrizen aufmultipliziert. Jedenfalls ist das, was du da beschreibst, ganz klassisch das Beispiel von Chapter 3 - OpenGL Programming Guide unter "Thinking about Transformations", mit diesem Bild


----------



## Verwirrter (20. Nov 2010)

Den Unterschied habe ich schon verstanden, hilft mir aber hier nicht weiter. Ich will ja nicht das Objekt um die eigene Achse drehen. Es soll die gesamte Szene gedreht werden und dann eines der Objekte aus dieser Szene verschoben werden.


----------



## Marco13 (20. Nov 2010)

Beschreib' ggf. mal genauer wie du die Matrix aufbaust, keiner weiß was du da für Operationen drin hast, vielleicht muss man auch die Bewegungsrichtung mit dem Inversen der Kameramatrix multiplizieren... ein KSKB würde helfen (wenn du es schaffst, vor Fancy eins zu posten)


----------



## Verwirrter (20. Nov 2010)

Keine Ahnung was ein KSKB ist aber ich versuch mal zu beschreiben was ich mache:


```
gl.glTranslatef(x, y, z);
            gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
            gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
            gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);

            for(alle objekte o){
                gl.glPushMatrix();
		gl.glTranslatef(o.getXPos(), o.getYPos(), o.getZPos());
		gl.glRotatef(xRotText, 1.0f, 0.0f, 0.0f);
		gl.glRotatef(yRotText, 0.0f, 1.0f, 0.0f);
		gl.glRotatef(zRotText, 0.0f, 0.0f, 1.0f);  
                    //hier wird das objekt gezeichnet                  
                gl.glPopMatrix();
           }
```

Die translate und rotate Methoden am Anfang verschieben und rotieren die gesamte Szene. In der For Schleife sind dann nochmal translate und rotate Methoden die nur auf ein einziges Objekt angewandt werden. Mein Problem ist nun, es wird eben zuerst das Objekt verschoben und dann die gesamte Szene rotiert. D.h. wenn die Szene rotiert wird, dann wird das Objekt eben nicht gerade nach hinten verschoben sondern schräg, je nachdem wie die Szene rotiert wurde.


----------



## Marco13 (21. Nov 2010)

Ist schwer, an so einem kleinen Stück zu erkennen, was genau gemacht wird (z.B. auch wo die Werte herkommen), aber tendenziell könntest du mal was in der Richtung versuchen

```
for(alle objekte o){
                gl.glPushMatrix();
		gl.glTranslatef(o.getXPos(), o.getYPos(), o.getZPos());
		gl.glRotatef(xRotText, 1.0f, 0.0f, 0.0f);
		gl.glRotatef(yRotText, 0.0f, 1.0f, 0.0f);
		gl.glRotatef(zRotText, 0.0f, 0.0f, 1.0f);  

                gl.glPushMatrix();
                gl.glTranslatef(x, y, z);
                gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
                gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
                gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);

                //hier wird das objekt gezeichnet                  

                gl.glPopMatrix();
                gl.glPopMatrix();
           }
```
wobei ich mit dem glTranslate jetzt nicht sicher bin, ob DAS nicht vielleicht noch außerhalb der Schleife stehen sollte...


----------

