一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①vtkImplicitModeller隐式建模
二:代码及注释
python
"""
主要展示了如何使用**隐式建模(implicit modelling)**技术,
将一个简单的二维线条集合(hello.vtk 文件中的文字)"加厚"成一个平滑、半透明的三维实体
"""
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersCore import vtkContourFilter
from vtkmodules.vtkFiltersHybrid import vtkImplicitModeller
from vtkmodules.vtkIOLegacy import vtkPolyDataReader
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkCamera,
vtkPolyDataMapper,
vtkRenderWindow,
vtkRenderWindowInteractor,
vtkRenderer
)
def main():
fileName = "Data/hello.vtk"
colors = vtkNamedColors()
reader = vtkPolyDataReader()
reader.SetFileName(fileName)
reader.Update()
lineMapper = vtkPolyDataMapper()
lineMapper.SetInputConnection(reader.GetOutputPort())
lineActor = vtkActor()
lineActor.SetMapper(lineMapper)
lineActor.GetProperty().SetColor(colors.GetColor3d("Tomato"))
lineActor.GetProperty().SetLineWidth(3)
"""
vtkImplicitModeller
把输入的几何(reader 读出的模型,比如一个 vtkPolyData)转换成一个 隐式函数场
(就像 vtkSampleFunction 生成标量场一样),以便后续做等值面提取、布尔运算等
"""
imp = vtkImplicitModeller()
"""
输出的几何体(比如一个三维曲面)会被转换成"体素化的标量场"
"""
imp.SetInputConnection(reader.GetOutputPort())
"""
设置体素网格的分辨率(x, y, z 三个方向上有多少采样点)
"""
imp.SetSampleDimensions(110, 40, 20)
"""
设置一个截断距离
隐式建模器会计算"每个采样点到最近输入几何的距离"
小于 0.25 的地方会存下真实距离
大于 0.25 的地方会统一设置为 0.25(避免无限大)
"""
imp.SetMaximumDistance(0.25)
imp.SetModelBounds(-1.0, 10.0, -1.0, 3.0, -1.0, 1.0)
contour = vtkContourFilter()
contour.SetInputConnection(imp.GetOutputPort())
"""
SetValue 这里的值如果大于SetMaximumDistance
vtkImplicitModeller 会自动调整并可能忽略你设定的 MaximumDistance
"""
contour.SetValue(0, 0.25)
impMapper = vtkPolyDataMapper()
impMapper.SetInputConnection(contour.GetOutputPort())
impMapper.ScalarVisibilityOff()
impActor = vtkActor()
impActor.SetMapper(impMapper)
impActor.GetProperty().SetColor(colors.GetColor3d('Peacock'))
impActor.GetProperty().SetOpacity(0.5)
# Create the usual graphics stuff.
# Create the RenderWindow, Renderer and Interactor.
#
ren1 = vtkRenderer()
renWin = vtkRenderWindow()
renWin.AddRenderer(ren1)
renWin.SetWindowName('Hello')
iren = vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# Add the actors to the renderer, set the background and size
#
ren1.AddActor(lineActor)
ren1.AddActor(impActor)
ren1.SetBackground(colors.GetColor3d('Wheat'))
renWin.SetSize(640, 480)
camera = vtkCamera()
camera.SetFocalPoint(4.5, 1, 0)
camera.SetPosition(4.5, 1.0, 6.73257)
camera.SetViewUp(0, 1, 0)
ren1.SetActiveCamera(camera)
ren1.ResetCamera()
camera.Dolly(1.3)
camera.SetClippingRange(1.81325, 90.6627)
renWin.Render()
iren.Start()
if __name__ == '__main__':
main()