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);
        }
Example #2
0
        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;
                    }
                }
            }
        }