如何在Mayavi交互窗口查看相机参数并在代码中复用视图?
在Mayavi中获取并复用交互窗口调整好的视图参数
我完全懂你的需求——就像Matplotlib里能直接读取屏幕底部的相机参数然后用ax.view_init()复现视图那样,Mayavi也能做到,而且操作起来并不复杂,下面分两步给你讲清楚:
一、怎么查看当前交互窗口的相机参数?
当你在Mayavi窗口里拖曳、缩放调好心仪的视图后,不用关闭窗口,打开Python控制台(如果是用Spyder、Jupyter这类环境,直接在控制台输入即可),执行以下代码就能获取所有关键的相机参数:
from mayavi import mlab # 获取当前场景 scene = mlab.gcf().scene # 获取相机对象 camera = scene.camera # 打印核心参数 print(f"方位角 (azimuth): {camera.azimuth_angle}") print(f"仰角 (elevation): {camera.elevation_angle}") print(f"焦点位置 (focal point): {camera.focal_point}") print(f"相机位置 (position): {camera.position}") print(f"视图向上方向 (view up): {camera.view_up}")
其中azimuth_angle和elevation_angle就是和Matplotlib里对应的方位角、仰角,另外的焦点、相机位置等参数可以帮你复现更精准的视图(比如缩放后的状态)。
二、怎么在代码中应用这些参数?
有两种方式可以实现,按需选择:
方式1:用mlab.view()快速设置(适合只需要方位角和仰角的场景)
mlab.view()是Mayavi提供的封装好的视图设置函数,直接传入你获取到的方位角和仰角就行:
# 替换成你实际获取到的参数 mlab.view(azimuth=84, elevation=-9)
如果需要同时调整距离(缩放)和焦点,也可以加上distance和focalpoint参数。
方式2:直接操作相机对象(精准复现所有视图细节)
如果想要完全复刻交互窗口里的视图(包括缩放、焦点位置等),直接修改相机对象的参数更靠谱:
scene = mlab.gcf().scene camera = scene.camera # 替换成你获取到的实际参数 camera.azimuth_angle = 84 camera.elevation_angle = -9 camera.focal_point = [256, 256, 500] # 示例值,以你的数据为准 camera.position = [256, 256, 1500] # 示例值 camera.view_up = [0, 1, 0] # 示例值 # 刷新视图 scene.render()
结合你的代码示例的完整版本
把视图设置代码加到你的脚本里,放在mlab.draw()之前就行,比如:
from mayavi import mlab import numpy as np img = np.random.uniform(0, 255, size=(512, 512)).astype(np.int) N = 10000 event_size = 2 xs = np.random.uniform(img.shape[1], size=N) ys = np.random.uniform(img.shape[0], size=N) ts = np.sort(np.random.uniform(1000, size=N)) ps = np.random.randint(0,2,size=N) mlab.imshow(img, colormap='gray', extent=[0, img.shape[0], 0, img.shape[1], ts[0], ts[1]]) colors = [0 if p>0 else 240 for p in ps] ones = np.ones(len(xs)) p3d = mlab.quiver3d(ys, xs, ts, ones, ones, ones, scalars=colors, mode='sphere', scale_factor=event_size) p3d.glyph.color_mode = 'color_by_scalar' p3d.module_manager.scalar_lut_manager.lut.table = colors # 这里添加视图设置代码,替换成你获取到的参数 scene = mlab.gcf().scene camera = scene.camera camera.azimuth_angle = 84 # 替换为你实际获取的方位角 camera.elevation_angle = -9 # 替换为你实际获取的仰角 # 可以根据你的数据调整焦点位置,比如取图像中心和时间中间值 camera.focal_point = [img.shape[0]/2, img.shape[1]/2, (ts[0]+ts[-1])/2] scene.render() mlab.draw() mlab.show()
内容的提问来源于stack exchange,提问作者Mr Squid
相关产品推荐
相关产品推荐

