Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Vektorrechnung in 3D-Anwendung
UGrohne - Di 21.11.06 16:41
Titel: Vektorrechnung in 3D-Anwendung
Hallo,
im Moment verlassen mich meine früheren Mathe-Kenntnisse. Ich möchte eine Drehen der Kamera mittels Mausbewegungen realisieren und irgendwie bekomme ich die horizontale Bewegung nicht hin.
Folgendes habe ich:
- Vektor LookAtVector, der die derzeitige Sichtrichtung angibt
- Vektor camPosition gibt die derzeitige Position der Kamera an
- Vektor camUp gibt die Richtung nach oben an, damit die Kamera weiß, wo oben ist im Moment ;)
camUp steht dabei senkrecht auf LookAtVector.
Jetzt möchte ich bei horzontaler Bewegung der Maus die Sicht - also LookAtVector - um einen bestimmten Winkel drehen. Meine bisherigen Versuche haben alle aber komische Bewegungen zur Folge ;)
Vielleicht kennt gerade jemand die Formel auswendig, wie ich den neuen Vektor bekomme.
Allesquarks - Di 21.11.06 16:46
Dazu brauchst du eine Drehmatrix im Dreidimensionalen => Wiki weiß ich nicht auswendig.
Vektor * Matrix:
a11 a12 a13.....x....a11*x+a12*y+a13*z
a21 a22 a23.*.. y.=.a21*x+a22*y+a23*z
a31 a32 a33.....z....a31*x+a32*y+a33*z
Edit: du kannst den Vektor natürlich auch in Kugelkoordinaten transformieren => wiki eine Drehung in diesem System ist dann tivial => Rücktrafos => Wiki
UGrohne - Mi 22.11.06 08:14
Genau das brauchte ich ;)
Jetzt muss ich nur schauen, wie ich das in C# und XNA übertragen kann, aber der Code hilft mir dabei sicher. Wobei XNA für solche Fälle etwas haben müsste, aber ich hab es noch nicht gefunden.
UGrohne - Mi 22.11.06 11:08
:autsch:
Mein vorheriger Code hatte schon funktioniert, nur dummerweise hatte ich einen Fehler beim initialen Vektor camUp gemacht. Dieser stand nicht senkrecht auf der Kamera, sondern seitlich davon. Und dann wunderte ich mich darüber, dass die Kamera einen Kreis beschrieb ...
Das hier war meine erste Formel und diese sollte auch funktionieren:
C#-Quelltext
1:
| LookAtVector = Vector3.Multiply(LookAtVector, (float)Math.Cos(camRotateX)) + Vector3.Multiply(camUp * LookAtVector, (float)(1 - Math.Cos(camRotateX))) + Vector3.Multiply(Vector3.Cross(camUp, LookAtVector), (float)Math.Sin(camRotateX)); |
Aber es geht auch viel einfacher, mit der Untestützung von XNA:
C#-Quelltext
1: 2:
| Matrix transform = Matrix.CreateFromAxisAngle(camUp, camRotateX); LookAtVector = Vector3.Transform(LookAtVector, transform); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!