Definieren in der Direct3D-Ansicht Der Matrix auf, wenn die Kamera ständig in Bewegung

StackOverflow https://stackoverflow.com/questions/252991

  •  05-07-2019
  •  | 
  •  

Frage

In meiner Direct3D-Anwendung kann die Kamera bewegt werden, um die Maus oder die Pfeiltasten. Aber wenn ich hart Code (0,1,0) als nach oben Richtungsvektor in LookAtLH, geht der Rahmenrohling bei einigen Orientierungen der Kamera.

Ich habe gelernt, auf die harte Weise, dass, wenn entlang der Y-Achse, (0,1,0) nicht mehr arbeitet als die Aufwärtsrichtung (scheint offensichtlich?) Suchen. Ich denke meine Richtung nach oben, um etwas anderes für jeden dieser Sonderfälle des Schaltens. Gibt es eine anmutige Art und Weise zu handhaben?

War es hilfreich?

Lösung

Angenommen, Sie einen Vektor berechnen kann nach vorne gerichtet (was Sie suchen auf - Ihre Position) und einen Vektor nach rechts (immer auf der XZ-Ebene, wenn Sie rollen kann). Normalisieren diese beiden Vektoren, dann nach oben vorwärts x rechts (wobei x Kreuzprodukt).

In der Regel können Sie stecken in Ihrem Gieren, Nicken und Rollen in eine Rotationsmatrix und drehen Sie die Achsenvektoren richtig zu machen, oben und nach vorne, aber ich denke, das ist, was Sie LookAtLH verwenden zu vermeiden.

Siehe http://en.wikipedia.org/wiki/Rotation_matrix#The_3- dimensional_rotation_matricies

Andere Tipps

Die anmutige Art und Weise zu handhaben ist Einheit Quaternionen zu verwenden. Eine Quaternion ist ein Vektor von 4 Werten, die eine Orientierung im 3D-Raum (keine Drehung als einige Artikel behaupten) und eine Einheit Quaternion codiert ist eine, wo die Vektorlänge sqrt (x ^ 2 + y ^ 2 + z ^ 2 + w ^ 2) 1.0. Es gibt eine Reihe von mathematischen Operationen für mit Quaternionen arbeiten, die Matrizen sind analog zur Verwendung von Drehungen zu codieren, mit dem zusätzlichen Bonus, dass quaternions nie eine degenerierte Orientierung darstellen kann. Sie können frei quaternions auf eine 3x3 oder 4x4 Matrix konvertieren, wenn Sie das Ergebnis in eine GPU müssen ernähren.

Ihr Problem ist, dass, während Sie Ihre Kamera bewegen, werden Sie einen kleinen Twist in die Kamera nach oben Richtung einzuführen. Durch zwingt die Kamera neu zu zentrieren sich auf der (0,1,0) Vektor jeder Iteration, Sie sind in der Tat die Kamera zu drehen und dann der Kameraausrichtung Klemm auf der Oberfläche einer Kugel zu bleiben, aber wenn Sie Ihre Kamera trifft die Pol dieser Sphäre gibt es keine gute Richtung „oben“ und Ihre Matrix geht singulär zu rufen und gibt Ihnen Größe Null Polygone (daher auch der schwarze Bildschirm). Quaternionen haben die Fähigkeit, durch diese Pole zu interpolieren und gerade fein auf die andere Seite kommen, können Sie mit einem gültigen Matrix jederzeit verlassen. alles, was Sie tun müssen, ist die „Twist“.

Kontrolle

Mit dieser Wendung messen Sie Ken Shoemake des Artikel lesen sollten „Fiber Bundle Twist Reduction“ in dem Buch Graphics Gems 4. Er zeigt eine gute Möglichkeit, diese akkumulierte Wendung zu messen und wie es zu entfernen, wenn es anstößig ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top