Rotation eines Objektes
-
Hallo,
ich suchen nun schon seit Stunden und bin leider nicht fündig geworden, hoffentlich kann mir hier jemand einen Tipp geben:
Ich versuche einen Pfeil (Objekt) an einen Richtungsvektor auszurichten(rotieren), d.h. das Objekt müsste nach der Rotation die gleiche Richtung wie der Vektor haben.
Mit den bisherigen Formeln die ich dafür gefunden habe komme ich nicht weiter, denn hierfür wird immer ein Winkel benötigt den ich in meinem Fall ja nicht kenne.
Wie ist es möglich, das Objekt trotzdem mit Hilfe des Vektors auszurichten?
Vielen Dank im voraus!
Frank
-
Um ein Objekt entlang eines gegebenen Vektors auszurichten erzeugst Du eine Matrix mit orthonormalen Basisvektoren aus Deinem Richtungsvektor und einer ungefaehren Schaetzung des Up-Vektors:
Vector up(0,1,0); Vector z= normalize(direction); Vector x= cross(up, z); Vector y= cross(x, z);
Die Funktion "normalize" normiert den Vektor, "cross" bildet das Kreuzprodukt zweier Vektoren.
Hier wird davon ausgegangen, dass Dein untransformierter Pfeil entlang der Z-Achse verlaeuft, anderenfalls sind die Basisvektoren entsprechend zu tauschen.
Beim nachtraeglichen Verschieben ist darauf zu achten, dass man bereits in neues Koordinatensystem transformiert hat (der Translationsvektor als ebenfalls transformiert werden muss).
Siehe auch lookAt.
-
Frank85 schrieb:
Mit den bisherigen Formeln die ich dafür gefunden habe komme ich nicht weiter, denn hierfür wird immer ein Winkel benötigt den ich in meinem Fall ja nicht kenne.
Wie ist es möglich, das Objekt trotzdem mit Hilfe des Vektors auszurichten?
Du weißt doch, welche Richtung dein Objekt ursprünglich hatte (in Vektor-Form), also kannst du auch den Winkel zwischen der ursprünglichen und der gewünschten Richtung ermitteln.
-
hellihjb schrieb:
Beim nachtraeglichen Verschieben ist darauf zu achten, dass man bereits in neues Koordinatensystem transformiert hat (der Translationsvektor als ebenfalls transformiert werden muss).
Danke, ich werde mir diese Methode später mal anschauen.
Wie genau meinst du das mit dem Translationsvektor und dem Verschieben?CStoll schrieb:
Du weißt doch, welche Richtung dein Objekt ursprünglich hatte (in Vektor-Form), also kannst du auch den Winkel zwischen der ursprünglichen und der gewünschten Richtung ermitteln.
Richtig, das kann ich - habe ich auch zunächst so gemacht. Problem dabei ist nur, dass ich mit der Funktion glRotate() und dem errechneten Winkel eine Achse drehen kann, was nicht ausreichend ist. Für die Ausrichtung braucht es ja mindestens 2 Winkel (Gieren und Neigen bzw. yaw und pitch).
Oder wie würdest du den errechneten Winkel weiterverwenden?
-
Frank85 schrieb:
Problem dabei ist nur, dass ich mit der Funktion glRotate() und dem errechneten Winkel eine Achse drehen kann, was nicht ausreichend ist. Für die Ausrichtung braucht es ja mindestens 2 Winkel (Gieren und Neigen bzw. yaw und pitch).
Richtig, deswegen berechnet man auch beide Winkel (also zB einen in der X/Y- und einen in der Y/Z-Ebene) und rotiert zwei mal (was allerdings auch so seine Tuecken mit sich bringt).
Alternativ ist eine Verknuepfung von Rotationen auch als einzelne Rotation um eine andere Achse darstellbar (Wiki: Axis-Angle).
Das ist aber alles voellig unnoetig (und ggf wegen Trigonometrie numerisch instabil) da Du den Richtungsvektor schon hast und nur zwei Kreuzprodukte brauchst um die Matrix aufzustellen.Wie genau meinst du das mit dem Translationsvektor und dem Verschieben?
Wenn Du zwei Punkte gegeben hast an denen Du Dein Objekt ausrichten moechtest, willst Du es ja einerseits entsprechend drehen und wahrscheinlich auch dorthin schieben. Da Matrizen nicht kommutativ sind muss man sich im Klaren ueber die Reihenfolge sein bzw in welchem Koordinatensystem man sich gerade befindet und ggf den Translationsvektor ins andere (schon gedrehte) Koordinatensystem transformieren.
-
hellihjb schrieb:
Das ist aber alles voellig unnoetig (und ggf wegen Trigonometrie numerisch instabil) da Du den Richtungsvektor schon hast und nur zwei Kreuzprodukte brauchst um die Matrix aufzustellen.
Stimmt, bin da auch schon über sowas gestolpert, vor allem Gimbal Lock ist recht unschön.
hellihjb schrieb:
Da Matrizen nicht kommutativ sind muss man sich im Klaren ueber die Reihenfolge sein bzw in welchem Koordinatensystem man sich gerade befindet und ggf den Translationsvektor ins andere (schon gedrehte) Koordinatensystem transformieren.
Ah ok, ich denke ich habe das so richtig hinbekommen, denn die Drehung funktioniert nun fast einwandfrei, vielen Dank dafür!
Das einzigste was mir noch aufgefallen ist, dass bei bestimmten Richtungen die Objekte teilweise verkleinert dargestellt werden, was eigentlich bei einer Drehung nicht passieren sollte.
Eventuell stimmt etwas an meiner Implementierung nicht?Hier mal mein Code:
Vector up(0,1,0); Vector z = direction.normalize(); Vector x = crossproduct(z,up); Vector y = crossproduct(x,z); glPushMatrix(); GLfloat matrix[16]; matrix[0]=x.x; matrix[4]=y.x; matrix[8]=z.x; matrix[12]=0; matrix[1]=x.y; matrix[5]=y.y; matrix[9]=z.y; matrix[13]=0; matrix[2]=x.z; matrix[6]=y.z; matrix[10]=z.z; matrix[14]=0; matrix[3]=0; matrix[7]=0; matrix[11]=0; matrix[15]=1; glTranslatef(direction.x,direction.y,direction.z); glMultMatrixf(&matrix[0]); DrawObject(); glPopMatrix();
-
dein x ist nicht normalisiert
-
Herzlichen Dank an alle, jetzt klappt es!