利用matlab制作光栅动画(莫尔条纹动画)
利用matlab制作光柵動(dòng)畫(huà)(莫爾條紋動(dòng)畫(huà))
- 1原理
- 2 預(yù)期動(dòng)畫(huà)準(zhǔn)備
- 3 底片繪制
- 4 光柵動(dòng)畫(huà)
光柵動(dòng)畫(huà)是一種利用一種透明光柵在底片上快速移動(dòng),使得看起來(lái)底片像是運(yùn)動(dòng)的一種動(dòng)畫(huà)方式。這種動(dòng)畫(huà)不依賴(lài)于電子媒體以及gif圖,只需要一個(gè)事先準(zhǔn)備好的底片,以及一個(gè)印在透明塑料片上的光柵圖案,即可體驗(yàn)到動(dòng)圖的效果(當(dāng)然電子版的ppt也可以)。
本文嘗試分析光柵動(dòng)畫(huà)的原理,并通過(guò)該原理利用matlab編程,實(shí)現(xiàn)光柵動(dòng)畫(huà)。
1原理
光柵動(dòng)畫(huà)的原理,首先用到了心理學(xué)中知覺(jué)組織的連續(xù)性原則與閉合原則,讓人利用破碎的信息腦補(bǔ)出一個(gè)整體信息,比如下圖:
通過(guò)破碎的信息,加上光柵的遮擋之后,人們就會(huì)自然地想象出下面這個(gè)兩個(gè)齒輪的圖。
之后,光柵動(dòng)畫(huà)的原理就是將前面破碎的信息依次拼接起來(lái),隨著光柵位置的改變,變成不同的圖案。將不同光柵位置的不同破碎圖案組合在一起,便構(gòu)成了底片。
所以,一般光柵動(dòng)畫(huà)具有單顏色(顏色單一容易腦補(bǔ)),動(dòng)畫(huà)周期短(光柵間距減小有利于腦補(bǔ)),動(dòng)畫(huà)簡(jiǎn)單且以粗線條或大塊的圖塊為主(參考閉合原則)。
2 預(yù)期動(dòng)畫(huà)準(zhǔn)備
這里依然以第一節(jié)中的雙齒輪動(dòng)畫(huà)作為演示,展示預(yù)期要演示的動(dòng)畫(huà)效果。運(yùn)動(dòng)周期選擇T=6,不建議選太大(當(dāng)然太小就得不到效果了)。
clear close all figure('Color','white') N=17; T=6; for k=1:Tclfdt=2*pi/N/T*k;%第一個(gè)齒輪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%第二個(gè)齒輪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)%繪制動(dòng)圖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 底片繪制
底片的繪制與動(dòng)畫(huà)周期和光柵寬度有關(guān)。由于之前設(shè)置的動(dòng)畫(huà)周期為6,所以底片分6次繪制完成。光柵寬度這里設(shè)置為1,也就是每個(gè)縫的寬度為1像素。
代碼如下:
%繪制底片close all figure('Color','white') N=17; T=6; for k=1:Tclfdt=2*pi/N/T*k;%第一個(gè)齒輪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%第二個(gè)齒輪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個(gè)像素,間隔為1*Tcdata_N(:,k:T:Size_cdata(2),:)=cdata(:,k:T:Size_cdata(2),:);endendclf imshow(cdata_N)%展示底片 save('cdata_N.mat','cdata_N')%保存,待會(huì)要用底片繪制之后的結(jié)果如下:
4 光柵動(dòng)畫(huà)
之后利用這張光柵底片圖(上一節(jié)保存成了mat文件),可以制作光柵動(dòng)畫(huà)圖。
這里我先利用之前的底片,制作一個(gè)png格式的透明光柵,保存在PPT里,加上動(dòng)畫(huà)播放效果就可以玩了。當(dāng)然如果能夠有條件自己制作光柵的話也可以實(shí)際制作。
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里也可以演示其最終效果:
%繪制變形圖和光柵疊加的動(dòng)圖 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最終效果如下:
總結(jié)
以上是生活随笔為你收集整理的利用matlab制作光栅动画(莫尔条纹动画)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苹果公司:苹果商店App价格将调整 多个
- 下一篇: matlab 光栅 傅里叶,Matlab