private void QuadricDecimation() { vtkSphereSource sphereSource = vtkSphereSource.New(); sphereSource.Update(); vtkPolyData input = vtkPolyData.New(); input.ShallowCopy(sphereSource.GetOutput()); Debug.WriteLine("Before decimation" + Environment.NewLine + "------------"); Debug.WriteLine("There are " + input.GetNumberOfPoints() + " points."); Debug.WriteLine("There are " + input.GetNumberOfPolys() + " polygons."); vtkQuadricDecimation decimate = vtkQuadricDecimation.New(); #if VTK_MAJOR_VERSION_5 decimate.SetInputConnection(input.GetProducerPort()); #else decimate.SetInputData(input); #endif decimate.Update(); vtkPolyData decimated = vtkPolyData.New(); decimated.ShallowCopy(decimate.GetOutput()); Debug.WriteLine("After decimation" + Environment.NewLine + "------------"); Debug.WriteLine("There are " + decimated.GetNumberOfPoints() + " points."); Debug.WriteLine("There are " + decimated.GetNumberOfPolys() + " polygons."); vtkPolyDataMapper inputMapper = vtkPolyDataMapper.New(); #if VTK_MAJOR_VERSION_5 inputMapper.SetInputConnection(input.GetProducerPort()); #else inputMapper.SetInputData(input); #endif vtkActor inputActor = vtkActor.New(); inputActor.SetMapper(inputMapper); vtkPolyDataMapper decimatedMapper = vtkPolyDataMapper.New(); #if VTK_MAJOR_VERSION_5 decimatedMapper.SetInputConnection(decimated.GetProducerPort()); #else decimatedMapper.SetInputData(decimated); #endif vtkActor decimatedActor = vtkActor.New(); decimatedActor.SetMapper(decimatedMapper); vtkRenderWindow renderWindow = renderWindowControl1.RenderWindow; this.Size = new System.Drawing.Size(612, 352); // Define viewport ranges // (xmin, ymin, xmax, ymax) double[] leftViewport = new double[] { 0.0, 0.0, 0.5, 1.0 }; double[] rightViewport = new double[] { 0.5, 0.0, 1.0, 1.0 }; // Setup both renderers vtkRenderer leftRenderer = vtkRenderer.New(); renderWindow.AddRenderer(leftRenderer); leftRenderer.SetViewport(leftViewport[0], leftViewport[1], leftViewport[2], leftViewport[3]); leftRenderer.SetBackground(.6, .5, .4); vtkRenderer rightRenderer = vtkRenderer.New(); renderWindow.AddRenderer(rightRenderer); rightRenderer.SetViewport(rightViewport[0], rightViewport[1], rightViewport[2], rightViewport[3]); rightRenderer.SetBackground(.4, .5, .6); // Add the sphere to the left and the cube to the right leftRenderer.AddActor(inputActor); rightRenderer.AddActor(decimatedActor); leftRenderer.ResetCamera(); rightRenderer.ResetCamera(); renderWindow.Render(); }
/// <summary> /// Generates a Unity Mesh from a vtkPolyData. /// </summary> /// <param name="pd">The vtk poly data.</param> /// <returns>The Unity Mesh (without colors).</returns> private static Mesh PolyDataToMesh(vtkPolyData pd) { if (pd == null) { Debug.LogWarning("No PolyData passed!"); return null; } var numVertices = pd.GetNumberOfPoints(); if (numVertices == 0) { Debug.LogWarning("No vertices to convert!"); return null; } var mesh = new Mesh(); // Points / Vertices var vertices = new Vector3[numVertices]; for (var i = 0; i < numVertices; ++i) { var pnt = pd.GetPoint(i); // Flip z-up to y-up vertices[i] = new Vector3(-(float) pnt[0], (float) pnt[2], (float) pnt[1]); } mesh.vertices = vertices; // Normals var vtkNormals = pd.GetPointData().GetNormals(); if (vtkNormals != null) { var numNormals = vtkNormals.GetNumberOfTuples(); var normals = new Vector3[numNormals]; for (var i = 0; i < numNormals; i++) { var normal = vtkNormals.GetTuple3(i); // flip normals ? normals[i] = new Vector3(-(float) normal[0], -(float) normal[1], -(float) normal[2]); } mesh.normals = normals; } else { Debug.Log("No Normals!"); } // Texture coordinates var vtkTexCoords = pd.GetPointData().GetTCoords(); if (vtkTexCoords != null) { var numCoords = vtkTexCoords.GetNumberOfTuples(); var uvs = new Vector2[numCoords]; for (var i = 0; i < numCoords; ++i) { var texCoords = vtkTexCoords.GetTuple2(i); uvs[i] = new Vector2((float) texCoords[0], (float) texCoords[1]); } mesh.uv = uvs; } // Triangles / Cells var numTriangles = pd.GetNumberOfPolys(); var polys = pd.GetPolys(); if (polys.GetNumberOfCells() > 0) { var triangles = new int[numTriangles*3]; var prim = 0; var pts = vtkIdList.New(); polys.InitTraversal(); while (polys.GetNextCell(pts) != 0) { for (var i = 0; i < pts.GetNumberOfIds(); ++i) triangles[prim*3 + i] = pts.GetId(i); ++prim; } mesh.SetTriangles(triangles, 0); //Mesh.RecalculateNormals(); mesh.RecalculateBounds(); return mesh; } // Lines var lines = pd.GetLines(); if (lines.GetNumberOfCells() > 0) { var idList = new ArrayList(); var pts = vtkIdList.New(); lines.InitTraversal(); while (lines.GetNextCell(pts) != 0) { for (var i = 0; i < pts.GetNumberOfIds() - 1; ++i) { idList.Add(pts.GetId(i)); idList.Add(pts.GetId(i + 1)); } } mesh.SetIndices(idList.ToArray(typeof (int)) as int[], MeshTopology.Lines, 0); mesh.RecalculateBounds(); return mesh; } // Points var points = pd.GetVerts(); var numPointCells = points.GetNumberOfCells(); if (numPointCells > 0) { var idList = new ArrayList(); var pts = vtkIdList.New(); points.InitTraversal(); while (points.GetNextCell(pts) != 0) { for (int i = 0; i < pts.GetNumberOfIds(); ++i) { idList.Add(pts.GetId(i)); } } mesh.SetIndices(idList.ToArray(typeof (int)) as int[], MeshTopology.Points, 0); mesh.RecalculateBounds(); } return mesh; }