利用matlab制作光栅动画(莫尔条纹动画)
生活随笔
收集整理的這篇文章主要介紹了
利用matlab制作光栅动画(莫尔条纹动画)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用matlab制作光柵動畫(莫爾條紋動畫)
- 1原理
- 2 預期動畫準備
- 3 底片繪制
- 4 光柵動畫
光柵動畫是一種利用一種透明光柵在底片上快速移動,使得看起來底片像是運動的一種動畫方式。這種動畫不依賴于電子媒體以及gif圖,只需要一個事先準備好的底片,以及一個印在透明塑料片上的光柵圖案,即可體驗到動圖的效果(當然電子版的ppt也可以)。
本文嘗試分析光柵動畫的原理,并通過該原理利用matlab編程,實現光柵動畫。
1原理
光柵動畫的原理,首先用到了心理學中知覺組織的連續性原則與閉合原則,讓人利用破碎的信息腦補出一個整體信息,比如下圖:
通過破碎的信息,加上光柵的遮擋之后,人們就會自然地想象出下面這個兩個齒輪的圖。
之后,光柵動畫的原理就是將前面破碎的信息依次拼接起來,隨著光柵位置的改變,變成不同的圖案。將不同光柵位置的不同破碎圖案組合在一起,便構成了底片。
所以,一般光柵動畫具有單顏色(顏色單一容易腦補),動畫周期短(光柵間距減小有利于腦補),動畫簡單且以粗線條或大塊的圖塊為主(參考閉合原則)。
2 預期動畫準備
這里依然以第一節中的雙齒輪動畫作為演示,展示預期要演示的動畫效果。運動周期選擇T=6,不建議選太大(當然太小就得不到效果了)。
clear close all figure('Color','white') N=17; T=6; for k=1:Tclfdt=2*pi/N/T*k;%第一個齒輪hold onfor j=1:Ntheta=2*pi/N*j;R=1.1;plot([-1,-1+R*cos(theta+dt)],[0,R*sin(theta+dt)],'k','linewidth',5)endrectangle('Position',[-1.9,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8)hold off%第二個齒輪hold onfor j=1:Ntheta=2*pi/N*j;R=1.1;dth=2*pi/N/2;plot([1,1-R*cos(theta+dth+dt)],[0,R*sin(theta+dth+dt)],'k','linewidth',5)endrectangle('Position',[0.1,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8)hold offxlim([-3,3])ylim([-2,2])axis offaxis equalpause(0.2)%繪制動圖cdata = print('-RGBImage','-r100'); %保存Figure上的圖像frame.cdata=cdata;frame.colormap=[];imind=frame2im(frame);[imind,cm]=rgb2ind(imind,2);if k==1imwrite(imind,cm,'test.gif','gif', 'Loopcount',inf,'DelayTime',0.2);elseimwrite(imind,cm,'test.gif','gif','WriteMode','append','DelayTime',0.2);endend效果圖如下:
3 底片繪制
底片的繪制與動畫周期和光柵寬度有關。由于之前設置的動畫周期為6,所以底片分6次繪制完成。光柵寬度這里設置為1,也就是每個縫的寬度為1像素。
代碼如下:
%繪制底片close all figure('Color','white') N=17; T=6; for k=1:Tclfdt=2*pi/N/T*k;%第一個齒輪hold onfor j=1:Ntheta=2*pi/N*j;R=1.1;plot([-1,-1+R*cos(theta+dt)],[0,R*sin(theta+dt)],'k','linewidth',5)endrectangle('Position',[-1.9,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8)hold off%第二個齒輪hold onfor j=1:Ntheta=2*pi/N*j;R=1.1;dth=2*pi/N/2;plot([1,1-R*cos(theta+dth+dt)],[0,R*sin(theta+dth+dt)],'k','linewidth',5)endrectangle('Position',[0.1,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8)hold offxlim([-3,3])ylim([-2,2])axis offaxis equalpause(0.2)%繪制底片cdata = print('-RGBImage','-r100');Size_cdata=size(cdata);if k==1cdata_N=cdata;else%每次繪制1個像素,間隔為1*Tcdata_N(:,k:T:Size_cdata(2),:)=cdata(:,k:T:Size_cdata(2),:);endendclf imshow(cdata_N)%展示底片 save('cdata_N.mat','cdata_N')%保存,待會要用底片繪制之后的結果如下:
4 光柵動畫
之后利用這張光柵底片圖(上一節保存成了mat文件),可以制作光柵動畫圖。
這里我先利用之前的底片,制作一個png格式的透明光柵,保存在PPT里,加上動畫播放效果就可以玩了。當然如果能夠有條件自己制作光柵的話也可以實際制作。
clear clcload('cdata_N.mat') cdata_N=double(cdata_N); cdata_Z=255+zeros(size(cdata_N)); %繪制光柵 cdata_Z(119:319,120:480,:)=0; cdata_Z(119:319,120:T:480,:)=255; imwrite(cdata_Z,'GuangShan.png','Alpha',cdata_Z(:,:,1)/255); %保存透明圖像生成的圖片如下:
在matlab里也可以演示其最終效果:
%繪制變形圖和光柵疊加的動圖 clear close all figure('Color','white') N=17; T=6; %處理 load('cdata_N.mat') cdata_N=double(cdata_N); Size_cdata=size(cdata_N); cdata_N=[cdata_N,255*ones(Size_cdata(1),00,Size_cdata(3))];%生成size Size_cdata=size(cdata_N);k=[1:120,119:-1:2]; for j=1:length(k)t=k(j);cdata_Z=255*ones(Size_cdata);%繪制光柵cdata_Z(119:319,250-t:550-t,:)=0;cdata_Z(119:319,250-t:T:550-t,:)=255;%imshow(cdata_Z)%疊加cdata_Combine =imlincomb(1,cdata_N,1,cdata_Z,-255);imshow(cdata_Combine)pause(0.1) end最終效果如下:
總結
以上是生活随笔為你收集整理的利用matlab制作光栅动画(莫尔条纹动画)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果公司:苹果商店App价格将调整 多个
- 下一篇: 我重仓了BCH