2010-09-08 21 views
6

Próbuję wyświetlić serię punktów 3D na ekranie za pomocą perspektywicznej matrycy kamery. Nie mam przestrzeni świata (lub uważam, że jest to matryca tożsamości), a moja kamera nie ma miejsca na kamerę (lub uważam ją za matrycę tożsamości), mam matrycę 4x4 dla mojej przestrzeni obiektów.Wyświetlanie punktu 3D na ekranie 2D za pomocą kamery z perspektywiczną kamerą

Biorę matrycy obiektu i pomnożenie jej przez macierz perspektywy kamery, wytworzonej z następującym sposobem:

Matrix4 createPerspectiveMatrix(Float fov, Float aspect, Float near, Float far) 
{ 
    Float fov2 = (fov/2) * (Math.PI/180); 
    Float tan = Math.tan(fov2); 
    Float f = 1/tan; 

    return new Matrix4 ( 
     f/aspect, 0, 0, 0, 
     0, f, 0, 0, 
     0, 0, -((near+far)/(near-far)), (2*far*near)/(near-far), 
     0, 0, 1, 0 
    ); 
} 

ja następnie odrywając punkt [X, Y, Z, 1], a następnie mnożąc przez wynikowe mnożenie macierzy perspektywy i macierzy obiektów.

Następna część jest tym, w czym się mylę, jestem prawie pewien, że muszę uzyskać te punkty w przedziale -1 i 1 lub 0 i 1, oraz w przypadku posiadania pierwszy zestaw wartości, a następnie pomnożyć punkty przez szerokość i wysokość ekranu dla współrzędnych ekranu wartości xiy odpowiednio lub pomnożyć wartości przez wysokość ekranu/2 i szerokość/2 i dodać te same wartości do odpowiednich punktów.

Każdy krok po kroku mówiący mi, jak można to osiągnąć lub gdzie mógłbym pójść źle z którymkolwiek z tego byłby ogromnie doceniony !! : D

Pozdrawiam wszystkich!

P.S. W przykładzie macierzy tożsamości/tłumaczenia mój format macierzy w moim modelu to:

[1, 0, 0, tx, 
0, 1, 0, ty, 
0, 0, 1, tz, 
0, 0, 0, 1 ] 
+0

Tak? Czy to działa? :) – Stringer

+0

Przepraszam, że chcę sprowadzić zmarłych i wszystkich ... Ale w twoim kodzie 'createPerspectiveMatrix' nie powinieneś używać' matrix.m32 = 1.0' i 'matrix.m33 = 0.0'? Jeśli pierwotnie miała to być matryca tożsamości "wypełniona", to wartości te wydają się być zamienione w twoim kodzie. – RectangleEquals

+0

Dzięki, od kiedy zadałem to pytanie, napisałem Zest3D http://www.zest3d.com, więc wymyśliłem to. :) –

Odpowiedz

5

Twoim problemem jest zapomnienie o wykonaniu podziału perspektywy.

Podział perspektywy oznacza, że ​​dzielisz składowe x, yi z punktu przez jego składową w. to wymagane dla przekształcania punkt z Jednorodny 4D przestrzeni się znormalizowanego urządzenia układ współrzędnych (NDCS), w którym każdy składnik X, Y lub Z mieści się pomiędzy 1 i 1 lub 0 i 1.

Po ta transformacja pozwala wykonać transformację rzutni (pomnożyć punkty przez szerokość ekranu, wysokość itd.).

Jest dobry widok tej transformacji rurociągu w książce Foley'a (grafika komputerowa: Principles and Practice w C), można go zobaczyć tutaj:

http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html