使用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事件处理程序的鼠标拖动?
九个月后,我终于找到了解决办法的线索!另一个堆栈溢出的问题和答案,有可能禁止轴旋转与鼠标在Mayavi?,让我萌生了建立一个非默认的"交互器"来控制鼠标点击和拖动的含义的想法。
确实有一个交互器,无论用户做什么,它都保持z轴"向上":
http://www.vtk.org/doc/nightly/html/classvtkInteractorStyleTerrain.html要在Mayavi主窗口中激活这个交互器,只需在代码中添加以下三行代码(例如,您可以将它们添加到问题中的全球构建代码中),全球将始终保持直立!
from tvtk.api import tvtk
fig = mlab.gcf()
fig.scene.interactor.interactor_style = tvtk.InteractorStyleTerrain()