Du bist nicht angemeldet.

Werbeanzeige

11

12.03.2021, 01:41

Ich glaube nicht, dass dein Problem durch Gimbal-Lock kommt, und Quaternionen solltest du dafür auch nicht brauchen. Am besten mal nachlesen, wie man eine Rotationsmatrix um eine beliebige Achse aufstellt (angegeben durch einen Vektor); dadurch lassen sich all deine Probleme Lösen. Du gibst dann einfach die Drehachse über einen Vektor im globalen Raum an, und erstellst daraus eine Transformationsmatrix, um die Kamera zu transformieren.


Genau das war mein ansatz. Für eine Rotation um beliebige Achse verwende ich die xna/mono funktion Matrix.CreateFromAxisAngle und "zur hälfte" funktioniert das auch schon. Gut dass ich mir die Q. mit allem was da dran hängt sparen kann - mein hirn hat sich schon im keller verkrochen ;)

So wie ich den Gimbal Lock gelesen habe, als 3d graphik definition habe ich auch erst gedacht, es ist nicht das problem. Dann habe ich aber die grafik aus der mechanik [1] gesehen. das zusammen mit der definition aus der grafik-abteilung ergab dann sinn: 2 oder mehr achsen überschneiden sich, was zu einem "verlust" bzw, freiheitsgrad des systems in 1 oder mehr achsen führt. Deshalb dachte ich das ergibt sinn und habe ich auf die aussage "quaternionen" der 2 kameraden verlassen. Aber vermutlich ist meine definition der problematik nur ein teilaspekt. Wenn es so ist, dass Q. nur einen eleganteren, performanteren Weg darstellen ist die aussage "Dazu brauchst du Quaternionen" ja eh quatsch.

[1] https://en.wikipedia.org/wiki/Gimbal_loc…_Lock_Plane.gif

12

12.03.2021, 01:53

Dieser Beitrag hier und die antwort von dem @David Scherfgen sieht mir vielversprechend aus.

Direct3D - Rotation der Kameraansicht nur von 0° bis 180°!

sinus/cosinus hatte ich auch mal ausgepackt, war aber verkehrter ansatz. NAja anlauf 3 oder 4 wo ich jetzt dann bin sollte dann doch endlich mal klappen :p

Jonathan

Community-Fossil

  • Private Nachricht senden

13

12.03.2021, 10:52

Hier nochmal in abstrakter Form was du tun solltest:

Speicher die 'Sichtrichtung' des Spielers als Matrix. Quasi deine View-Matrix. Wenn du die Kamera drehen willst, berechne diese Matrix nicht neu sondern multipliziere sie mit einer neuen Matrix, die diese Drehung beinhaltet (also z.B. 2 Grad um die Z-Achse). Das Ergebnis ist dann deine neue Matrix.Ist das numerisch instabil, orthonormalisiere die Matrix ab und zu (wie oben beschrieben). Wenn du dich statt um die lokale um die globale Achse drehst, ändere die Reihenfolge der Matrixmultiplikation.
Lieber dumm fragen, als dumm bleiben!

14

12.03.2021, 14:00

Hier nochmal in abstrakter Form was du tun solltest:

Speicher die 'Sichtrichtung' des Spielers als Matrix. Quasi deine View-Matrix. Wenn du die Kamera drehen willst, berechne diese Matrix nicht neu sondern multipliziere sie mit einer neuen Matrix, die diese Drehung beinhaltet (also z.B. 2 Grad um die Z-Achse). Das Ergebnis ist dann deine neue Matrix.Ist das numerisch instabil, orthonormalisiere die Matrix ab und zu (wie oben beschrieben). Wenn du dich statt um die lokale um die globale Achse drehst, ändere die Reihenfolge der Matrixmultiplikation.


Ach so macht man das :rolleyes:

Ich habe auf Basis "CameraPosition", "CameraTarget" und "AxisAngles" die ganze ViewMatrix jedesmal neu berechnet... In der "stabilen" Version. In der aufakkumulierten Version hab ich es ähnlich gemacht, nur dass ich "CameraPosition", "CameraTarget" und "AxisAngles" auch erstmal berechnet habe mit den Werten aus dem letzten frame...

D.h. ich verfahre so dann auch für die Kameraposition, ich gebe der View matrix eine translation mit und die Target und Position brauche ich nur einmal beim initialisieren des Programms?

Leuchtet mir ein... Kostet ja viel weniger so :p

Jonathan

Community-Fossil

  • Private Nachricht senden

15

13.03.2021, 10:06

Könntest du vermutlich, aber musst du nicht unbedingt. Vielleicht ist es netter, die Position wirklich nur als 3D Vektor zu speichern, und daraus dann zum Rendern entsprechend eine Matrix zu erzeugen, die man dann mit der Rotationsmatrix kombiniert. Matrixoperationen sind ein wenig teurer als Vektoroperationen, aber wichtiger ist es glaube ich, dass du eine Intuition dafür hast, was da eigentlich passiert, und dass das Endergebnis immer stimmt.
Ich finde es sehr nützlich, Matrizen als Transformationen zwischen Koordinatensystemen zu betrachten. Und Koordinatensysteme sind einfach nur 3 Vektoren, also das, was du mit Daumen, Zeigefinger und Mittelfinger machen kannst.
Lieber dumm fragen, als dumm bleiben!

16

13.03.2021, 17:17

also das, was du mit Daumen, Zeigefinger und Mittelfinger machen kannst.


oder mit einem stück pizzakarton 8o

Jonathan

Community-Fossil

  • Private Nachricht senden

17

13.03.2021, 18:15

Pizzakarton??

Ich meinte sowas hier: https://de.wikipedia.org/wiki/Drei-Finger-Regel
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige