Come ottenere risultati accurati con l'algoritmo di Painter?


14

Qualche tempo fa ho chiesto come determinare quando una faccia si sovrappone a un'altra. Il consiglio era di usare un buffer Z.

Tuttavia, non posso usare un buffer Z nel mio progetto attuale e quindi vorrei usare l'algoritmo di Painter. Tuttavia, non ho idea di quando una superficie sia dietro o davanti a un'altra. Ho provato numerosi metodi, ma tutti falliscono nei casi limite, o falliscono anche nei casi generali.

Questo è un elenco di metodi di ordinamento che ho provato finora:

  • Distanza dal punto medio di ciascuna faccia
  • Distanza media da ciascun vertice di ciascuna faccia
  • Valore z medio di ciascun vertice
  • Il più alto valore z dei vertici di ogni faccia e disegnali per primi
  • Il valore z più basso dei vertici di ciascuna faccia e disegna quelli ultimi

Il problema è che una faccia potrebbe avere una distanza più vicina ma è ancora più lontana. Tutti questi metodi sembrano inaffidabili.

Modifica: ad esempio, nell'immagine seguente la superficie con il punto blu come punto medio viene dipinta sulla superficie con il punto rosso come punto medio, poiché il punto blu è più vicino. Tuttavia, questo perché la superficie del punto rosso è più grande e il punto medio è più lontano. La superficie con il punto rosso dovrebbe essere dipinta su quella blu, perché è più vicina , mentre la distanza del punto medio dice il contrario.

inserisci qui la descrizione dell'immagine

Cosa viene utilizzato esattamente nell'algoritmo di Painter per determinare l'ordine in cui gli oggetti devono essere disegnati?


1
L' algoritmo dei pittori sta disegnando da dietro a davanti.
Jonathan Connell,

1
@ 3nixios: Sì, ovviamente, ma in che modo posso determinare l'ordine di "back to front"?
pimvdb,

1
Tutti i tuoi oggetti, triangoli o vertici saranno ad una certa distanza dalla fotocamera quando inizi a disegnare. L'implementazione dell'algoritmo di base (hai avuto successo?) Sarebbe quella di determinare questa distanza dalla telecamera per ogni triangolo e disegnarli nell'ordine più lontano dal più vicino. Una volta fatto ciò, è necessario iniziare a cercare incroci e tagliare i triangoli, che è un gioco di palla completamente diverso . Perché non puoi già usare Z-Buffer? : P
Jonathan Connell,

@ 3nixios: hai perfettamente ragione, ma il problema che sto affrontando è il calcolo della distanza. Come ho detto, ho provato diversi metodi di distanza ma non sono tutti perfetti. Questo ordine deriva dall'ordinamento della distanza del punto medio: i.imgur.com/AcfCm.png .
pimvdb,

1
Tutti i tuoi poligoni sono su una griglia normale come quella? In tal caso, potrebbero esserci delle cose specifiche della griglia che puoi fare per migliorare questo.
CiscoIPPhone

Risposte:


14

Solitamente la distanza del punto medio di un poligono dalla fotocamera viene utilizzata per l'ordinamento z. L'algoritmo del pittore non può essere preciso al 100% per sua natura. Ci saranno sempre casi in cui l'ordinamento fallirà, indipendentemente dal punto di riferimento che usi.

Se vuoi un corretto ordinamento z con l'algoritmo del pittore, dovrai tagliare i poligoni sovrapposti in parti più piccole (ad es. Usando un albero quad) e ordinare queste parti singolarmente. Questo può diventare piuttosto pesante per la CPU ..

Ho trovato questo file Powerpoint che illustra bene il problema ( versione PDF ).


Grazie per quel Powerpoint, mi ha aiutato a risolvere il problema.
pimvdb,

Il collegamento è interrotto. Qualcuno può trovarne una copia?
Keavon,

1
@Keavon Edited. Ho trovato un collegamento funzionante per il file.
Bummzack,

1

In questi casi per me ha sempre funzionato usando bsp-trees. Dividi la scena fino a quando non hai un set convesso di poligoni nel nodo bsp-tree e quindi puoi facilmente ordinare i poligoni all'interno dei nodi. Nota che ordinando i poligoni dal nodo bsp-tree sembra lo stesso problema che hai descritto sopra, ma c'è una condizione non così ovvia - dopo aver costruito l'albero bsp tutti i casi problematici sono già risolti - nel nodo dovresti finire insieme a una serie di poligoni da cui deve passare il test di convessità - se si sceglie un piano da un poligono da questa serie, il resto dei poligoni si trovano tutti davanti al piano o dietro al piano. L'utilizzo di tali informazioni semplifica l'ordinamento - la funzione di ordinamento prende 2 poligoni - controlla in quale semispazio è il 1o poligono rispetto al 2o poligono e controlla anche il posizionamento della telecamera contro il secondo poligono.

Si noti inoltre che i test per determinare il lato del posizionamento della telecamera rispetto ai poligoni e l'attraversamento dell'albero bsp sono leggermente diversi quando si tratta di proiezioni ortografiche e prospettiche.

Se non puoi permetterti di dividere i poligoni in input, penso che tu sia sfortunato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.