2012-03-16 3 views
1

Я пытаюсь визуализировать точку на поверхности земли, используя интерфейс mlab для майави. Главная проблема в том, что земля большая, но я хочу, чтобы ее можно было увеличить, чтобы увидеть ее очень маленькую область.mayavi: как увеличить масштаб очень очень близко (изменение вблизи расстояния отсечения)

Похоже, что использование колесика прокрутки в окне майави изменяет расстояние камеры от его фокусной точки. Если я сосредоточусь на том, что меня интересует и увеличит масштаб, в конечном итоге расстояние камеры до фокальной точки меньше, чем близкое расстояние отсечения, и я больше не вижу смысла.

можно программно установить рядом с точкой отсечения камеры, как так:

eng = mlab.get_engine() 
scene = eng.scenes[0].scene 
cam = scene.camera 
scene.camera.clipping_range = [10000, 100000] 

и правильно показывает, что я хочу видеть, но если я что-нибудь с помощью мыши (поворот изображения с помощью перетаскивания , переместите колесо прокрутки), плоскость отсечения будет сброшена, и я ничего не увижу. Этот полпути поражает цель окна майави.

Вопрос: Как я могу заставить этот пример работать так, чтобы я мог видеть, что я рисую (глиф 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

Похоже, вы хотите, чтобы центр вращения, чтобы быть ближе к поверхности сферы. Я считаю, что в большинстве сред VTK центр вращения является фокусом. Я не уверен, есть ли нажатие клавиш или жесты мыши, чтобы изменить это, но я уверен, что «масштабирование» в майави (например, с помощью колесика прокрутки) на самом деле выполняется (если вы не находитесь в режиме параллельной проекции), поэтому вы перемещаете как камеру, так и фокус.

Возможно, вы захотите найти функцию camera.SetDistance и установить расстояние до фокуса 1 или 2 метра. В TVTK это будет что-то вроде scene.camera.distance = 2 ... или, есть хороший шанс, что у Mayavi есть меню, которое предоставляет этот вариант.

Удачи вам!

 Смежные вопросы

  • Нет связанных вопросов^_^