Qualcuno può spiegare il doppio contouring?


9

Ho cercato di capire il rendering voxel e ho osservato il dual contouring (DC).

Finora lo capisco molto:

  1. Esegui una funzione di densità per un set di punti della griglia (ad es. Funzione noise)
  2. Trova quali bordi nella cintura contengono modifiche tra i punti finali
  3. Da questi bordi creare punti di intersezione (es. Vettori)

Ora questo è dove sono bloccato, il prossimo sarebbe quello di generare normali, ma come? Quando si guarda a questo argomento questa immagine normalmente cresce.

                                                   Una griglia firmata con bordi contrassegnati dai dati Hermite

Fare ricerche indica che le normali verrebbero generate da una superficie isosuperiore. È corretto pensare di passare dal rumore all'isosuperficie alle normali? In tal caso, come potrei compiere ogni passaggio?

Per quanto ho capito, il prossimo passo sarebbe il seguente dalla carta DC ;

Per ogni bordo che presenta un cambio di segno, genera un quadratino che collega i vertici minimizzanti dei quattro cubi contenenti il ​​bordo.

Questa citazione è rappresentata dall'immagine sopra?

Infine, il passo successivo sarebbe eseguire il QEF con i punti e le normali che si intersecano e questo genererebbe i miei dati di vertice. È corretto?


Quando capisco questo processo è qualcosa come ... rumore> nuvola di punti> superficie iso> normali ... ma non sono abbastanza intelligente da affermare che posso spiegare correttamente questo processo, quindi non cercherò una risposta.
Guerra,

Risposte:


3

Le normali verrebbero generate in base al gradiente della funzione di densità mentre si ottengono i punti di intersezione tra i bordi e la superficie. Se è qualcosa di semplice e di forma chiusa come una sfera, puoi calcolare analiticamente le normali, ma con il rumore dovrai prendere dei campioni.

Hai i prossimi passi nell'ordine sbagliato. Innanzitutto, generi un vertice per ogni cella che presenta una modifica del segno. Il QEF che stai minimizzando è semplicemente la distanza totale da ciascuno dei piani che sono definiti dal punto di intersezione / coppie normali per quella cella. Quindi si cammina attraverso i bordi che presentano cambiamenti di segno e si crea un quad utilizzando i quattro vertici adiacenti (che sono garantiti per essere stati generati nell'ultimo passaggio).

Ora, il mio più grande ostacolo nell'implementazione di questo è stato risolvere il QEF. In realtà ho trovato una semplice soluzione iterativa che funzionerà bene (ad esempio) su una GPU in parallelo. Fondamentalmente, si avvia il vertice al centro della cella. Quindi fai la media di tutti i vettori presi dal vertice su ciascun piano e muovi il vertice lungo quel risultante, e ripeti questo passaggio un numero fisso di volte. Ho scoperto che spostandolo di circa il 70% lungo la risultante si sarebbe stabilizzato nella minima quantità di iterazioni.


Quindi diciamo che ho una cella / voxel che so che mostra un cambio di segno (cioè un caso come MC), ho eseguito una funzione di rumore per ogni 8 angoli della cella per trovare la sua densità. Ciò che ho difficoltà a capire è da questo come trovo le variabili x , n e p del QEF?
Sapone,

x è la posizione del vertice. Per ogni punto di intersezione hai p (la posizione) e n (la normale), che compongono i piani di cui stavo parlando.
jmegaffin,

p si trova trovando dove la media ponderata delle due densità lungo il bordo è zero. Quindi si calcola n prendendo il gradiente della funzione di densità a pag .
jmegaffin,

Quindi, in pratica per ogni cubo a calcolare il p e n per ogni 12 bordi, e quindi eseguire il QEF per ogni cella bordi p e n in x , che nel tuo esempio è al centro di un voxel / cell per iniziare? Quindi se quattro celle condividono lo stesso bordo, creo un quadruplo che collega ciascuna quattro celle x ? E il quad risultante è i miei dati poligonali?
Sapone,

