2010-07-25 14 views
8

Sto scrivendo il mio rasterizzazione software in Java, e mi sono imbattuto in alcuni problemi con esso ... date un'occhiata un'immagine campione a, per favore:Proiezione prospettica: come posso proiettare i punti che si trovano dietro la 'fotocamera'?

Image

Questo campione solo disegnare semplice griglia quadrata su un aereo. Tutto funziona bene finché non muovo la fotocamera abbastanza vicino perché alcuni punti si muovano dietro di essa. Dopodiché, non vengono più proiettati correttamente, come puoi vedere (linee verticali - i punti che dovrebbero essere posizionati dietro la telecamera sono proiettati sulla parte superiore dello schermo).

miei matrici di trasformazione e vettori sono quelle stesse DirectX utilizza (PerspectiveFovLH per proiezione, LookAtLH per telecamera).

sto usando seguente metodo di trasformazione per proiettare punti 3D:

  1. 3D vettore di essere trasformati viene creato.
  2. Il vettore viene moltiplicato per la matrice ViewProjection.
  3. Dopo di che, il punto si trasforma per lo screening con il metodo seguente:

    // '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); 
    

Come ho detto prima, funziona benissimo fino a punto si muove dietro la macchina. Il fatto è che riesco a capire quando il punto è dietro la macchina da presa (testando il suo valore Z dopo la trasformazione finale), ma dal momento che sto disegnando linee e altri oggetti basati sulla linea, non posso semplicemente saltare quel punto.

Quindi ho provato a impostare la mia pipeline di trasformazione in base a l'articolo di Direct3D Transformation Pipeline su MSDN.

Purtroppo, non ho avuto fortuna con quello pure (stesso risultato), quindi ogni aiuto sarebbe molto apprezzato, dato che sono un po 'bloccato su questo.

Grazie.

migliori saluti, Alex

+0

Si sta configurando correttamente il piano di ritaglio anteriore della fotocamera? E poi prenderlo in considerazione durante il rendering? – ChrisF

+0

Il mio piano zNear è impostato su 1 e il piano zFar su 1000 unità. Ho provato a cambiare i valori, ma il problema persiste. Eventuali suggerimenti? – Alex

+0

È da un po 'che non eseguo questo tipo di operazioni, ma è necessario eseguire un'intersezione con il piano di ritaglio anteriore * prima * per proiettare la linea. – ChrisF

risposta

7

È necessario intersecare la linea con il piano di ritaglio anteriore nello spazio 3D e troncare la linea in modo si disegna solo il segmento di linea che è visibile:

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

You' abbiamo una linea xo dove x davanti al piano di ritaglio e o dietro di esso. Intersecare questa linea con il piano di ritaglio per generare il punto +. Sai che di x e o è visibile in modo disegnare la linea x-+.

In questo modo non si sta proiettando punti che sono dietro la macchina da presa.

+1

Grazie.Va bene se lo faccio nello spazio clip, dopo la trasformazione prospettica, prima della divisione prospettica (usando coordinate omogenee e w)? – Alex

+2

Sì, con tutti i mezzi. –

Problemi correlati