Mayavi: как увеличить очень очень близко (изменить расстояние отсечения) - PullRequest
1 голос
/ 17 марта 2012

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

Похоже, что использование колеса прокрутки в окне 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 Ответ

1 голос
/ 18 марта 2012

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

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

Удачи!

...