Non tutti i bordi avranno un'intersezione, quindi non si deve necessariamente risolvere il QEF per 12 piani. A parte questo, ce l'hai!
jmegaffin,

1

Dalla lettura della carta fino alla pagina 2, sembra che i pesi del volume siano memorizzati agli angoli della griglia anziché essere il peso del cubo stesso come preferiscono i normali algoritmi in stile Marching Cubes. Questi pesi angolari definiscono un punto tra il bordo tra 2 angoli in cui è presente un cambio di segno da un angolo all'altro. I bordi con i cambiamenti di segno memorizzano anche un normale per il bordo che è la linea angolata nella rappresentazione 2D nell'OP. Quella normale informazione viene definita durante la creazione del volume (con qualunque strumento di modifica o metodo di creazione del volume procedurale viene utilizzato), non dopo la generazione dell'isosuperficie come ci si aspetterebbe da un algoritmo in stile Marching Cubes. Questi dati normali "affermano" che la linea / superficie che passa attraverso il punto deve avere il valore normale predefinito. Nei casi in cui Marching Cubes piegherebbe la linea in quel punto per accoppiarsi con un altro punto su un bordo adiacente, Extended Marching Cubes e Dual Contouring estendono entrambi la linea / superficie fino a quando non si interseca con la linea / superficie passando attraverso il punto sul bordo adiacente che ha un valore normale diverso. Ciò consente di creare spigoli vivi dai dati del volume in cui gli algoritmi di Marching Cubes di base completerebbero un po 'la superficie. Non capisco bene come giocano i QEF (funzioni di errore quadratico), tranne per il fatto che sembrano rendere più semplice il calcolo del punto esteso all'interno di un cubo in cui verrà posizionato un angolo. I cubi di marcia estesi e il Contorno doppio estendono entrambi la linea / superficie fino a quando non si interseca con la linea / superficie passando attraverso il punto sul bordo adiacente che ha un valore normale diverso. Ciò consente di creare spigoli vivi dai dati del volume in cui gli algoritmi di Marching Cubes di base completerebbero un po 'la superficie. Non capisco bene come giocano i QEF (funzioni di errore quadratico), tranne per il fatto che sembrano rendere più semplice il calcolo del punto esteso all'interno di un cubo in cui verrà posizionato un angolo. I cubi di marcia estesi e il Contorno doppio estendono entrambi la linea / superficie fino a quando non si interseca con la linea / superficie passando attraverso il punto sul bordo adiacente che ha un valore normale diverso. Ciò consente di creare spigoli vivi dai dati del volume in cui gli algoritmi di Marching Cubes di base completerebbero un po 'la superficie. Non capisco bene come giocano i QEF (funzioni di errore quadratico), tranne per il fatto che sembrano rendere più semplice il calcolo del punto esteso all'interno di un cubo in cui verrà posizionato un angolo.

Si noti che ho parlato di linee e spigoli qui in senso 2D come rappresentato dalla rappresentazione nell'OP .. Dovrei fare qualche lettura in più e pensare di estenderlo al 3D per la generazione di mesh volumetriche.

Per rispondere alla seconda metà della tua domanda su come generare le normali e pensare dal punto di vista procedurale guidato dal rumore, sembra che riempiresti il ​​tuo volume di dati sul rumore, quindi cerchi i bordi con i cambiamenti di segno, quindi esamina i 4 cubi che condividono il bordo per capire dove verranno generati i triangoli e calcolare il vertice normale come faresti per qualsiasi altra intersezione di più triangoli, prendendo la media delle normali per ogni triangolo che condivide il vertice. Ciò è molto speculativo da parte mia in quanto il documento tratta principalmente delle operazioni CSG e dei volumi generati da mesh convertite in scansione, entrambi con normali ben definite sulle superfici.

Spero che almeno la prima parte di questa risposta affronti le differenze nel modo in cui i dati di peso sono rappresentati e utilizzati in un modo abbastanza diverso dai cubi di marcia di base e perché i dati normali devono essere creati abbastanza presto nel processo di generazione del volume, dove con i cubi da marcia di base vengono normalmente create le normali come ultima fase del processo di generazione della mesh.

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.