2013-06-12 15 views
7

Sto provando a creare un'animazione con una sequenza di file di dati in mayavi. Sfortunatamente ho notato che la fotocamera non si blocca (sta zumando e zumando). Penso che stia accadendo perché il componente Z della mia mesh sta cambiando e mayavi sta cercando di ricalcolare le scale.telecamera di blocco in mayavi

Come posso risolvere il problema? enter image description here enter image description here enter image description here

import numpy 
from mayavi import mlab 

mlab.figure(size = (1024,768),bgcolor = (1,1,1)) 
mlab.view(azimuth=45, elevation=60, distance=0.01, focalpoint=(0,0,0)) 
#mlab.move(forward=23, right=32, up=12) 

for i in range(8240,8243): 
    n=numpy.arange(10,400,20) 
    k=numpy.arange(10,400,20) 
    [x,y] = numpy.meshgrid(k,n) 
    z=numpy.zeros((20,20)) 
    z[:] = 5 

    M = numpy.loadtxt('B:\\Dropbox\\Master.Diploma\\presentation\\movie\\1disk_j9.5xyz\\'+'{0:05}'.format(i)+'.txt') 
    Mx = M[:,0]; My = M[:,1]; Mz = M[:,2] 
    Mx = Mx.reshape(20,20); My = My.reshape(20,20); Mz = Mz.reshape(20,20); 


    s = mlab.quiver3d(x,y,z,Mx, My, -Mz, mode="cone",resolution=40,scale_factor=0.016,color = (0.8,0.8,0.01)) 

    Mz = numpy.loadtxt('B:\\Dropbox\\Master.Diploma\\presentation\\movie\\Mzi\\' + '{0:05}'.format(i) + '.txt') 
    n=numpy.arange(2.5,400,2) 
    k=numpy.arange(2.5,400,2) 
    [x,y] = numpy.meshgrid(k,n) 

    f = mlab.mesh(x, y, -Mz/1.5,representation = 'wireframe',opacity=0.3,line_width=1) 

    mlab.savefig('B:\\Dropbox\\Master.Diploma\\presentation\\movie\\figs\\'+'{0:05}'.format(i)+'.png') 
    mlab.clf() 
    #mlab.savefig('B:\\Dropbox\\Master.Diploma\\figures\\vortex.png') 
    print(i) 

mlab.show() 

risposta

1

Io non vedo il problema nel vostro diagramma, ma per ripristinare la vista dopo ogni istanza tracciato Inserisci il tuo punto di vista:

mlab.view(azimuth=45, elevation=60, distance=0.01, focalpoint=(0,0,0)) 

direttamente sopra la mlab.savefig callwithin tua per ciclo.

4

per chiunque sia ancora interessato a questo, è possibile provare a eseguire qualsiasi lavoro che si sta svolgendo in questo contesto, che disabiliterà il rendering e restituirà il valore disable_render e le viste della telecamera ai loro stati originali dopo la chiusura del contesto.

with constant_camera_view(): 
    do_stuff() 

Ecco la classe:

class constant_camera_view(object): 
def __init__(self): 
    pass 

def __enter__(self): 
    self.orig_no_render = mlab.gcf().scene.disable_render 
    if not self.orig_no_render: 
     mlab.gcf().scene.disable_render = True 
    cc = mlab.gcf().scene.camera 
    self.orig_pos = cc.position 
    self.orig_fp = cc.focal_point 
    self.orig_view_angle = cc.view_angle 
    self.orig_view_up = cc.view_up 
    self.orig_clipping_range = cc.clipping_range 

def __exit__(self, t, val, trace): 
    cc = mlab.gcf().scene.camera 
    cc.position = self.orig_pos 
    cc.focal_point = self.orig_fp 
    cc.view_angle = self.orig_view_angle 
    cc.view_up = self.orig_view_up 
    cc.clipping_range = self.orig_clipping_range 

    if not self.orig_no_render: 
     mlab.gcf().scene.disable_render = False 
    if t != None: 
     print t, val, trace 
     ipdb.post_mortem(trace) 
1

Si potrebbe utilizzare la vmin e la funzione Vmax nel comando della maglia, se u fare in modo che la scala non cambierà con i tuoi dati e la tua fotocamera dovrebbe rimanere dove è. In questo modo:

f = mlab.mesh(x, y, -Mz/1.5,representation = 'wireframe',vmin='''some value''',vmax='''some value''',opacity=0.3,line_width=1) 
Problemi correlati