2010-07-25 9 views
8

estoy escribiendo mi propia impresora de trama de software en Java, y me encontré con algunos problemas con él ... echar un vistazo a una imagen de muestra, por favor:Proyección de perspectiva: ¿cómo proyecto los puntos que están detrás de 'cámara'?

Image

Esta muestra simplemente dibujar cuadrícula sencilla en un avión. Todo funciona bien hasta que muevo la cámara lo suficientemente cerca para que algunos puntos se muevan detrás de ella. Después de eso, ya no se proyectan correctamente, como puede ver (líneas verticales: los puntos que deben estar detrás de la cámara se proyectan en la parte superior de la pantalla).

Mis matrices de transformación y vectores son los mismos que DirectX usa (PerspectiveFovLH para proyección, LookAtLH para cámara).

estoy usando siguiente método de transformación para proyectar puntos 3D:

  1. vector 3D para ser transformados se crea.
  2. El vector se multiplica por la matriz ViewProjection.
  3. Después de eso, el punto se transforma en la pantalla utilizando el método siguiente:

    // 'vector' is input vector in projection space 
    // projection to screen 
    double vX = vector.x/vector.z;   
    double vY = vector.y/vector.z; 
    
    //translate 
    //surfaceW is width and surfaceH is height of the rendering window. 
    vX = ((vX + 1.0f)/2.0f) * surfaceW; 
    vY = ((-vY + 1.0f)/2.0f) * surfaceH; 
    
    return new Vector3(vX, vY, vector.z); 
    

Como he dicho antes, que funciona bien hasta que punto se mueve detrás de la cámara. El hecho es que puedo averiguar cuándo el punto está detrás de la cámara (probando su valor Z después de la transformación final), pero como dibujo líneas y otros objetos basados ​​en líneas, no puedo omitir ese punto.

Luego intenté configurar mi canalización de transformación de acuerdo con El artículo de Direct3D Transformation Pipeline en MSDN.

Lamentablemente, no he tenido suerte con eso (los mismos resultados), por lo que cualquier ayuda sería muy apreciada, ya que estoy un poco atrapado en esta.

Gracias.

Best Regards, Alex

+0

¿Está configurando correctamente el plano de recorte frontal de su cámara? Y luego tenerlo en cuenta cuando renderizas? – ChrisF

+0

Mi plano zNear se establece en 1 y el plano zFar en 1000 unidades. Intenté cambiar los valores, pero el problema persiste. ¿Alguna sugerencia? – Alex

+0

Ha pasado un tiempo desde que hice este tipo de cosas, pero debe realizar una intersección con el plano de recorte frontal * antes * de proyectar la línea. – ChrisF

Respuesta

7

Es necesario que se cruzan la línea con el plano de recorte frontal en el espacio 3D y truncar la línea de lo que sólo se dibuja el segmento de recta que es visible:

   | 
      | 
      | 
x------------+-----------o 
      | 
      | 
      | * - camera 
      | 
      | 
      | 
     clipping plane 

Usted' Tengo una línea xo donde x en frente del plano de recorte y o detrás de ella. Intersecta esta línea con el plano de recorte para generar el punto +. Usted sabe cuál de x y o es visible, así que trace la línea desde x hasta +.

De esta manera no está proyectando puntos detrás de la cámara.

+1

Gracias.¿Está bien si hago eso en el espacio del clip, después de la transformación de perspectiva, antes de la división de perspectiva (usando coordenadas homogéneas yw)? – Alex

+2

Sí por todos los medios. –

Cuestiones relacionadas