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

Источник: http://csharphelper.com/blog/2014/10/draw-surface-normals-on-a-3d-model-using-wpf-and-xaml/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector