2009-04-22 7 views
6

Attualmente sto scrivendo un programma per implementare Marching Cube usando C++ e Opengl.Marching Cube Domanda

Tuttavia, il mio miglior riferimento sia solo da http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

nel web, i codici forniti sono scritti in C.
mio problema qui è che non capisco il triTable e edgeTable
e come sono correlati.

qualcuno può aiutarmi nella spiegazione o guidarmi a convertire l'algoritmo in codici?

risposta

12

Queste tabelle sono utilizzate per trovare il modo di Tesselate superficie:

La prima tabella fornisce i bordi necessari per interpolare. La seconda tabella ti dà il modo in cui devi tesselare, ovvero, quali triangoli devi creare all'interno del cubo.

Un piccolo esempio:

supponiamo, vertice uno e 2 sono inferiori al livello iso, il cubeindex dovrebbe essere 3.

Tutta intersezione dovrebbe assomigliare un cuneo.

Se ci pensate, è necessario interpolare valori sui bordi: 0 e 9, e 2 e 10. Se si inserisce questo in un campo di bit, ciascun bit corrispondente a "è intersecata bordo?" si finirebbe con qualcosa del genere:

 
10 9 8 7 6 5 4 3 2 1 edge 
1 1 0 0 0 0 1 0 1 0 intersected? 

non è vero?

Che è esattamente il valore da edgeTable [3] in binario;) 0x30A = 1100001010

Ora è possibile scrivere una funzione che interpola linearmente i punti su quei bordi per misura il vostro isolivello. Questi punti diventeranno la tua superficie all'interno di questa cella.

Ma come tessellare questa cella/superficie?

se si guarda in triTable [3] un sorriso dovrebbe strisciare sul viso :)

Addit dopo la dichiarazione di perplessità residua in commento: ;-)

Cosa Marching Cubes fa: Immaginate di avere una stanza buia con una fonte di luce puntiforme in essa. È il centro di un campo di intensità della luce volumetrica di valori di intensità scalari. Puoi andare al punto (x, y, z) e misurare l'intensità lì, ad es. 3 candele.

Ora si desidera rendere una superficie attraverso tutti i punti che hanno una certa intensità luminosa. Si può immaginare che questa Isosurface assomigli ad una sfera attorno alla fonte di luce puntiforme. Questo è ciò che speriamo che i cubetti Marching ci forniscano.

Ora attraversare tutti i punti nella stanza e contrassegnare ogni punto come un vertice che ha approssimativamente il valore iso, sarà algoritmicamente molto complesso e risulterebbe in un enorme numero di vertici.Quale dovremmo quindi tassellare in qualche modo.

Quindi: i primi cubetti di Marciatura tagliano l'intero volume in cubi di uguali dimensioni. Se i dati sottostanti presentano una sorta di discrezionalità sottostante, vengono utilizzati multipli di questi. Non entrerò nell'altro caso, poiché è raro. Per esempio inseriamo una griglia con la densità di 1mm in una stanza 2mx5mx5m

Utilizziamo cubi di 5mmx5mmx5mm. Attraversarli dovrebbe essere molto più economico.

Ora puoi immaginare che i bordi di alcuni cubi intersecano l'isosuperficie. Questi sono quelli interessanti. Questo codice li identifica:

cubeindex = 0; 
    if (grid.val[0]

se cubeindex rimane zero, questo particolare cubo non è intersecato dall'isosurface. Se cubeindex è> 0 ora si sa che l'isosurface attraversa questo cubo e si desidera rendere il pezzo dell'isosurface che si trova al suo interno.

Per favore, immagina questo nella tua mente. Vedere http://en.wikipedia.org/wiki/Marching_cubes per esempi di cubi intersecati.

I vertici che si potrebbero ottenere facilmente sono quelli sui bordi del cubo. Basta interpolare linearmente tra 2 punti d'angolo per trovare la posizione dell'isovalue e posizionarvi un vertice. Ma quali bordi sono intersecati ??? Queste sono le informazioni in edgeTable [cubeindex]. Questo è il grande pezzo di codice con tutti i if, che memorizza i punti interpolati come vertici in una matrice di punti xyz: vertlist []. Questo pezzo si legge come segue:

 
get the bitfield = edgeTable[cubeindex] 
if edge 1 is marked in bitfield (bit 1 set to 1 in bitfield) 
    vertlist[0] = interpolated point, somewhere on edge 1 
... and so on. 

È ora hanno una gamma completa di vertici, ma come collegarli a triangoli? Questa è un'informazione che fornisce tritable.

Il resto è più o meno quello che ho spiegato sopra.

Bene, ci dovrebbero essere ancora problemi, si prega di essere specifici sul pezzo di codice che ti dà problemi.

+2

Se quel sorriso non vuole accadere, pensa a come mettere i triangoli lì dentro, quindi confrontalo con la proposta in triTable. Buon divertimento! ;-) – AndreasT

+0

hey grazie, AndreasT in realtà sono un po 'perso. per tua informazione non ho conoscenza dell'algoritmo. in qualche modo capisco come funziona triTable ora, tuttavia non capisco ancora come funziona EdgeTable e come determinare quale superficie usare .. – noob88

+0

ok, ora la cosa è veramente grande :) – AndreasT