VTK Learning Forty - Octree Visualization

八叉树可用于索引、抽稀等等。随着八叉树的层级越大,越接近于模型。

import vtk
# 观察者
class SliderObserver(object):
    def __init__(self, Octree, polyData, renderer):
        self.Octree = Octree
        self.level = 0
        self.polyData = polyData
        self.renderer = renderer
    
    def __call__(self, caller, event):
        self.level = vtk.vtkMath.Round(caller.GetRepresentation().GetValue())
        self.Octree.GenerateRepresentation(self.level, self.polyData)
        self.renderer.Render()

def OctreeVisualize(fileName):
    '''
    fileName:文件路径
    该函数显示PLY模型的空间八叉树划分
    '''
    # PLY模型的读取
    colors = vtk.vtkNamedColors()
    plyReader = vtk.vtkPLYReader()
    plyReader.SetFileName(fileName)
    plyMapper = vtk.vtkPolyDataMapper()
    plyMapper.SetInputConnection(plyReader.GetOutputPort())
    plyReader.Update()
    plyActor = vtk.vtkActor()
    plyActor.SetMapper(plyMapper)
    plyActor.GetProperty().SetInterpolationToFlat()
    plyActor.GetProperty().SetRepresentationToPoints()
    plyActor.GetProperty().SetColor(colors.GetColor3d("Yellow"))

    # 构建八叉树
    octree = vtk.vtkOctreePointLocator()
    octree.SetMaximumPointsPerRegion(5)
    octree.SetDataSet(plyReader.GetOutput())
    octree.BuildLocator()

    polydata = vtk.vtkPolyData()
    octree.GenerateRepresentation(0, polydata)

    octreeMapper = vtk.vtkPolyDataMapper()
    octreeMapper.SetInputData(polydata)

    octreeActor = vtk.vtkActor()
    octreeActor.SetMapper(octreeMapper)
    octreeActor.GetProperty().SetInterpolationToFlat()
    octreeActor.GetProperty().SetRepresentationToWireframe()
    octreeActor.GetProperty().SetColor(colors.GetColor3d("SpringGreen"))

    # 渲染器和窗口
    renderer = vtk.vtkRenderer()
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.AddRenderer(renderer)

    # 交互器
    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
    renderWindowInteractor.SetRenderWindow(renderWindow)

    # 将模型加入场景中
    renderer.AddActor(plyActor)
    renderer.AddActor(octreeActor)
    renderer.SetBackground(colors.GetColor3d("MidnightBlue"))

    # 渲染一副图像(光照和相机自动创建)
    renderWindow.SetWindowName("OctreeVisualize")
    renderWindow.SetSize(600, 600)
    renderWindow.Render()

    # 创建设定八叉树划分细度的滑动条
    sliderRep = vtk.vtkSliderRepresentation2D()
    sliderRep.SetMinimumValue(0)
    sliderRep.SetMaximumValue(octree.GetLevel())
    sliderRep.SetValue(0)
    sliderRep.SetTitleText("Level")
    sliderRep.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay()
    sliderRep.GetPoint1Coordinate().SetValue(.2, .2)
    sliderRep.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay()
    sliderRep.GetPoint2Coordinate().SetValue(.8, .2)
    sliderRep.SetSliderLength(0.075)
    sliderRep.SetSliderWidth(0.05)
    sliderRep.SetEndCapLength(0.05)
    sliderRep.GetTitleProperty().SetColor(colors.GetColor3d("Beige"))
    sliderRep.GetCapProperty().SetColor(colors.GetColor3d("MistyRose"))
    sliderRep.GetSliderProperty().SetColor(colors.GetColor3d("LightBlue"))
    sliderRep.GetSelectedProperty().SetColor(colors.GetColor3d("Violet"))

    sliderWidget = vtk.vtkSliderWidget()
    sliderWidget.SetInteractor(renderWindowInteractor)
    sliderWidget.SetRepresentation(sliderRep)
    sliderWidget.SetAnimationModeToAnimate()
    sliderWidget.EnabledOn()

    # 给滑动条添加观察者
    callback = SliderObserver(octree, polydata, renderer)
    sliderWidget.AddObserver('InteractionEvent', callback)

    renderWindowInteractor.Initialize()
    renderWindow.Render()

    renderWindowInteractor.Start()

if __name__=='__main__':
    fileName = "D:\\codelearnning\\vtk-data-master\\Data\\Armadillo.ply"
    OctreeVisualize(fileName)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值