2009-09-10 25 views

risposta

4

GNU Triangulated Surface Librarycan do this for you. Tieni presente che la superficie deve essere chiusa. Questo non sarà il caso per molti modelli 3D.

Se si desidera implementare da soli, è possibile iniziare dando un'occhiata al loro codice.

+7

Se si reimplementa questo, si prega di fare attenzione: la libreria GTS è LGPL, quindi qualsiasi lavoro derivato deve essere LGPL o GPL. – Cascabel

-1

Se ho capito bene, stai dicendo che hai già una mesh superficiale di triangoli e vorresti generare una solida mesh 3D da esso.

I triangoli significano che dovrete utilizzare elementi tetraedrici per l'interno 3D. Dovrai cercare un octree auto meshing algorithm che possa utilizzare una mesh di superficie come seme.

Questo è un problema comune nella letteratura di meshing automatico degli elementi finiti. Guarderei lì.

59

Reading this paper, in realtà è un calcolo piuttosto semplice.

Il trucco è di calcolare il volume firmato di un tetraedro - basato sul triangolo e completato all'origine. Il segno del volume proviene dal fatto che il triangolo stia puntando nella direzione dell'origine. (Il normale del triangolo è essa stessa dipende l'ordine dei vertici, che è il motivo per cui non si vede esplicitamente riferimento di seguito.)

tutto questo si riduce al seguente semplice funzione:

public float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3) { 
    var v321 = p3.X*p2.Y*p1.Z; 
    var v231 = p2.X*p3.Y*p1.Z; 
    var v312 = p3.X*p1.Y*p2.Z; 
    var v132 = p1.X*p3.Y*p2.Z; 
    var v213 = p2.X*p1.Y*p3.Z; 
    var v123 = p1.X*p2.Y*p3.Z; 
    return (1.0f/6.0f)*(-v321 + v231 + v312 - v132 - v213 + v123); 
} 

e poi un driver per calcolare il volume della maglia:

public float VolumeOfMesh(Mesh mesh) { 
    var vols = from t in mesh.Triangles 
       select SignedVolumeOfTriangle(t.P1, t.P2, t.P3); 
    return Math.Abs(vols.Sum()); 
} 
+1

Piuttosto una soluzione elegante. – levis501

+0

Mi chiedo perché questo non è stato scoperto prima del 2001. O lo era, ma non aveva rilevanza? –

+1

Ottobre 1984, è stato pubblicato il documento "Un metodo simbolico per calcolare le proprietà integrali di poliedri arbitrari non convessi" e descrive questo metodo per calcolare il volume. È anche un metodo più o meno banale, quindi è necessario molto più di una semplice informazione per pubblicare un articolo. –

14

Yip Frank Kruegers risposta funziona bene +1 per questo. Se disponi di funzioni vettoriali disponibili, puoi utilizzare anche questo:

public static float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3) 
    { 
     return p1.Dot(p2.Cross(p3))/6.0f; 
    } 

modifica .. aggiunto impl. per Dot() e Cross() se non si è sicuri. La maggior parte delle librerie di matematica avrà queste. Se si utilizza WPF, vengono implementati come metodi statici della classe Vector3D.

public class Vector 
    { 
     ... 

     public float Dot(Vector a) 
     { 
      return this.X * a.X + this.Y * a.Y + this.Z * a.Z; 
     } 

     public Vector Cross(Vector a) 
     { 
      return new Vector(
       this.Y * a.Z - this.Z * a.Y, 
       this.Z * a.X - this.X * a.Z, 
       this.X * a.Y - this.Y * a.X 
      ); 
     } 
     ... 
    } 
+0

forse postcode per Dot() AND Cross()? (sia banale da implementare, ma per completezza). BTW, @Frank La risposta di Kruegers è ciò che ottieni se si semplifica p1.Dot (p2.Cross (p3))/6.0f –

1

Il metodo di cui sopra è corretto degli oggetti "semplici" (senza intersezione/triangoli sovrapposti) come sfere tetrahedras e così via. Per forme più complesse, una buona idea potrebbe essere quella di segmentare la mesh (chiuderla) e calcolare separatamente il volume di ogni segmento. Spero che questo aiuti.

+3

se il volume è firmato non è necessario il centro all'interno – makc

+1

Risposta errata. Il metodo descritto è corretto per oggetti chiusi arbitrariamente complessi senza triangoli intersecanti/sovrapposti e non vi è alcun requisito sulla posizione del punto centrale. Questo perché i "volumi" del tetraedro sono firmati e aggiunti algebricamente. – galinette

+0

@galinette Sì, hai ragione. Per oggetti "semplici" intendevo oggetti senza triangoli intersecanti/sovrapposti. Anche il centro della rete può essere all'esterno. – imoutidi

Problemi correlati