Нарисуйте нормали поверхности на 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, чтобы добавить сегмент, показывающий нормальный. (См.
Следующий код показывает метод 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, чтобы найти вектор, перпендикулярный двум краевым векторам. Если треугольник ориентирован наружу, то вектор указывает во внешнем направлении.