0

我正在尝试使用 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()
4

0 回答 0