一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①vtkImplicitModeller隐式建模
二:代码及注释
import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkIOLegacy import vtkPolyDataReader from vtkmodules.vtkCommonTransforms import vtkTransform from vtkmodules.vtkFiltersGeneral import vtkTransformPolyDataFilter from vtkmodules.vtkFiltersCore import vtkAppendPolyData, vtkPolyDataNormals, vtkContourFilter from vtkmodules.vtkFiltersHybrid import vtkImplicitModeller from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, vtkProperty, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) def main(): colors = vtkNamedColors() fileName1, fileName2, fileName3 = "Data/v.vtk", "Data/t.vtk", "Data/k.vtk" aRenderer = vtkRenderer() aRenderWindow = vtkRenderWindow() aRenderWindow.AddRenderer(aRenderer) anInteractor = vtkRenderWindowInteractor() anInteractor.SetRenderWindow(aRenderWindow) aRenderWindow.SetSize(300, 300) aRenderWindow.SetWindowName('BlobbyLogo') letterV = vtkPolyDataReader() letterV.SetFileName(fileName1) letterT = vtkPolyDataReader() letterT.SetFileName(fileName2) letterK = vtkPolyDataReader() letterK.SetFileName(fileName3) VTransform = vtkTransform() VTransform.Translate(-16.0, 0.0, 12.5) VTransform.RotateY(40) VTransformFilter = vtkTransformPolyDataFilter() VTransformFilter.SetInputConnection(letterV.GetOutputPort()) VTransformFilter.SetTransform(VTransform) TTransform = vtkTransform() TTransformFilter = vtkTransformPolyDataFilter() TTransformFilter.SetInputConnection(letterT.GetOutputPort()) TTransformFilter.SetTransform(TTransform) KTransform = vtkTransform() KTransform.Translate(14.0, 0.0, 0.0) KTransform.RotateY(-40) KTransformFilter = vtkTransformPolyDataFilter() KTransformFilter.SetInputConnection(letterK.GetOutputPort()) KTransformFilter.SetTransform(KTransform) appendAll = vtkAppendPolyData() appendAll.AddInputConnection(VTransformFilter.GetOutputPort()) appendAll.AddInputConnection(TTransformFilter.GetOutputPort()) appendAll.AddInputConnection(KTransformFilter.GetOutputPort()) logoNormals = vtkPolyDataNormals() logoNormals.SetInputConnection(appendAll.GetOutputPort()) logoNormals.SetFeatureAngle(60) logoMapper = vtkPolyDataMapper() logoMapper.SetInputConnection(logoNormals.GetOutputPort()) logo = vtkActor() logo.SetMapper(logoMapper) # 隐式建模 # vtkImplicitModeller 输入的几何(reader 读出的模型,比如一个 vtkPolyData)转换成一个 隐式函数场 blobbyLogoImp = vtkImplicitModeller() blobbyLogoImp.SetInputConnection(appendAll.GetOutputPort()) """ vtkImplicitModeller 会计算每个体素到输入几何表面的最小距离,但为了性能考虑,不会无限计算 而是如果距离超过 MaximumDistance,就不再计算,直接设为这个最大值 可以理解成:值越大,生成的“模糊边缘(blobby)”越宽,值越小,模型越“紧贴”原始几何 """ blobbyLogoImp.SetMaximumDistance(0.075) blobbyLogoImp.SetSampleDimensions(64, 64, 64) # 表示输出的体数据是一个 64×64×64 的三维网格 blobbyLogoImp.SetAdjustDistance(0.05) # 调整隐式距离的“软化程度”或“平滑边界宽度” 当多个几何靠得很近时,这个参数能让它们“自然融合”成一个连续的体 blobbyLogoIso = vtkContourFilter() blobbyLogoIso.SetInputConnection(blobbyLogoImp.GetOutputPort()) blobbyLogoIso.SetValue(1, 1.5) blobbyLogoMapper = vtkPolyDataMapper() blobbyLogoMapper.SetInputConnection(blobbyLogoIso.GetOutputPort()) blobbyLogoMapper.ScalarVisibilityOff() tomato = vtkProperty() tomato.SetDiffuseColor(colors.GetColor3d('tomato')) tomato.SetSpecular(.3) tomato.SetSpecularPower(20) banana = vtkProperty() banana.SetDiffuseColor(colors.GetColor3d('banana')) banana.SetDiffuse(.7) banana.SetSpecular(.4) banana.SetSpecularPower(20) blobbyLogo = vtkActor() blobbyLogo.SetMapper(blobbyLogoMapper) blobbyLogo.SetProperty(banana) logo.SetProperty(tomato) logo.SetPosition(0, 0, 6) aRenderer.AddActor(logo) aRenderer.AddActor(blobbyLogo) aRenderer.SetBackground(colors.GetColor3d('SlateGray')) aRenderWindow.Render() anInteractor.Start() if __name__ == '__main__': main()