我正在使用 Mayavi 绘制带有彩色网格面的三角形网格。首先,我将三角形网格绘制为线框,然后添加面部颜色。(我正在使用另一个 StackOverflow 问题中提出的方法)
我想掩盖这些面孔的一部分,并可以选择掩盖这些面孔周围的线框。Mayavi triangular_mesh 提供了遮罩选项,但我不知道如何将它与组合的线框和曲面一起应用。作为一种解决方法,我创建了一个具有完全透明的第一种颜色的自定义颜色图,并将我想要屏蔽的面的面值设置为零,这样这些面就不会显示。这有效,但没有给我“屏蔽”部分线框网格的选项。此外,对于某些角度,Mayavi 将三角形面的一部分渲染为不透明而不是透明(参见示例)。对于小零件,这不是问题,但对于大于 10,000 个三角形的绘图,这会阻碍分析并且看起来很丑。有谁知道标准的 Mayavi 屏蔽功能是否解决了这个问题以及如何在这里实现它?
import numpy as np
from mayavi import mlab
# Create coordinate, triangular and color data
n = 29
t = np.linspace(-np.pi, np.pi, n)
z = np.exp(1j * t)
x = z.real.copy()
y = z.imag.copy()
z = np.zeros_like(x)
triangles = np.array([(0, i, i + 1) for i in range(1, n)])
x = np.r_[0, x]
y = np.r_[0, y]
z = np.r_[1, z]
face_values = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14]
# Create black wireframe mesh
wire_mesh = mlab.triangular_mesh(x, y, z, triangles, scalars=None, line_width=0.1, representation='wireframe',
color=(0, 0, 0))
# Create face coloring
cell_data = wire_mesh.mlab_source.dataset.cell_data
cell_data.scalars = face_values
cell_data.scalars.name = 'Cell data'
cell_data.update()
# Plot triangular mesh with face coloring
mesh = mlab.pipeline.set_active_attribute(wire_mesh, cell_scalars='Cell data')
surf = mlab.pipeline.surface(mesh, colormap='jet')
# Retrieve the LUT colormap of the surf object. (256x4)
# this is an array of (R, G, B, A) values (each in range 0-255)
lut = surf.module_manager.scalar_lut_manager.lut.table.to_array()
# Modify alpha channel lut
lut[:, -1] = np.ones((lut.shape[0]))*255
# Add first row white color with full opacity
lut_mod = np.vstack((np.array([1, 1, 1, 0]), lut))
# Now use this colormap and show colorbar
surf.module_manager.scalar_lut_manager.lut.table = lut_mod
mlab.colorbar(surf)
mlab.show()