Поверхностные Нормы - PullRequest
       9

Поверхностные Нормы

0 голосов
/ 27 ноября 2009

У меня есть запрос по нормалью поверхности. На следующий фрагмент кода с URL: http://www.kindohm.com/technical/wpf3dtutorial.htm

private Model3DGroup CreateTriangleModel(Point3D p0, Point3D p1, Point3D p2)
{
    MeshGeometry3D mesh = new MeshGeometry3D();

    mesh.Positions.Add(p0);
    mesh.Positions.Add(p1);
    mesh.Positions.Add(p2);
    mesh.TriangleIndices.Add(0);
    mesh.TriangleIndices.Add(1);
    mesh.TriangleIndices.Add(2);
    Vector3D normal = CalculateNormal(p0, p1, p2);
    //
    mesh.Normals.Add(normal);
    mesh.Normals.Add(normal);
    mesh.Normals.Add(normal);
    //
    Material material = new DiffuseMaterial(
        new SolidColorBrush(Colors.DarkKhaki));
    GeometryModel3D model = new GeometryModel3D(
        mesh, material);
    Model3DGroup group = new Model3DGroup();
    group.Children.Add(model);
    return group;

}

private Vector3D CalculateNormal(Point3D p0, Point3D p1, Point3D p2)

{
    Vector3D v0 = new Vector3D(p1.X - p0.X, p1.Y - p0.Y, p1.Z - p0.Z);

    Vector3D v1 = new Vector3D(p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z);

    return Vector3D.CrossProduct(v0, v1);
}

Я не могу понять, почему строка кода "mesh.Normals.Add (normal);" повторяется три раза.

Не могли бы вы сказать мне причину.

Привет

J.Frank

1 Ответ

2 голосов
/ 27 ноября 2009

Похоже, вы создаете треугольник из трех точек. Нормы - это нормали для каждой точки в этом треугольнике. Так уж получилось, что в этом случае все нормали указывают в одном направлении. То есть они такие же, как у поверхности нормальные.

Бывают ситуации, когда вы хотите, чтобы ваши нормали точек отличались от нормалей поверхности. Например, когда треугольник является частью объекта, подобного сфере. Тогда вы хотите, чтобы нормали точек были средними от нормалей поверхности вокруг них. Это позволит вам делать плавное затенение и выделение вместо простого затенения.

...