mayavi への mlab インターフェイスを使用して、地球の表面上の点を視覚化しようとしています。主な問題は、地球が大きいことですが、ズームインして非常に小さな領域を表示できるようにしたいと考えています。
mayavi ウィンドウでスクロールホイールを使用すると、カメラの焦点からの距離が変化するようです。気になるポイントにピントを合わせてズームインすると、最終的には焦点までのカメラの距離がニア クリッピング距離よりも短くなり、ポイントが見えなくなります。
次のように、カメラの近くのクリッピング ポイントをプログラムで設定できます。
eng = mlab.get_engine()
scene = eng.scenes[0].scene
cam = scene.camera
scene.camera.clipping_range = [10000, 100000]
それは私が見たいポイントを適切に示していますが、マウスで何かをすると(ドラッグしてビューを回転させ、スクロールホイールを動かします)、クリッピングプレーンがリセットされ、何も見えません。これは、mayavi ウィンドウの目的を中途半端に無効にします。
質問: 描画しているポイント (グリフは幅 1 メートル) を確認しながらウィンドウを操作できるように、この例を機能させるにはどうすればよいでしょうか?
これが私のコードです(読みやすくするために、drawSphere関数は以下にあります):
import numpy as np
from numpy import r_, c_, pi
from mayavi import mlab
rE = 6378137 #radius of the earth, in meters
drawSphere(r=rE)
pointAEcef = c_[-2252280.7, -5867391.7, 1100769.5]
mlab.points3d(pointAEcef[:,0],pointAEcef[:,1],pointAEcef[:,2],
color=(0.0,0.0,1.0),scale_factor=1.0
)
mlab.view(
azimuth=-110.09214289721747,
elevation=102.86270612105356,
distance=80.0,
focalpoint=pointAEcef[0,:],
)
eng = mlab.get_engine()
scene = eng.scenes[0].scene
cam = scene.camera
scene.camera.clipping_range = [50, 27e6]
scene.render()
mlab.show()
drawSphere 関数は次のとおりです。
def drawSphere(r=1,fig=None):
"""
Draw a sphere of the given radius in the given figure
"""
r = float(r)
# Create a sphere
pi = np.pi
cos = np.cos
sin = np.sin
phi, theta = np.mgrid[0:pi:101j, 0:2*pi:101j]
x = r*sin(phi)*cos(theta)
y = r*sin(phi)*sin(theta)
z = r*cos(phi)
if fig is not None:
fig = mlab.figure(fig)
else:
fig = mlab.gcf()
colorsphere=mlab.mesh(x,y,z,
figure=fig,
color=(0,0,1),
opacity=0.1,
)
grid = mlab.mesh(x,y,z,
figure=fig,
mask_points=100,
color=(1,0,0),
representation="wireframe",
opacity=0.1,
)
xaxis = mlab.quiver3d(0,0,0,1.5*r,0,0,color=(1,0,0),scale_mode='none',scale_factor=r);
yaxis = mlab.quiver3d(0,0,0,0,1.5*r,0,color=(0,1,0),scale_mode='none',scale_factor=r);
zaxis = mlab.quiver3d(0,0,0,0,0,1.5*r,color=(0,0,1),scale_mode='none',scale_factor=r);
#mlab.view(azimuth=0,elevation=90,distance=1.1,focalpoint=(0,0,0));
#mlab.roll(30);
#cam = fig.scene.camera;
return (colorsphere,grid,xaxis,yaxis,zaxis)