Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Alter Hase
Alter Hase
Zitat von »"Phil_GDM"«
Ich glaub er meint, dass er die Kamera rotiert, bis die Z-achse der Kamra mit der Y-Achse des Weltkoordinatensytems übereindander liegt, wenn er dann eine Rotation um die Y-achse im Weltkoordinatensystem ausführt, dreht sich das Bild natürlich nur mehr.
Die Lösung, du darfst die Kamera nicht im Weltkoodinatensystem rotieren, sondern du musst die Rotationen im Objekt-Koordinatensystem ausführen.
Alter Hase
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Rotieren des Objekts, um seine eigenen Achsen void tbObject::RotateRel(const tbVector3& vRotation) { // Rotation um die x-Achse des Objekts tbMatrix mRotation(tbMatrixRotationAxis(m_vXAxis, vRotation.x)); m_vYAxis = tbVector3TransformNormal(m_vYAxis, mRotation); m_vZAxis = tbVector3Cross(m_vXAxis, m_vYAxis); // Rotation um die y-Achse des Objekts mRotation = tbMatrixRotationAxis(m_vYAxis, vRotation.y); m_vXAxis = tbVector3TransformNormal(m_vXAxis, mRotation); m_vZAxis = tbVector3Cross(m_vXAxis, m_vYAxis); // Rotation um die z-Achse des Objekts mRotation = tbMatrixRotationAxis(m_vZAxis, vRotation.z); m_vXAxis = tbVector3TransformNormal(m_vXAxis, mRotation); m_vYAxis = tbVector3TransformNormal(m_vYAxis, mRotation); // Matrizen aktualisieren Update(); } |
Zitat von »"Phil_GDM"«
Nein, du lässt die Kamera nicht starr. Nur rotierst du sie nicht mit der "normalen" Y-Rotationsmatrix sondern mit einer Achsenmatrix, welche für Rotationen um Achsen, die nicht mit den Weltachsen übereinstimmen verwendet wird, so eine Matrix wird z.B. von D3DXMatrixRoationAxis(...) erstellt.
Hier ein Beispiel das zeigt, wie David das in seinem Buch gemacht hat:
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // Rotieren des Objekts, um seine eigenen Achsen void tbObject::RotateRel(const tbVector3& vRotation) { // Rotation um die x-Achse des Objekts tbMatrix mRotation(tbMatrixRotationAxis(m_vXAxis, vRotation.x)); m_vYAxis = tbVector3TransformNormal(m_vYAxis, mRotation); m_vZAxis = tbVector3Cross(m_vXAxis, m_vYAxis); // Rotation um die y-Achse des Objekts mRotation = tbMatrixRotationAxis(m_vYAxis, vRotation.y); m_vXAxis = tbVector3TransformNormal(m_vXAxis, mRotation); m_vZAxis = tbVector3Cross(m_vXAxis, m_vYAxis); // Rotation um die z-Achse des Objekts mRotation = tbMatrixRotationAxis(m_vZAxis, vRotation.z); m_vXAxis = tbVector3TransformNormal(m_vXAxis, mRotation); m_vYAxis = tbVector3TransformNormal(m_vYAxis, mRotation); // Matrizen aktualisieren Update(); }
[edit] viell. solltest du dir auch überlegen deine Kamera mit Quaternions zu rotieren, da du ansonsten Probleme mit Gimbal Lock bekommen könntest
Werbeanzeige