在VTK(python)中根据面法线方向给面着色

2024-04-26 12:03:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把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()

Tags: to对象importnumpynpreaderrenderer角度
1条回答
网友
1楼 · 发布于 2024-04-26 12:03:28

我假设您使用vtkPolyDataNormals来计算法线-确保您有ComputeCellNormalsOn。在

下一步,你需要一些东西在法线上循环,并计算出你的测试方向的点积。由于您使用的是Python,所以我建议在normals数组上使用vtk_-numpy,并在numpy中执行。在

from vtk.util.numpy_support import vtk_to_numpy, numpy_to_vtk
pd = polyDataNormals.GetOutput()
cellNormals = vtk_to_numpy(pd.GetCellData().GetNormals())
angle = numpy_to_vtk(np.arccos(np.dot(cellNormals, testNormal)))
pd.GetCellData().SetScalars(angle)

现在,您可以使用vtkPolyDataMapper的颜色映射功能来完成您需要的操作。在

相关问题 更多 >