Я хочу рассчитать объем 3D-сетчатого объекта с треугольниками, образованными поверхностью.
Как рассчитать объем 3D-сетчатого объекта, поверхность которого состоит из треугольников
Ответ 1
Читая эту статью, это на самом деле довольно простой расчет.
Фокус в том, чтобы вычислить подписанный том тетраэдра - на основе вашего треугольника и завершен в начале координат. Знак объема исходит из того, указывает ли ваш треугольник в направлении начала координат. (Нормаль треугольника сама зависит от порядка ваших вершин, поэтому вы не видите в нем явно ссылки ниже.)
Все это сводится к следующей простой функции:
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);
}
а затем драйвер для вычисления объема сетки:
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());
}
Ответ 2
Ип Фрэнк Крюгерс хорошо отвечает за +1. Если у вас есть векторные функции, доступные для вас, вы также можете использовать это:
public static float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3)
{
return p1.Dot(p2.Cross(p3)) / 6.0f;
}
edit.. добавил impl. для Dot() и Cross(), если вы не уверены. Большинство Math libs будут иметь их. Если вы используете WPF, они реализуются как статические методы класса 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
);
}
...
}
Ответ 3
Библиотека триангулированных поверхностей GNU может сделать это за вас. Имейте в виду, что поверхность должна быть закрыта. Это не будет иметь место для довольно многих 3D-моделей.
Если вы хотите реализовать его самостоятельно, вы можете начать с изучения их кода.
Ответ 4
Метод выше корректен для "простых" объектов (без пересекающихся/перекрывающихся треугольников), таких как сферы тетраэдров и т.д. Для более сложных форм хорошей идеей может быть сегмент сетки (закройте ее) и вычислить объем каждого сегмента отдельно. Надеюсь, это поможет.
Ответ 5
Если вы правильно поняли, вы говорите, что у вас уже есть поверхностная сетка треугольников, и вы хотите создать из нее трехмерную сплошную сетку.
Треугольники означают, что вам придется использовать тетраэдрические элементы для 3D-интерьера. Вы хотите найти octree auto meshing algorithm, который может принимать поверхностную сетку в качестве семени.
Это обычная проблема в литературе с конечным элементом автосоединения. Я бы посмотрел там.