public static ModelVisual3D Load(string path) { if (path == null) { return null; } ModelVisual3D model= new ModelVisual3D(); string ext = Path.GetExtension(path).ToLower(); switch (ext) { case ".obj": { var r = new SmileObjReader(); model = r.Read(path); break; } case ".objz": { var r = new SmileObjReader(); model = r.ReadZ(path); break; } default: throw new InvalidOperationException("File format not supported."); } return model; }
internal void grabUpperPlane_old() { Model3DGroup model = (Model3DGroup)this.Content; SmileObjReader obj = new SmileObjReader(); Model3DCollection childs = model.Children; int c = 0; int i = 1; foreach (GeometryModel3D gm in childs) { MeshGeometry3D mesh = (MeshGeometry3D)gm.Geometry; obj.AddGroup("mesh" + c); Console.WriteLine("Positions:" + mesh.Positions.Count); Console.WriteLine("Indices:" + mesh.TriangleIndices.Count); Point3DCollection positions = mesh.Positions; foreach (var pp in positions) { //Point3D pp = ToLocal(p); if (pp.Z >= 0) { obj.AddVertex(pp.X + " " + pp.Y + " " + pp.Z); if (i % 4 == 0) { obj.AddFace((i - 3) + " " + (i - 2) + " " + (i - 1)); obj.AddFace((i - 2) + " " + (i - 1) + " " + (i)); } i++; } else { //obj.AddVertex(p.X + " " + p.Y + " " + 0); } } /* for (int i = 0; i < mesh.TriangleIndices.Count; i = i + 3) { int index1 = mesh.TriangleIndices[i]; int index2 = mesh.TriangleIndices[i + 1]; int index3 = mesh.TriangleIndices[i + 2]; Point3D point1 = mesh.Positions[index1]; Point3D point2 = mesh.Positions[index2]; Point3D point3 = mesh.Positions[index3]; if (point1.Z >= 0) { obj.AddVertex(point1.X + " " + point1.Y + " " + point1.Z); } else { obj.AddVertex(point1.X + " " + point1.Y + " " + 0); } if (point2.Z >= 0) { obj.AddVertex(point2.X + " " + point2.Y + " " + point2.Z); } else { obj.AddVertex(point2.X + " " + point2.Y + " " + 0); } if (point3.Z >= 0) { obj.AddVertex(point3.X + " " + point3.Y + " " + point3.Z); } else { obj.AddVertex(point3.X + " " + point3.Y + " " + 0); } obj.AddFace(i + " " + (i + 1) + " " + (i + 2)); //obj.AddFace(index1 + " " + index2 + " " + index3); } */ c++; } ModelVisual3D v = new ModelVisual3D(); v.Content = obj.BuildModel(); parent.Children.Add(v); }
internal void grabUpperPlane_x() { Model3DGroup _model = (Model3DGroup)this.Content; MeshGeometry3D _modelMesh = null; foreach (GeometryModel3D gm in _model.Children) { _modelMesh = (MeshGeometry3D)gm.Geometry; } Model3DGroup _planeModel = (Model3DGroup)_plane.Content; MeshGeometry3D _planeMesh = null; foreach (GeometryModel3D gm in _planeModel.Children) { _planeMesh = (MeshGeometry3D)gm.Geometry; } Int32Collection indices = _modelMesh.TriangleIndices; SmileObjReader obj = new SmileObjReader(); //TODO: cut the upper mesh for (int i = 0; i < indices.Count; i = i + 3) { int index1 = indices[i]; int index2 = indices[i + 1]; int index3 = indices[i + 2]; } }