2012-12-12 18 views
5

Ich bin verwirrt, wie Welt Weltraum Koordinaten zu Kamerakoordinaten zu konvertieren.Welt Raum zu Kamera-Raum

Mein gegenwärtiges Verständnis ist, dass ich brauchen würde, um die Kamera in dem Raumvektor

n = eyepoint berechnen -

u = bis (0,1,0) X n (normalisiert)

lookat

v = n X u

Dann wenn ich einmal < U, V, N> würde ich einfach jeden Punkt multiplizieren?

Antwort

3

Nehmen wir an:

  • Augenposition ist E = (e_x, e_y, E_Z)
  • Blickrichtung ist D = (d_x, d_y, d_z)
  • Aufwärts-Vektor ist UP = (aufwärts_x, aufwärts_y, aufwärts_z)

nun zunächst ein orthonormal Rahmen konstruieren:

  • R = DX UP
  • U = RXD
  • normalisieren Nun D, ​​R, U und Sie haben eine orthonormal Rahmen für die Kamera (D, R, U)

um den globalen Koord Rahmen in den nocken Koord-Rahmen zu transformieren Sie die folgende Matrix M_R anwenden können:

  • | R_x, R_y, R_z, 0 |
  • | U_x, U_y, U_z, 0 |
  • | -D_x, -D_y, -D_z, 0 |
  • | 0,0, 0,0, 0,0, 1.0 |

Wenn Ihr Nocken nicht auf globaler Herkunft positioniert ist, man muss auch M_T eine Übersetzung zu aktualisieren:

  • | 1, 0, 0, -e_x |
  • | 0, 1, 0, -e_y |
  • | 0, 0, 1, -e_z |
  • | 0, 0, 0, 1 |

Am Ende Ihrer kompletten Transformations-Matrix von den globalen to-coords cam ist:

  • M = M_R * M_T
  • | R_x, R_y, R_z, (R dot -E) |
  • | U_x, U_y, U_z, (U dot -E) |
  • | -D_x, -D_y, -D_z, (D Punkt E) |
  • | 0,0, 0,0, 0,0, 1,0 |
+0

übrigens. Die Matrix, die Sie in Ihrem Post erwähnt haben, entspricht (M_R)^- 1 = (M_R)^T in meinem Post und ist die inverse Transformation ... von Nocken-Koordinaten zu globalen Koordinaten. – Dirk

+0

Vielen Dank! Ich war ein bisschen dran und deine Erklärung war sehr klar und einfach zu folgen. +1 – Freddy

0

Ich denke, es ist ein Fehler in der früheren Post

diese Matrix

| R_x, R_y, R_z, (R dot -E) | 
| U_x, U_y, U_z, (U dot -E) | 
| -D_x, -D_y, D_z, (D dot E)| 
| 0.0, 0.0, 0.0, 1.0| 

sollte (ich es in openGL testen, dann ist dies ein Recht)

| R_x, R_y, R_z, (R dot -E) | 
| U_x, U_y, U_z, (U dot -E) | 
| -D_x, -D_y, -D_z, (D dot E)| 
| 0.0, 0.0, 0.0, 1.0| 
+0

Das Negativ in D_z hängt davon ab, ob das System die rechte oder die linke Regel verwendet. OpenGL verwendet das rechtshändige System, weshalb Sie Ihre Matrix ändern mussten (d. H. Negative z-Punkte auf dem Bildschirm in einem rechtshändigen Bildschirm) –