Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 21.11.06 16:41 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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. Einfach MatrixRotationaufrufen um die Rotationsmatrix abzufragen und dann LookAtVektor mit dieser multiplizieren. Das andere sollte selbsterklärend sein.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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. 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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:
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
Matrix transform = Matrix.CreateFromAxisAngle(camUp, camRotateX);
LookAtVector = Vector3.Transform(LookAtVector, transform);