2009-03-29 10 views

Odpowiedz

12

Macierz transformacji świat-kamera jest odwrotnością matrycy kamera-świat. Macierz kamera-świat jest połączeniem tłumaczenia z pozycją kamery i obrotem do orientacji kamery. Tak więc, jeśli M jest macierz obrotu 3x3 odpowiadający aparatu orientacji i t jest położenie aparatu, a następnie aparat do świata macierz 4x4:

 
M00 M01 M02 tx 
M10 M11 M12 ty 
M20 M21 M22 tz 
0 0 0 1 

Zauważ, że mam przyjąć, że wektory są wektorami kolumnowymi, które mnożą się na prawo do wykonywania transformacji. Jeśli używasz odwrotnej konwencji, upewnij się, że transponujesz macierz.

Aby znaleźć M, można użyć jednej z formuł wymienionych na Wikipedia, w zależności od konkretnej konwencji dotyczącej przechyłu, wysokości i odchylenia. Należy pamiętać, że te formuły używają konwencji, że wektory są wektorami wierszowymi, które są mnożone po lewej stronie.

Zamiast obliczać matrycę kamera-świat i odwracać ją, bardziej wydajną (i stabilną pod względem numerycznym) alternatywą jest bezpośrednie obliczanie matrycy świat-kamera. Aby to zrobić, po prostu odwróć pozycję kamery (negując wszystkie 3 współrzędne) i jej orientację (poprzez zanegowanie przechyłu, nachylenia i kątów odchylenia i dostosowując je do odpowiednich zakresów), a następnie oblicz macierz przy użyciu tego samego algorytm.

-5

To, co opisujesz, nazywa się "Projekcja perspektywy", a w sieci są różne zasoby, które wyjaśniają matematykę matematyczną i podają kod niezbędny do tego. Można zacząć od wikipedia page

7

Jeśli mamy strukturę jak to opisać macierz 4x4:

class Matrix4x4 
{ 
public: 
    union 
    { 
     struct 
     { 
      Type Xx, Xy, Xz, Xw; 
      Type Yx, Yy, Yz, Yw; 
      Type Zx, Zy, Zz, Zw; 
      Type Wx, Wy, Wz, Ww; 
     }; 

     struct 
     { 
      Vector3<Type> Right; 
      Type XW; 
      Vector3<Type> Up; 
      Type YW; 
      Vector3<Type> Look; 
      Type ZW; 
      Vector3<Type> Pos; 
      Type WW; 
     }; 

     Type asDoubleArray[4][4]; 
     Type asArray[16]; 
    }; 
}; 

Jeżeli wszystko co masz, to kąty Eulera, który jest kąty reprezentujące odchyłu, skoku i rolki i punkt w przestrzeni 3d dla pozycji, można obliczyć wektorów Prawo, Góra i Wygląd. Zwróć uwagę, że Prawa, Góra i Wygląd to tylko X, Y, Z Vectors, ale ponieważ jest to kamera, łatwiej jest ją nazwać. Najprostszym sposobem zastosowania swoich układów do matrycy kamery jest zbudowanie szeregu macierzy rotacyjnych i pomnożenie naszej matrycy kamery przez każdą macierz obrotu.

Dobrym odniesienia, który jest tutaj: http://www.euclideanspace.com

Po zastosowaniu wszystkich potrzebnych obroty można ustawić Poz wektor do pozycji aparatu w przestrzeni światowej.

Na koniec, przed zastosowaniem transformacji kamery należy wykonać odwrotną stronę matrycy kamery. To właśnie zamierzasz pomnożyć macierz modelu przed rozpoczęciem rysowania wielokątów. Dla klasy matrycy powyżej odwrotnością jest obliczana następująco:

template <typename Type> 
Matrix4x4<Type> Matrix4x4<Type>::OrthoNormalInverse(void) 
{ 
    Matrix4x4<Type> OrthInv; 
    OrthInv = Transpose(); 
    OrthInv.Xw = 0; 
    OrthInv.Yw = 0; 
    OrthInv.Zw = 0; 
    OrthInv.Wx = -(Right*Pos); 
    OrthInv.Wy = -(Up*Pos); 
    OrthInv.Wz = -(Look*Pos); 
    return OrthInv; 
} 

Więc w końcu, z całej naszej constuction matrycy z drogi, można byłoby zrobić coś takiego:

Matrix4x4<float> cameraMatrix, rollRotation, pitchRotation, yawRotation; 
Vector4<float> cameraPosition; 

cameraMatrix = cameraMatrix * rollRotation * pitchRotation * yawRotation; 

Matrix4x4<float> invCameraMat; 

invCameraMat = cameraMatrix.OrthoNormalInverse(); 

glMultMatrixf(invCameraMat.asArray); 

nadzieję, że ten pomaga.

Powiązane problemy