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:

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


BenBE - Mi 22.11.06 00:41

Um eine horizontale Bewegung auszuführen musst Du LookAt-Vektor um die Achse camUp um x° rotieren. Ein Routine um diese Rotation auszuführen findest Du z.B. hier [http://omorphia.cvs.sourceforge.net/omorphia/omorphia/library/source/OMathMatrix.pas]. Einfach MatrixRotationaufrufen um die Rotationsmatrix abzufragen und dann LookAtVektor mit dieser multiplizieren. Das andere sollte selbsterklärend sein.


UGrohne - Mi 22.11.06 08:14

user profile iconBenBE hat folgendes geschrieben:
Um eine horizontale Bewegung auszuführen musst Du LookAt-Vektor um die Achse camUp um x° rotieren. Ein Routine um diese Rotation auszuführen findest Du z.B. hier [http://omorphia.cvs.sourceforge.net/omorphia/omorphia/library/source/OMathMatrix.pas]. Einfach MatrixRotationaufrufen um die Rotationsmatrix abzufragen und dann LookAtVektor mit dieser multiplizieren. Das andere sollte selbsterklärend sein.

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);