同时渲染两个VTK多边形时旋转出现部分图形消失问题
VTK旋转视角时多边形部分消失的解决方案
问题原因
这是**Z-fighting(深度冲突)**问题:两个多边形处于完全相同的平面(Z=0),GPU进行深度测试时,受浮点数精度限制,旋转视角无法准确判断两个面的前后关系,导致部分区域被错误遮挡。
解决方法
两种简单有效的修复方式:
方法1:微调其中一个多边形的Z坐标
给绿色多边形的所有点设置微小的Z值偏移,让两个面产生可被GPU识别的距离:
polydata2 = buildPolygon([ [0, 0, 0.1], [5, 0, 0.1], [5, 5, 0.1], [0, 5, 0.1] ])
方法2:启用多边形偏移(Polygon Offset)
通过VTK的多边形偏移功能,给渲染的多边形添加深度偏移规则,强制GPU正确区分前后关系。在创建mapper后添加以下代码:
# 给红色多边形mapper设置偏移 map1.SetResolveCoincidentTopologyToPolygonOffset() map1.SetPolygonOffsetParameters(1.0, 2.0) # 给绿色多边形mapper设置偏移 map2.SetResolveCoincidentTopologyToPolygonOffset() map2.SetPolygonOffsetParameters(1.0, 2.0)
完整修复代码示例(方法2)
import vtkmodules.all as vtk def buildPolygon(points): polydata = vtk.vtkPolyData() vps = vtk.vtkPoints() polygon = vtk.vtkPolygon() polygon.GetPointIds().SetNumberOfIds(len(points)) for i in range(len(points)): vps.InsertNextPoint(points[i][0], points[i][1], points[i][2]) polygon.GetPointIds().SetId(i, i) polygons = vtk.vtkCellArray() polygons.InsertNextCell(polygon) polydata.SetPoints(vps) polydata.SetPolys(polygons) return polydata polydata1 = buildPolygon([ [0, 0, 0], [10, 0, 0], [10, 10, 0], [0, 10, 0] ]) map1 = vtk.vtkPolyDataMapper() map1.SetInputData(polydata1) map1.SetResolveCoincidentTopologyToPolygonOffset() map1.SetPolygonOffsetParameters(1.0, 2.0) actor1 = vtk.vtkActor() actor1.SetMapper(map1) actor1.GetProperty().SetColor(1, 0, 0) polydata2 = buildPolygon([ [0, 0, 0], [5, 0, 0], [5, 5, 0], [0, 5, 0] ]) map2 = vtk.vtkPolyDataMapper() map2.SetInputData(polydata2) map2.SetResolveCoincidentTopologyToPolygonOffset() map2.SetPolygonOffsetParameters(1.0, 2.0) actor2 = vtk.vtkActor() actor2.SetMapper(map2) actor2.GetProperty().SetColor(0, 1, 0) render = vtk.vtkRenderer() render.AddActor(actor1) render.AddActor(actor2) renWin = vtk.vtkRenderWindow() renWin.AddRenderer(render) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) iren.Initialize() iren.Start()
内容的提问来源于stack exchange,提问作者Qiang Zhang
相关产品推荐
相关产品推荐

