000
20.08.2008, 21:04 Uhr
cmos
|
Hallo, ich habe eine Kameraklasse die mit gluLookAt arbeitet. Ich kann mich durch die Szene bewegen und rotieren funktioniert auch. Allerdings möchte ich nun noch einbauen das man um einen Punkt die Kamera rotieren kann. Um den Urpsrung, also 0,0,0 , würde mir schon erstmal reichen.
Bisher sieht die rotations funktio wie folgt aus. Bietet aber noch keine Rotation um einen Punkt.
C++: |
void CCamera::RotateX(float fArg) { m_mRotationMatrix.SetXRotationMatrix(fArgument); m_vViewVector = (m_mRotationMatrix * m_vViewVector).Normalize(); m_vUpVector = (m_mRotationMatrix * m_vUpVector).Normalize(); //m_vUpVector = Vector3f::CrossProduct(m_vViewVector,m_vRightVector); }
|
Mein Problem dabei ist, das die Rotationen, wenn ich sie mische, also x rotieren, y rotieren usw. nicht ganz stimmen. Wenn ich nur in eine richtung rotiere funktioniert es, aber wenn z.b. auf eine x rotation eine y rotation folgt, dann wird die y rotation nicht korrekt ausgeführt. Sieht manchmal so aus, als würde dann das Objekt nicht um y rotieren sonder wie ein Uhrenpendel hin und herschwingen.
Als erstes kam mir die Idee, die Kameraposition in den Ursprung zu verlgen, da das der Punkt ist um den ich rotieren möchte. Ich speichere also den Vektor von Kamera zu Ursprung, da der Betrag mir ja auch die Distanz zwischen Kamera und Punkt gibt. Dann setz ich die Kameraposition auf 0,0,0, rotiere dort die Kamera. Dann bilde ich einen Vektor von der Kameraposition (jetzt 0,0,0) zum rotierten Viewvector der Kamera. dieser wird normalisiert und mit dem Betrag des gespeicherten Distanzvektors multipliziert. Dann verschiebe ich die Kamera entlang dieses Vektors wieder zurück, allerdings in eine neue Position die aber genauso weit entfernt ist, wie vor der rotation. Der Aufruf von gluLookAt sieht dann bei mit so aus.
C++: |
void CCamera::SetCameraPosition() { //m_vTargetPos ist bei mir der URsprung also 0,0,0 um den ich rotieren möchte Vector3f vViewPoint = m_vTargetPos - m_vPosition;
gluLookAt(m_vPosition.X(),m_vPosition.Y(),m_vPosition.Z(), vViewPoint.X(),vViewPoint.Y(),vViewPoint.Z(), m_vUpVector.X(),m_vUpVector.Y(),m_vUpVector.Z() ); }
|
Das hat nicht so richtig funktioniert, eigentlich gar nicht. Als nächstes habe ich dann probiert, einfach die Kameraposition zu rotieren und dann, bei gluLookAt einen Vektor von der Kamera zum Ursprung zu bilden. Also guckt die Kamera ja dann jedensmal nach dem rotieren auf 0,0,0. Der Up Vector und Right Vector der Kamera sind ja relativ zur Kameraposition, deswegen hab ich mir gedacht, das diese Variante funktionieren müsste. gluLookAt sieht hier so aus wie oben schon erwähnt.
Manchmal kam es auch vor, das sich das Objekt ab einen bestimmten Winkel in die entgegengesetzte Richtung gedreht hat, dann wieder beim Rückrotieren ab einer stelle wieder in die Entgegengesetzte Richtung usw.
Kann mir jemand bitte weiterhelfen ? Ich möchte gluLookAt gern beibehalten, da ich mich mit glMultMatrix usw noch nicht so auskenne bzw. nicht weiß wie ich da um einen bestimmtn Punkt rotiere und 2. benötige ich spätere bearbeitung den Viewvektor der Kamera.
Hier noch der code für die 2 Versuche um den Punkt zu rotieren
C++: |
void CCamera::RotateCameraX(float fArgument) { //Vector3f vDistance = m_vTargetPos - m_vPosition; //// rotate camera X //m_mRotationMatrix.SetXRotationMatrix(fArgument); //m_vViewVector = (m_mRotationMatrix * m_vViewVector).Normalize(); //m_vUpVector = (m_mRotationMatrix * m_vUpVector).Normalize();
//1. Variante //// set camera to origin //m_vPosition.SetAll(0.0f, 0.0f, 0.0f);
//// compute direction vector from Null position to view vector //Vector3f vDirection = m_vViewVector - m_vPosition; // //// translate cameraposition in direction-vector direction //m_vPosition = m_vPosition + (vDirection * -vDistance.Magnitude());
// 2. Variante //m_mRotationMatrix.SetXRotationMatrix(fArgument); //m_vPosition = m_mRotationMatrix * m_vPosition; }
|
Grüße, und dank schon im Vorraus
cmos Dieser Post wurde am 20.08.2008 um 21:06 Uhr von cmos editiert. |