2010-09-08 24 views
6

Je tente de projeter une série de points 3D sur l'écran à l'aide d'une matrice de caméra en perspective. Je n'ai pas d'espace du monde (ou je considère que c'est une matrice d'identité) et ma caméra n'a pas d'espace de caméra (ou la considère comme une matrice d'identité), j'ai une matrice 4x4 pour mon espace objet.Projection d'un point 3D vers un espace d'écran 2D à l'aide d'une matrice de caméra en perspective

Je prends la matrice de l'objet et en le multipliant par la matrice de point de vue de la caméra, générée avec la méthode suivante:

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 
    ); 
} 

Je puis en prenant mon point [x, y, z, 1] et en multipliant ce par la multiplication résultante de la matrice perspective et de la matrice objet. La partie suivante est l'endroit où je suis confuzzled, je suis assez sûr que je dois obtenir ces points dans les plages de -1 et 1, ou 0 et 1, et, dans le cas d'avoir le premier ensemble de valeurs, je multiplierais alors les points par la largeur et la hauteur de l'écran pour les coordonnées d'écran x et y respectivement ou multiplier les valeurs par la hauteur d'écran/2 et largeur/2 et ajouter les mêmes valeurs aux points respectifs.

Toute étape par étape en me disant comment cela pourrait être réalisé ou où je pourrais me tromper avec tout cela serait massivement apprécié !! : D

Cordialement à tous!

P.S. Dans l'exemple d'une matrice identité/traduction, mon format de matrice dans mon modèle est:

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

Alors? Est-ce que cela fonctionne? :) – Stringer

+0

Désolé de ramener les morts et tout ... Mais dans votre code 'createPerspectiveMatrix', ne devrait pas' matrix.m32 = 1.0' et 'matrix.m33 = 0.0'? Si cela devait initialement être une matrice d'identité «remplie», ces valeurs semblent être permutées dans votre code. – RectangleEquals

+0

Merci, puisque j'ai posé cette question, j'ai écrit Zest3D http://www.zest3d.com donc je l'ai compris. :) –

Répondre

5

Votre problème est que vous oubliez d'effectuer la division en perspective. Division de perspective signifie que vous divisez les composantes x, y et z de votre point par sa composante w. Ceci est nécessaire pour transformer votre point de Homogeneous 4D espace-Dispositif Normalized système de coordonnées (NDCS), dans lequel chaque composante x, y ou z est compris entre -1 et 1 ou 0 et 1.

Après cette transformation, vous pouvez faire votre transformation viewport (multiplier les points par la largeur de l'écran, la hauteur, etc).

Il y a une bonne vue de ce pipeline de transformation dans le livre de Foley (Computer Graphics: Principes et pratiques en C), vous pouvez le voir ici:

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