5

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 パラメータを設定することによって、軸が真上または下を向いているかどうかに関係なく、左または右のマウスドラッグがその軸を中心に地球を回転させるように、ユーザー対話コードを制約する方法はありますか?または、マウス ドラッグの UI イベント ハンドラーとして登録された Python コードを取得することでしょうか。

4

1 に答える 1

4

9 か月後、解決策につながる手がかりにたどり着きました。別のスタック オーバーフローの質問と回答、Mayavi でマウスを使用して軸の回転を禁止することは可能ですか? 、マウスのクリックとドラッグが何を意味するかを制御するために、デフォルト以外の「インタラクター」を設定するというアイデアに私をさらしました。

実際、ユーザーが何をしても Z 軸を「上」に保つインタラクターがあります。

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

Mayavi のメイン ウィンドウでこのインタラクターをアクティブにするには、次の 3 行をコードに追加するだけです (たとえば、質問にある私のグローブ構築コードに追加できます)。グローブは常に直立したままになります!

from tvtk.api import tvtk
fig = mlab.gcf()
fig.scene.interactor.interactor_style = tvtk.InteractorStyleTerrain()
于 2013-09-13T18:43:31.023 に答える