限制Mayavi鼠标拖动以围绕其轴旋转地球

时间:2013-01-08 22:57:54

标签: python scipy visualization mayavi mayavi.mlab

使用iPython Notebook,我已经能够使用以下代码建立地球地球:

from mayavi import mlab
from mayavi.sources.builtin_surface import BuiltinSurface

ocean_blue = (0.4, 0.5, 1.0)
r = 6371 # km

sphere = mlab.points3d(0, 0, 0, name='Globe',
  scale_mode='none', scale_factor=r * 2.0,
  color=ocean_blue, resolution=50)

sphere.actor.property.specular = 0.20
sphere.actor.property.specular_power = 10

continents_src = BuiltinSurface(source='earth', name='Continents')
continents_src.data_source.on_ratio = 1  # detail level
continents_src.data_source.radius = r
continents = mlab.pipeline.surface(continents_src, color=(0, 0, 0))

但是当我使用鼠标与生成的3D窗口进行交互时,很难将其保持在正面朝上,因为UI会将鼠标拖动到左侧或右侧,以尝试旋转场景(或相机?)围绕当前窗口的垂直轴,而不是通过地球的轴本身。

有没有办法约束用户交互代码,以便左右鼠标拖动围绕其轴旋转地球仪,无论轴是否指向上下直线,无论是通过设置一些Mayavi参数,或者通过将一些Python代码注册为鼠标拖动的UI事件处理程序?

1 个答案:

答案 0 :(得分:3)

九个月后,我终于遇到了一条线索,引导我找到解决方案!另一个Stack Overflow问题和答案Is it possible to prohibit axes rotation with the mouse in Mayavi?让我想到了设置一个非默认的“交互器”来控制鼠标点击和拖动的含义。

无论用户做什么,确实存在一个让Z轴保持“向上”的交互器:

http://www.vtk.org/doc/nightly/html/classvtkInteractorStyleTerrain.html

要在Mayavi主窗口中激活此交互器,只需在代码中添加以下三行(例如,您可以将它们添加到问题中的全球构建代码中),并且地球将始终保持直立! / p>

from tvtk.api import tvtk
fig = mlab.gcf()
fig.scene.interactor.interactor_style = tvtk.InteractorStyleTerrain()