Нарисуйте нормали поверхности на 3D-модели с помощью WPF и XAML
В этом примере показано, как рисовать поверхностные нормали. Он использует следующий код для создания сегментов объекта MeshGeometry3D, показывающих нормали поверхности для существующего объекта MeshGeometry3D.
// Вернем MeshGeometry3D для нормалей треугольника этого меша.
public static MeshGeometry3D ToTriangleNormals(
this MeshGeometry3D mesh,
double length, double thickness)
{
// Создаем сетку, чтобы удерживать нормали.
MeshGeometry3D normals = new MeshGeometry3D();
// Прокручиваем треугольники сетки.
for (int triangle = 0;
triangle < mesh.TriangleIndices.Count;
triangle += 3)
{
// Получим вершины треугольника.
Point3D point1 =
mesh.Positions[mesh.TriangleIndices[triangle]];
Point3D point2 =
mesh.Positions[mesh.TriangleIndices[triangle + 1]];
Point3D point3 =
mesh.Positions[mesh.TriangleIndices[triangle + 2]];
// Сделать нормальный треугольник
AddTriangleNormal(mesh, normals,
point1, point2, point3, length, thickness);
}
return normals;
}
Метод просто создает объект MeshGeometry3D, а затем пересекает треугольники исходной сетки, вызывая следующий метод AddTriangleNormal для каждого.
// Добавить сегмент, представляющий нормальный треугольник
// в нормальную сетку.
private static void AddTriangleNormal(MeshGeometry3D mesh,
MeshGeometry3D normals,
Point3D point1, Point3D point2, Point3D point3,
double length, double thickness)
{
// Получить нормальный треугольник.
Vector3D n = FindTriangleNormal(point1, point2, point3);
// Устанавливаем длину.
n = ScaleVector(n, length);
// Найдите центр треугольника.
Point3D endpoint1 = new Point3D(
(point1.X + point2.X + point3.X) / 3.0,
(point1.Y + point2.Y + point3.Y) / 3.0,
(point1.Z + point2.Z + point3.Z) / 3.0);
// Найти другую конечную точку сегмента.
Point3D endpoint2 = endpoint1 + n;
// Создаем сегмент.
AddSegment(normals, endpoint1, endpoint2, thickness);
}
Этот метод вызывает метод FindTriangleNormal, описанный в скором времени, чтобы найти вектор, нормальный к поверхности треугольника. Он усредняет углы треугольника, чтобы найти его «центр». (Существуют другие определения центра треугольника, но это легко и, вероятно, достаточно хорошо.) Затем он добавляет нормальный вектор в «центр», чтобы получить другую конечную точку для нормальный сегмент. Наконец, он вызывает AddSegment, чтобы добавить сегмент, показывающий нормальный. (См. для получения информации о методе AddSegment.)
Следующий код показывает метод FindTriangleNormal.
// Вычислим нормальный вектор треугольника.
public static Vector3D FindTriangleNormal(
Point3D point1, Point3D point2, Point3D point3)
{
// Получим два краевых вектора.
Vector3D v1 = point2 - point1;
Vector3D v2 = point3 - point2;
// Получите кросс-продукт.
Vector3D n = Vector3D.CrossProduct(v1, v2);
// Нормализовать.
n.Normalize();
return n;
}
Этот метод создает векторы, представляющие первый и второй ребра треугольника. Затем он использует Vector3D.CrossProduct, чтобы найти вектор, перпендикулярный двум краевым векторам. Если треугольник ориентирован наружу, то вектор указывает во внешнем направлении.
