2012-12-12 11 views
5

Jestem zdezorientowany, jak konwertować współrzędne przestrzeni na świecie na współrzędne kamery.Przestrzeń światowa do przestrzeni kamery

My obecna wiedza jest to, że potrzebne do obliczenia wektora przestrzeni aparatu w

n = odsunięcie źrenicy wyjściowej - lookat

U = do (0,1,0) X N (znormalizowane)

v = n X u

Więc raz mam < U, V, N> czy po prostu pomnożyć każdy punkt przez?

Odpowiedz

3

Załóżmy:

  • położenia oka jest e = (e_x, e_y, e_z)
  • kierunku obserwacji jest D = (d_x, d_y, d_z)
  • Up-Vector jest UP = (up_x, up_y, up_z)

teraz pierwszy skonstruować ortonormalną ramki:

  • R = DX się
  • U = RXD
  • teraz normalizacji D, R, U i posiada ramę ortonormalną do kamery (d, R, U)

W celu przekształcenia globalnego coord ramki do ramki cam-coord można zastosować następującą macierz 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 |

Jeśli krzywka nie jest umieszczona w miejscu pochodzenia globalnego trzeba także stosować tłumaczenie M_T:

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

W końcu kompletnym macierz transformacji z globalnym do CAM-coords jest:

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

btw. macierz , o której wspomniałeś w swoim poście, odpowiada (M_R)^- 1 = (M_R)^T w moim wpisie i jest odwrotną transformacją ... od kamer-kamer do globalnych sieci. – Dirk

+0

Dziękuję bardzo! Trochę to utknąłem i twoje wyjaśnienie było bardzo jasne i łatwe do naśladowania. +1 – Freddy

0

myślę, że jest to błąd w poprzednim poście

to matryca

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

powinny być (i przetestować go w OpenGL, ten jest w porządku)

| 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

Negatywność w D_z zależy od tego, czy system używa reguły prawej czy lewej ręki. OpenGL używa systemu praworęcznego, dlatego musisz zmodyfikować swoją matrycę (tj. Negatywne punkty z na ekranie na ekranie z prawą ręką) –

Powiązane problemy