public Model3DGroup CreateTriangle(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 = VectorHelper.CalcNormal(p0, p1, p2); mesh.Normals.Add(normal); mesh.Normals.Add(normal); mesh.Normals.Add(normal); Material material = new DiffuseMaterial( new SolidColorBrush(_color)); GeometryModel3D model = new GeometryModel3D( mesh, material); Model3DGroup group = new Model3DGroup(); group.Children.Add(model); return(group); }
public void CalcNormals() { var normal = VectorHelper.CalcNormal(Vertices[0], Vertices[1], Vertices[2]); Normals[0] = normal; Normals[1] = normal; Normals[2] = normal; }
public void SmoothNodeTriangles(RsmNode node, List <RsmTriangle> triangles) { //var maxSmoothGroup = node.Faces.Max(f => f.SmoothGroup); //we can assume all faces in a given triangle has the same normal at this point var faceNormals = new List <Vector3>(); //var faceNormals = triangles.Select(t => new[] {t.Normals[0], t.Normals[1], t.Normals[2]}).ToList(); foreach (var t in triangles) { faceNormals.Add(VectorHelper.CalcNormal(t.Vertices[0], t.Vertices[1], t.Vertices[2])); } for (var i = 0; i < node.Faces.Count; i++) //loop through the first set of faces { var face1 = node.Faces[i]; var f1Normals = new[] { faceNormals[i], faceNormals[i], faceNormals[i] }; var f1Counts = new[] { 1, 1, 1 }; for (var j = 0; j < node.Faces.Count; j++) //loop through the second set of faces { var face2 = node.Faces[j]; if (i == j || face1.SmoothGroup != face2.SmoothGroup) //they must be in the same smooth group and not the same face { continue; } for (var k = 0; k < 3; k++) //loop through each vertex in face1 { for (var l = 0; l < 3; l++) //loop through each vertex in face2 { if (face1.VertexIds[k] == face2.VertexIds[l]) //if the ids match, add their normal to the total { f1Normals[k] += faceNormals[j]; f1Counts[k]++; } } } } for (var k = 0; k < 3; k++) { var normal = (f1Normals[k] / f1Counts[k]).normalized; if (normal.magnitude > 0.1) //discard normals that don't normalize, as that means it's not pointing any direction { triangles[i].Normals[k] = normal; } } } }