2009-04-23 22 views
6

Dalla mia ultima domanda: Marching Cube Question
Implementazione dell'algoritmo del cubo della marcia?

Tuttavia, sono ancora chiaro come in:

  1. come creare immaginari cubo/voxel per verificare se un vertice è inferiore al isosurface?
  2. come faccio a sapere quale vertice è sotto l'isosuperficie?
  3. come ciascun cubo/voxel determina quale cuboindice/superficie utilizzare?
  4. come disegnare la superficie utilizzando i dati in triTable?

Diciamo che ho i dati di una nuvola di punti di una mela.
come procedo?

qualcuno che abbia familiarità con Marching Cube può aiutarmi?
conosco solo C++ e opengl. (C è un po 'fuori mano)

risposta

1

1) Dipende dall'implementazione di yoru. Avrai bisogno di avere una struttura dati in cui puoi cercare i valori in ogni angolo (vertice) del voxel o del cubo. Può trattarsi di un'immagine 3d (ad esempio una trama 3D in OpenGL) oppure può essere una struttura dati array personalizzata o qualsiasi altro formato desiderato.

2) È necessario controllare i vertici del cubo. Ci sono diverse ottimizzazioni su questo, ma in generale, inizia con il primo angolo e controlla solo i valori di tutti e 8 gli angoli del cubo.

3) La maggior parte degli algoritmi (veloci) crea una maschera di bit da utilizzare come tabella di ricerca in una matrice statica di opzioni. Ci sono solo tante opzioni possibili per questo.

4) Dopo aver creato i triangoli dal triTable, è possibile utilizzare OpenGL per renderli.

Diciamo che ho i dati di una nuvola di punti di una mela. come procedo?

Questo non funzionerà con i cubi in marcia. I cubi in marcia richiedono i dati voxel, quindi è necessario utilizzare alcuni algoritmi per inserire la nuvola di punti dei dati in un volume cubico. Splatting gaussiano è un'opzione qui.

Normalmente, se si sta lavorando da una nuvola di punti e si desidera vedere la superficie, è necessario esaminare gli algoritmi di ricostruzione della superficie anziché i cubi in marcia.

Se vuoi saperne di più, ti consiglio vivamente di leggere alcuni libri sulle tecniche di visualizzazione. Uno buono proviene dalla gente di Kitware - The Visualization Toolkit.

Si potrebbe voler dare un'occhiata a VTK. Ha un'implementazione C++ di Marching Cubes ed è completamente open source.

+0

può un 6 glQuads pari ad un voxel? in tal caso, in che modo la build di voxel viene ripristinata? il mio punto è il centro del cubo? – noob88

+0

@ noob88: No, non proprio. Il tuo "cubo" dovrebbe essere un oggetto composto da 8 pionti. I 6 glQuad potrebbero essere i volti del cubo/voxel, e i vertici che stai usando potrebbero essere i tuoi 8 punti. Mi piacerebbe creare una struttura dati diversa per tenerlo, comunque. Qualcosa di semplice come un array multidimensionale funziona. –

+0

vedo ... penso di aver bisogno di tempo per testarlo 1 °, posso avere il tuo contatto? dovrei avere ulteriori problemi spero di poter ottenere il tuo aiuto .. – noob88

2

Prima di tutto, l'isosuperficie può essere rappresentata in due modi. Un modo è quello di avere l'isovalore e scalari per punto come set di dati da un'origine esterna. Ecco come funzionano le scansioni MRI. Il secondo approccio consiste nel realizzare una funzione implicita F() che prende come punto un punto/vertice e restituisce un nuovo scalare.Considerare questa funzione:

float computeScalar(const Vector3<float>& v) 
{ 
    return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z); 
} 

Quale calcola la distanza dal punto e all'origine per ogni punto nel campo scalare. Se l'isovalue è il raggio, hai appena trovato un modo per rappresentare una sfera. Questo perché | v | < = R è vero per tutti i punti all'interno di una sfera o che vive al suo interno. Basta capire quali vertici sono all'interno della sfera e quali sono all'esterno. Si desidera utilizzare gli operatori minori o maggiori di perché un volume divide lo spazio in due. Quando sai quali punti del tuo cubo sono classificati come interni ed esterni, sai anche quali bordi si interseca l'isosuperficie. Puoi finire con qualsiasi cosa, da nessun triangolo a cinque triangoli. La posizione dei vertici mesh può essere calcolata interpolando attraverso i bordi intersecati per trovare il punto di intersezione reale.


Se si vuole rappresentare per esempio una mela con campi scalari, si dovrà o per ottenere i dati di origine impostati per collegare alla vostra applicazione, o utilizzare un piuttosto complessa funzione implicita. Io consiglio di ottenere semplici primitive geometriche come sfere e tori per funzionare prima, e poi espandermi da lì.