曲面法线(Surface Normals)

2019-11-02 09:04发布

我有一个关于表面法线请求。 在下面的代码片断是从网址: 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(正常);” 重复三次。

你可以说我的原因。

问候

J.Frank

Answer 1:

它看起来像你创建一个三角形出来的三个点。 法线是在该三角形的每个点的法线。 碰巧的是,在这种情况下,所有的法线指向同一方向。 也就是说,它们是一样的表面正常。

有些时候,你会希望你的观点法线是从表面法线不同。 像,当所述三角形是等球形的物体的一部分。 然后你会想点的法线是它周围的表面法线的平均值。 这将允许你做平滑阴影和高亮,而不仅仅是平面着色。



文章来源: Surface Normals