我想把STL
文件中的一个对象可视化到VTK
中,这不是问题。在
不过,我也希望高亮显示某些面,并根据法线和任意选择的方向之间的阈值角度值(比如z = (0.0, 0.0, 1.0)
),给它们不同于主对象的颜色。例如,所有与45 degrees
角度小于45 degrees
的面都应涂成红色。在
我设法使用trimesh
模块来完成这项工作,但是绘制对象需要花费太多的时间。
有没有一种优雅的方法可以使用VTK
模块来实现这一点?在
到目前为止,我的代码是:
import vtk
import numpy as np
from vtk.util.numpy_support import vtk_to_numpy, numpy_to_vtk
filename = "out.stl"
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
normals = vtk.vtkPPolyDataNormals()
normals.SetInputConnection(reader.GetOutputPort())
normals.ComputeCellNormalsOn()
normals.ComputePointNormalsOff()
normals.ConsistencyOn()
normals.AutoOrientNormalsOn()
normals.Update()
cellNormals = vtk_to_numpy(normals.GetOutput().GetCellData().GetNormals())
angle = numpy_to_vtk(np.arccos(np.dot(cellNormals, (0.0,0.0,1.0))))
normals.GetOutput().GetCellData().SetScalars(angle)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(reader.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(0, 0, 1)
# Create a rendering window and renderer
renderer = vtk.vtkRenderer()
renderingwindow = vtk.vtkRenderWindow()
renderingwindow.AddRenderer(renderer)
# Create a renderwindowinteractor
renderwindowinteractor = vtk.vtkRenderWindowInteractor()
renderwindowinteractor.SetRenderWindow(renderingwindow)
# Assign actor to the renderer
renderer.AddActor(actor)
# Enable user interface interactor
renderwindowinteractor.Initialize()
renderingwindow.Render()
renderwindowinteractor.Start()
我假设您使用vtkPolyDataNormals来计算法线-确保您有ComputeCellNormalsOn。在
下一步,你需要一些东西在法线上循环,并计算出你的测试方向的点积。由于您使用的是Python,所以我建议在normals数组上使用vtk_-numpy,并在numpy中执行。在
现在,您可以使用vtkPolyDataMapper的颜色映射功能来完成您需要的操作。在
相关问题 更多 >
编程相关推荐