根据 VTK(python)中的法线方向为面着色

问题描述 投票:0回答:1

我想在

STL
中可视化
VTK
文件中的对象,这不是问题。

但是,我还想突出显示某些面孔,并根据它们的法线和任意选择的方向之间的阈值角度值,将它们着色为与主要对象不同的颜色,比如

z = (0.0, 0.0, 1.0)
。比如说,所有与
45 degrees
形成小于
z-direction
角的面都应该涂成红色。

我设法使用

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()
python vtk
1个回答
0
投票

我假设你正在使用 vtkPolyDataNormals 来计算法线 - 确保你有 ComputeCellNormalsOn.

接下来,您需要一些东西来遍历法线并计算测试方向的点积。由于您使用的是 Python,我建议在法线数组上使用 vtk_to_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 的颜色映射功能来做您需要的事情。

© www.soinside.com 2019 - 2024. All rights reserved.