1. 程式人生 > >MATLAB中進行動畫製作心得體會及例程

MATLAB中進行動畫製作心得體會及例程

                        在MATLAB中進行動畫製作

   之前應該是說是因為上最優化理論的時候,老師叫我們製作一個動畫,用來比較最優降線和和其他曲線下落時間。自己也是第一次用MATLAB來製作動畫,首先自己先去網上下載程式,找一些相關的材料。但是找到的材料都是描述在動畫中實現一個物體移動的,我的這個程式中需要實現多個物體同時一定的軌跡進行移動。

在MATLAB中可以儲存的動畫格式有兩種,一種是AVI格式,一種是GIF格式的。兩種呼叫的函式不相同。

第一種儲存為gif檔案的呼叫格式

先建立一個類似於控制代碼的物件,這個當你只需要對動畫中呈現一個物體的時候你是可以不用需要建立控制代碼的,也就是呼叫函式line();

比如說下面這段程式碼

**********************在動畫中呈現一個物件***************************

x = 0:0.01:1;

filename ='testAnimated.gif';%%定義檔名

for n = 1:0.5:5

y1= x.^n;

%%y=x;

plot(x,y1)

%%plot(x,y)

%%hold on

drawnow

frame = getframe(1);

im = frame2im(frame);

[A,map] = rgb2ind(im,256);

imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.1);

end

但是在後來實踐中發現,在這個程式中畫兩個物件的話,加上holdon 也是可以呈現一種動畫效果的,但是迴圈中的每一條軌跡都是保留了下來的了。不加holdon的話,只能呈現那條不變的曲線,具體原因不明,望高手解答,而且getframe中的引數也可以改為 (gcf)。

****************************在動畫中呈現多個物件*********************

filename ='testAnimated.gif';

n=1000;%%用於控制小球的運動速度

theta=0:1*pi/n:1*pi;   

x=5*(theta-sin(theta));%%最優降線函式表示式

y1=-5*(1-cos(theta)); %%最優降線函式表示式

y2=-(2/3.14)*x;

y3=-10*sin(0.1*x);

plot(x,y1,'b');

hold on

plot(x,y2,'b');

hold on

plot(x,y3,'b');

h1=line('color',[1,0,0],'marker','.','markersize',50);

h2=line('color',[1,1,0],'marker','.','markersize',50);

h3=line('color',[1,0.5,0.5],'marker','.','markersize',50);

i=1;

while i<1000

set(h1,'xdata',x(i),'ydata',y1(i)); 

set(h2,'xdata',x(i),'ydata',y2(i));  

set(h3,'xdata',x(i),'ydata',y3(i)); 

F=getframe(gcf);

A=frame2im(F);

[A,map]=rgb2ind(A,256);

i=i+1;

imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.1);

end

********************************************************************

最後都是呼叫這個函式imwrite,在這個函式中的WriteMode 是一種寫入模式,我使用的是append 模式,如果使用overwrite模式的話,則沒有最終呈現的就是沒有動畫的效果了。但是使用append模式的時候,其儲存的檔名則必須是已經存在的,也就是說要提前定義好檔名,而不是像AVI格式的那種,可以直接在呼叫函式的時候呼叫。函式後面的引數就是延遲時間了。

第二種儲存為AVI格式的動畫

1)使用舊版本函式生成AVI動畫程式

**********************使用movie2avi 函式****************************

n=1000;%%用於控制小球的運動速度

theta=0:1*pi/n:1*pi;   

x=5*(theta-sin(theta));

y1=-5*(1-cos(theta));

y2=-(2/3.14)*x;

y3=-10*sin(0.1*x);

plot(x,y1,'b');

hold on

plot(x,y2,'b');

hold on

plot(x,y3,'b');

h1=line('color',[1,0,0],'marker','.','markersize',50);

h2=line('color',[1,1,0],'marker','.','markersize',50);

h3=line('color',[1,0.5,0.5],'marker','.','markersize',50);

i=1;

while i<1000

set(h1,'xdata',x(i),'ydata',y1(i)); 

set(h2,'xdata',x(i),'ydata',y2(i));

set(h3,'xdata',x(i),'ydata',y3(i)); 

mov(i) = getframe;  

i=i+1;

movie2avi(mov,'control.avi', 'compression', 'None','fps',30);

end

但是在使用這個函式movie2avi的時候程式一直在出警告:Warning:MOVIE2AVI will be removed in a future release. Use VIDEOWRITER instead. 也就是這個函式在以後的版本將不會使用,建議我們採取新的函式代替。

*********************************************************************

2)使用新版本函式來生成AVI動畫程式

**********************使用writeVideo函式****************************

v =VideoWriter('peaks.avi');提前建立AVI檔案

open(v);

n=100;

theta=0:1*pi/n:1*pi;   

x=5*(theta-sin(theta));

y1=-5*(1-cos(theta));

y2=-(2/3.14)*x;

y3=-10*sin(0.1*x);

plot(x,y1,'b');

hold on

plot(x,y2,'b');

hold on

plot(x,y3,'b');

h1=line('color',[1,0,0],'marker','.','markersize',50);

h2=line('color',[1,1,0],'marker','.','markersize',50);

h3=line('color',[1,0.5,0.5],'marker','.','markersize',50);

i=1;

whilei<100

set(h1,'xdata',x(i),'ydata',y1(i)); 

set(h2,'xdata',x(i),'ydata',y2(i));

set(h3,'xdata',x(i),'ydata',y3(i)); 

frame =getframe;

i=i+1;

writeVideo(v,frame);

end

使用這個函式也不能在呼叫函式的時候,生成一個AVI檔案,需要提前建立這個檔案

*********************************************************

但是在使用這個函式movie2avi的時候程式一直在出警告:Warning:MOVIE2AVI will be removed in a future release. Use VIDEOWRITER instead. 也就是這個函式在以後的版本將不會使用,建議我們採取新的函式代替。

*********************************************************************

  PS:另外在使用這個函式的時候,當你突然把程式給動畫視窗關掉的時候,會在命令視窗報錯:

Error using getframe (line53)

A valid figure or axes handlemust be specified

Error in lijianhua (line 47)

mov(i) = getframe;

其實這個不用擔心哈,你的程式並沒有問題。

從程式上來說,儲存為AVI格式的相對來說更簡單一點,但是AVI格式佔用的記憶體比較大,具體採用那種格式還是看個人喜好吧。目前兩者在其他的差別上還不是很清楚。