我正在尝试使用 Mayavi 在一个场景中显示两个 3D 数据集,特别是该mlab.volume()
方法。这两个数据集显示为部分透明的云,使用两种不同的色标表示密度。每个数据集本身的透明度都很好:确实可以在某种程度上看到低密度区域并识别后面的高密度区域。
然而,当显示两个数据集时,后来添加的一个总是完全覆盖另一个,即使是非常低的密度。这是一个简化的示例,橙色数据集是在紫色数据集之后添加的。
而不是这个,我期望的是(较大的)紫色云的外部区域应该部分遮盖橙色云。对于我试图想象的东西,这是极具误导性的。我还尝试在渲染之前将所有数据集放在一起,但是我找不到获得两种不同颜色比例的方法。
这是用于生成上图的代码:
from mayavi import mlab
import numpy as np
from tvtk.util import ctf
from matplotlib import cm
def cmap_to_ctf(cmap_name):
values = list(np.linspace(0, 1, 256))
cmap = cm.get_cmap(cmap_name)(values)
transfer_function = ctf.ColorTransferFunction()
for i, v in enumerate(values):
transfer_function.add_rgb_point(v, cmap[i, 0], cmap[i, 1], cmap[i, 2])
return transfer_function
plot_range = 4
x = np.linspace(-plot_range, plot_range, 200)
y = np.linspace(-plot_range, plot_range, 200)
z = np.linspace(-plot_range, plot_range, 200)
xx, yy, zz = np.meshgrid(x, y, z)
beam_1 = np.exp(-xx**2 - zz**2)
beam_2 = np.exp(-2 * (yy**2 + zz**2))
mlab.figure(bgcolor=(1, 1, 1))
source_1 = mlab.pipeline.scalar_field(beam_1)
vol_1 = mlab.pipeline.volume(source_1, vmin=0, vmax=1)
# The following is to set the color scale.
ctf_1 = cmap_to_ctf('RdPu')
vol_1._volume_property.set_color(ctf_1)
vol_1._ctf = ctf_1
vol_1.update_ctf = True
vol_1._volume_property.shade = 0
source_2 = mlab.pipeline.scalar_field(beam_2)
vol_2 = mlab.pipeline.volume(source_2, vmin=0, vmax=1)
# The following is to set the color scale.
ctf_2 = cmap_to_ctf('Oranges')
vol_2._volume_property.set_color(ctf_2)
vol_2._ctf = ctf_2
vol_2.update_ctf = True
vol_2._volume_property.shade = 0
mlab.show()