2013-06-12 7 views
7

Ich versuche, eine Animation mit einer Sequenz von Datendateien in Mayavi zu machen. Leider habe ich festgestellt, dass die Kamera nicht arretiert (zoomen und herauszoomen). Ich denke, es passiert, weil sich die Z-Komponente meines Netzes ändert und mayavi versucht, Skalen neu zu berechnen.Kamera in Mayavi sperren

Wie kann ich es beheben? 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() 

Antwort

1

ich nicht wirklich das Problem in Ihrem Grundstück sehen, aber die Sicht nach jeder Plotten Instanz zurückzusetzen Aussichtspunkt einfügen:

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

direkt über Ihr mlab.savefig callwithin Ihre für die Schleife.

4

Für alle, die noch daran interessiert sind, könnten Sie versuchen, die Arbeit, die Sie in diesem Kontext tun, einzuschränken, die das Rendern deaktiviert und den Wert disable_render und die Kameraansichten in den ursprünglichen Zustand zurückversetzt.

with constant_camera_view(): 
    do_stuff() 

Hier ist die Klasse:

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

Sie haben soeben die Vmin und Vmax-Funktion in Ihrem Mesh-Befehl verwenden können, wenn u bleiben tun so sollte die Waage nicht mit Ihren Daten und Ihrer Kamera ändern, in dem es ist. Gefällt mir:

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