mayavi:如何放大非常接近(改变近剪裁距离)

时间:2012-03-16 20:47:45

标签: python mayavi

我正在尝试使用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)

1 个答案:

答案 0 :(得分:1)

听起来你希望旋转中心更接近球体表面。我相信在大多数VTK环境中,旋转中心是焦点。我不确定是否有击键或鼠标手势来改变这一点,但我很确定mayavi中的“缩放”(例如,使用滚轮)实际上是玩偶(除非你处于平行投影模式),所以你正在移动相机和焦点。

您可能想尝试找到camera.SetDistance功能,并将焦点的距离设置为1或2米。在TVTK中,这就像是scene.camera.distance = 2 ......或者,Mayavi有一个很好的机会让菜单公开这个选项。

祝你好运!