一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①vtkImplicitPolyDataDistance计算任意点到几何体表面的符号距离
二:代码及注释
python
import numpy as np
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonCore import vtkFloatArray, vtkPoints
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkFiltersCore import vtkImplicitPolyDataDistance
from vtkmodules.vtkCommonDataModel import vtkPolyData
from vtkmodules.vtkFiltersGeneral import vtkVertexGlyphFilter
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkPolyDataMapper,
vtkRenderWindow,
vtkRenderWindowInteractor,
vtkRenderer
)
def main():
colors = vtkNamedColors()
sphereSource = vtkSphereSource()
sphereSource.SetCenter(0, 0, 0)
sphereSource.SetRadius(1.0)
sphereSource.Update()
sphereMapper = vtkPolyDataMapper()
sphereMapper.SetInputConnection(sphereSource.GetOutputPort())
sphereMapper.ScalarVisibilityOff()
sphereActor = vtkActor()
sphereActor.SetMapper(sphereMapper)
# SetOpacity 设置模型是否透明,1完全不透明,0完全透明
sphereActor.GetProperty().SetOpacity(0.3)
sphereActor.GetProperty().SetColor(1, 0, 0)
"""
vtkImplicitPolyDataDistance 计算空间中任意一点到这个多边形几何体表面的符号距离
"""
implicitPolyDataDistance = vtkImplicitPolyDataDistance()
implicitPolyDataDistance.SetInput(sphereSource.GetOutput()) # 设置隐式距离函数
points = vtkPoints()
step = 0.1
for x in np.arange(-2, 2, step):
for y in np.arange(-2, 2, step):
for z in np.arange(-2, 2, step):
points.InsertNextPoint(x, y, z)
signedDistance = vtkFloatArray()
signedDistance.SetNumberOfComponents(1)
signedDistance.SetName("")
for pointId in range(points.GetNumberOfPoints()):
p = points.GetPoint(pointId)
dist_ = implicitPolyDataDistance.EvaluateFunction(p)
signedDistance.InsertNextValue(dist_)
polyData = vtkPolyData()
polyData.SetPoints(points)
polyData.GetPointData().SetScalars(signedDistance)
"""
vtkVertexGlyphFilter 把点集转换成可渲染的几何体
"""
vertexGlyphFilter = vtkVertexGlyphFilter()
vertexGlyphFilter.SetInputData(polyData)
vertexGlyphFilter.Update()
signedDistanceMapper = vtkPolyDataMapper()
signedDistanceMapper.SetInputConnection(vertexGlyphFilter.GetOutputPort())
signedDistanceMapper.ScalarVisibilityOn() # 根据标量进行着色
signedDistanceActor = vtkActor()
signedDistanceActor.SetMapper(signedDistanceMapper)
renderer = vtkRenderer()
renderer.AddViewProp(sphereActor)
renderer.AddViewProp(signedDistanceActor)
renderer.SetBackground(colors.GetColor3d('SlateGray'))
renderWindow = vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindow.SetWindowName('ImplicitPolyDataDistance')
renWinInteractor = vtkRenderWindowInteractor()
renWinInteractor.SetRenderWindow(renderWindow)
renderWindow.Render()
renWinInteractor.Start()
if __name__ == '__main__':
main()