据我所知,没有文档可以做到这一点,但是我找到了一种方法,只需很少的黑客攻击。这是一个最小的示例,可能需要对不同种类的源进行一些修补:
from tvtk.api import tvtk; from mayavi import mlab; import numpy as npx,y,z=np.random.random((3,nr_points)) #some datacolors=np.random.randint(256,size=(100,3)) #some RGB or RGBA colorspts=mlab.points3d(x,y,z)sc=tvtk.UnsignedCharArray()sc.from_array(colors)pts.mlab_source.dataset.point_data.scalars=scpts.mlab_source.dataset.modified()
看起来有时您还必须确保映射器指向正确的事物。对于上面的示例,这不是必需的,但是对于其他来源,可能是必需的
pts.actor.mapper.input=pts.mlab_source.dataset
在某个时候,应该更好地修复mayavi
API,以便有一个API可以针对所有管道功能执行此操作,但是事实证明这是相当复杂且大范围的更改,我目前没有时间进行完。
编辑:用户
eqzx发布了另一个问题的答案(在MayaVi中为3D点指定绝对颜色),这可能更简单,尤其是对于某些难以使用的源类型
tvtk.UnsignedCharArray。
他的想法是创建一个跨越256x256x256
RGB值整个范围的LUT。请注意,此LUT因此具有16,777,216项。如果您不打算在多个vtk对象中使用它,则可能会浪费大量内存。
#create direct grid as 256**3 x 4 array def create_8bit_rgb_lut(): xl = numpy.mgrid[0:256, 0:256, 0:256] lut = numpy.vstack((xl[0].reshape(1, 256**3), xl[1].reshape(1, 256**3), xl[2].reshape(1, 256**3), 255 * numpy.ones((1, 256**3)))).T return lut.astype('int32')# indexing function to above griddef rgb_2_scalar_idx(r, g, b): return 256**2 *r + 256 * g + b#N x 3 colorscolors = numpy.array([_.color for _ in points])#N scalarsscalars = numpy.zeros((colors.shape[0],))for (kp_idx, kp_c) in enumerate(colors): scalars[kp_idx] = rgb_2_scalar_idx(kp_c[0], kp_c[1], kp_c[2])rgb_lut = create_8bit_rgb_lut()points_mlab = mayavi.mlab.points3d(x, y, z keypoint_scalars, mode = 'point')#magic to modify lookup table points_mlab.module_manager.scalar_lut_manager.lut._vtk_obj.SetTableRange(0, rgb_lut.shape[0])points_mlab.module_manager.scalar_lut_manager.lut.number_of_colors = rgb_lut.shape[0]points_mlab.module_manager.scalar_lut_manager.lut.table = rgb_lut


