2012-12-12 13 views
5

Sono confuso su come convertire le coordinate dello spazio del mondo in coordinate della telecamera.Spazio mondiale nello spazio della fotocamera

mia comprensione attuale è che avrei avuto bisogno di calcolare il vettore spazio telecamera in cui

n = eyepoint - LookAt

u = up (0,1,0) X n (normalizzato)

v = n X u

Quindi una volta che ho < U, V, N> dovrei semplicemente moltiplicare ogni punto per?

risposta

3

Assumiamo:

  • posizione dell'occhio è E = (e_x, e_y, e_z),
  • direzione di osservazione è D = (d_x, d_y, d_z)
  • Up-Vector è UP = (up_x, up_y, up_z)

Subito prima costruire un telaio ortonormale:

  • R = DX UP
  • U = RXD
  • Ora normalizzare S, R, U e si dispone di un telaio ortonormale per la telecamera (D, R, U)

per trasformare il telaio Coord globale nel telaio camma coord è possibile applicare la seguente matrice M_R:

  • | 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 |

Se la camma non è posizionata in origine globale si hanno anche per applicare una traduzione M_T:

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

Alla fine il tuo matrice completa trasformazione dal globale al Cam-coords è:

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

btw. la matrice che hai menzionato nel tuo post corrisponde a (M_R)^- 1 = (M_R)^T nel mio post ed è la trasformazione inversa ... dai cam-coords alle coords globali. – Dirk

+0

Grazie mille! Sono rimasto bloccato per un po 'e la tua spiegazione è stata molto chiara e facile da seguire. +1 – Freddy

0

Credo v'è un errore nel precedente post

questa matrice

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

dovrebbe essere (provo in openGL, questo è quello giusto)

| 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

Il negativo in D_z dipende dal fatto che il sistema utilizzi la regola della mano destra o sinistra. OpenGL usa il sistema della mano destra, ed è per questo che dovevi modificare la tua matrice (cioè punti z negativi nello schermo in una schermata destra) –

Problemi correlati