2009-09-10 19 views

Respuesta

4

El GNU Triangulated Surface Librarycan do this for you. Tenga en cuenta que la superficie debe estar cerrada. Ese no será el caso para bastantes modelos 3D.

Si desea implementarlo usted mismo, puede comenzar por echar un vistazo a su código.

+7

Si vuelve a implementar esto, tenga cuidado: la biblioteca GTS es LGPL, por lo que cualquier trabajo derivado debe ser LGPL o GPL. – Cascabel

-1

Si te entiendo correctamente, estás diciendo que ya tienes una malla de triángulos en la superficie y te gustaría generar una malla sólida 3D.

Triángulos significa que tendrá que utilizar elementos tetraédricos para el interior en 3D. Querrá buscar un octree auto meshing algorithm que pueda tomar una malla de superficie como semilla.

Este es un problema común en la literatura de mallado automático de elementos finitos. Yo miraría allí.

59

Reading this paper, en realidad es un cálculo bastante simple.

El truco consiste en calcular el volumen firmado de un tetraedro - en función de su triángulo y rematado en el origen. El signo del volumen proviene de si su triángulo está apuntando en la dirección del origen. (El normal del triángulo es en sí mismo depende del orden de los vértices, por lo que no se ve que hace referencia explícitamente a continuación.)

Todo esto se reduce a la siguiente función:

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); 
} 

y luego un conductor para calcular el volumen de la malla:

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

Una solución bastante elegante. – levis501

+0

Me pregunto por qué esto no se descubrió antes de 2001. ¿O lo era, pero no tenía relevancia? –

+1

Octubre de 1984, se publicó el documento "Un método simbólico para calcular las propiedades integrales de los poliedros no convexos arbitrarios" y describe este método para calcular el volumen. También es un método más o menos trivial, por lo que necesita mucho más que solo esta información para publicar un documento. –

14

Yip Frank Kruegers respuesta 1 funciona bien para eso. Si tiene funciones vectoriales disponibles, puede usar esto también:

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

editar .. added impl. para Dot() y Cross() si no está seguro. La mayoría de las librerías de matemáticas tendrán esto. Si está utilizando WPF, se implementan como métodos estáticos de la clase 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

tal vez el código postal para Dot() Y Cruz()? (Ambos son triviales para implementar, pero para completar). Por cierto, la respuesta de @Frank Kruegers es lo que obtienes si simplifica p1.Dot (p2.Cross (p3))/6.0f –

1

El método anterior es correcta para objetos "simples" (sin intersección/triángulos superpuestos) como esferas tetraedros y así sucesivamente. Para formas más complejas, una buena idea podría ser segmentar la malla (cerrarla) y calcular el volumen de cada segmento por separado. Espero que esto ayude.

+3

si el volumen está firmado no necesitas que el centro esté dentro de – makc

+1

Respuesta incorrecta. El método descrito es el correcto para objetos cerrados arbitrariamente complejos sin triángulos que se intersectan o superponen, y no hay ningún requisito sobre la posición del punto central. Eso es porque los "volúmenes" del tetraedro están firmados y se agregan algebraicamente. – galinette

+0

@galinette Sí, tienes razón. Por objetos "simples" quise decir objetos sin triángulos que se intersectan o superponen. También el centro de la malla puede estar afuera. – imoutidi

Cuestiones relacionadas