2010-09-08 36 views
6

Estoy intentando proyectar una serie de puntos 3D en la pantalla usando una matriz de cámara en perspectiva. No tengo espacio en el mundo (o lo considero una matriz de identidad) y mi cámara no tiene espacio de cámara (o lo considero una matriz de identidad), tengo una matriz de 4x4 para mi espacio de objetos.Proyección de un punto 3D a espacio de pantalla 2D utilizando una matriz de cámara en perspectiva

hago uso de la matriz de objeto y multiplicarlo por la matriz perspectiva de la cámara, generado con el siguiente método:

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

entonces estoy tomando mi punto [x, y, z, 1] y multiplicando ese por la multiplicación resultante de la matriz de perspectiva y la matriz de objetos.

La siguiente parte es donde me confunden, estoy bastante seguro de que necesito obtener estos puntos dentro de los rangos de -1 y 1, o 0 y 1, y, en el caso de tener el primer conjunto de valores, multiplicaría los puntos por el ancho y el alto de la pantalla por las coordenadas de pantalla xey, respetuosamente o multiplicaría los valores por la altura de la pantalla/2 y el ancho/2 y agregaría los mismos valores a los puntos respectivos.

¡Cualquier paso por paso diciéndome cómo se podría lograr esto o dónde podría estar yendo mal con algo de esto sería enormemente apreciado! : D

Saludos cordiales a todos!

P.S. En el ejemplo de una matriz de identidad/traducción, mi forma de matriz en mi modelo es:

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

Entonces? Esto funciona? :) – Stringer

+0

Perdón por traer a los muertos y todo ... Pero en tu código 'createPerspectiveMatrix', ¿no deberían' matrix.m32 = 1.0' y 'matrix.m33 = 0.0'? Si originalmente se pretendía que fuera una matriz de identidad "completa", esos valores parecen intercambiarse en su código. – RectangleEquals

+0

Gracias, ya que hice esta pregunta, escribí Zest3D http://www.zest3d.com, así que lo descubrí. :) –

Respuesta

5

Su problema es que se olvida de llevar a cabo la división perspectiva.

División en perspectiva significa que divide el componente x, y y z de su punto por su componente w. Esto es necesario para la transformación de su punto de homogéneo 4D Espacio-Dispositivo Normalizado sistema de coordenadas (NDCS) en el que cada componente de x, y o z cae entre -1 y 1, o 0 y 1.

Después esta transformación, puede hacer su transformación de ventana gráfica (multiplicar puntos por ancho de pantalla, altura, etc.).

Hay una buena vista de esta tubería de transformación en el libro de Foley (Computer Graphics: Principios y Práctica en C), se puede ver aquí:

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

Cuestiones relacionadas