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)

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章