我有关于曲面法线的请求。以下代码片段来自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
答案 0 :(得分:2)
看起来你正在用三点创建一个三角形。法线是该三角形中每个点的法线。恰好在这种情况下,所有法线指向同一方向。也就是说,它们与表面法线相同。
有时您希望您的点法线与曲面法线不同。就像,三角形是像球体一样的物体的一部分。然后你想要点法线是它周围的表面法线的平均值。这样您就可以进行平滑的着色和突出显示,而不仅仅是平面着色。