2013-06-12 27 views
7

Tôi đang cố gắng tạo hoạt ảnh với một chuỗi các tệp dữ liệu trong mayavi. Thật không may tôi đã nhận thấy rằng máy ảnh không khóa (nó đang phóng to và thu nhỏ). Tôi nghĩ rằng nó đang xảy ra bởi vì các componrnt Z của lưới của tôi đang thay đổi và mayavi đang cố gắng tính toán lại quy mô.khóa máy ảnh trong mayavi

Làm cách nào để khắc phục sự cố? 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() 

Trả lời

1

tôi không thực sự gặp sự cố trong cốt truyện của bạn, nhưng để thiết lập lại quan điểm sau mỗi trường hợp âm mưu chèn điểm xem của bạn:

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

trực tiếp trên mlab.savefig bạn callwithin của bạn cho vòng lặp.

4

cho bất cứ ai vẫn quan tâm đến điều này, bạn có thể thử gói bất kỳ công việc nào bạn đang làm trong ngữ cảnh này, điều này sẽ vô hiệu hóa hiển thị và trả lại giá trị disable_render và máy ảnh về trạng thái ban đầu của chúng sau khi thoát khỏi ngữ cảnh.

with constant_camera_view(): 
    do_stuff() 

Dưới đây là các lớp:

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

Bạn chỉ có thể sử dụng Vmin và chức năng vmax trong lệnh lưới của bạn, nếu u làm như vậy quy mô sẽ không thay đổi với dữ liệu của bạn và máy ảnh của bạn nên ở lại nơi nó là. Như sau:

f = mlab.mesh(x, y, -Mz/1.5,representation = 'wireframe',vmin='''some value''',vmax='''some value''',opacity=0.3,line_width=1) 
Các vấn đề liên quan