我是靠谱客的博主 跳跃吐司,这篇文章主要介绍利用matlab制作光栅动画(莫尔条纹动画)1原理2 预期动画准备3 底片绘制4 光栅动画,现在分享给大家,希望可以做个参考。

利用matlab制作光栅动画(莫尔条纹动画)

  • 1原理
  • 2 预期动画准备
  • 3 底片绘制
  • 4 光栅动画

光栅动画是一种利用一种透明光栅在底片上快速移动,使得看起来底片像是运动的一种动画方式。这种动画不依赖于电子媒体以及gif图,只需要一个事先准备好的底片,以及一个印在透明塑料片上的光栅图案,即可体验到动图的效果(当然电子版的ppt也可以)。

本文尝试分析光栅动画的原理,并通过该原理利用matlab编程,实现光栅动画。

1原理

光栅动画的原理,首先用到了心理学中知觉组织的连续性原则与闭合原则,让人利用破碎的信息脑补出一个整体信息,比如下图:
PPT绘制,很丑
通过破碎的信息,加上光栅的遮挡之后,人们就会自然地想象出下面这个两个齿轮的图。

之后,光栅动画的原理就是将前面破碎的信息依次拼接起来,随着光栅位置的改变,变成不同的图案。将不同光栅位置的不同破碎图案组合在一起,便构成了底片。

所以,一般光栅动画具有单颜色(颜色单一容易脑补),动画周期短(光栅间距减小有利于脑补),动画简单且以粗线条或大块的图块为主(参考闭合原则)。

2 预期动画准备

这里依然以第一节中的双齿轮动画作为演示,展示预期要演示的动画效果。运动周期选择T=6,不建议选太大(当然太小就得不到效果了)。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
clear close all figure('Color','white') N=17; T=6; for k=1:T clf dt=2*pi/N/T*k; %第一个齿轮 hold on for j=1:N theta=2*pi/N*j; R=1.1; plot([-1,-1+R*cos(theta+dt)],[0,R*sin(theta+dt)],'k','linewidth',5) end rectangle('Position',[-1.9,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8) hold off %第二个齿轮 hold on for j=1:N theta=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) end rectangle('Position',[0.1,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8) hold off xlim([-3,3]) ylim([-2,2]) axis off axis equal pause(0.2) %绘制动图 cdata = print('-RGBImage','-r100'); %保存Figure上的图像 frame.cdata=cdata; frame.colormap=[]; imind=frame2im(frame); [imind,cm]=rgb2ind(imind,2); if k==1 imwrite(imind,cm,'test.gif','gif', 'Loopcount',inf,'DelayTime',0.2); else imwrite(imind,cm,'test.gif','gif','WriteMode','append','DelayTime',0.2); end end

效果图如下:
这是GIF图

3 底片绘制

底片的绘制与动画周期和光栅宽度有关。由于之前设置的动画周期为6,所以底片分6次绘制完成。光栅宽度这里设置为1,也就是每个缝的宽度为1像素。

代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
%绘制底片 close all figure('Color','white') N=17; T=6; for k=1:T clf dt=2*pi/N/T*k; %第一个齿轮 hold on for j=1:N theta=2*pi/N*j; R=1.1; plot([-1,-1+R*cos(theta+dt)],[0,R*sin(theta+dt)],'k','linewidth',5) end rectangle('Position',[-1.9,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8) hold off %第二个齿轮 hold on for j=1:N theta=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) end rectangle('Position',[0.1,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8) hold off xlim([-3,3]) ylim([-2,2]) axis off axis equal pause(0.2) %绘制底片 cdata = print('-RGBImage','-r100'); Size_cdata=size(cdata); if k==1 cdata_N=cdata; else %每次绘制1个像素,间隔为1*T cdata_N(:,k:T:Size_cdata(2),:)=cdata(:,k:T:Size_cdata(2),:); end end clf imshow(cdata_N)%展示底片 save('cdata_N.mat','cdata_N')%保存,待会要用

底片绘制之后的结果如下:
底片图

4 光栅动画

之后利用这张光栅底片图(上一节保存成了mat文件),可以制作光栅动画图。

这里我先利用之前的底片,制作一个png格式的透明光栅,保存在PPT里,加上动画播放效果就可以玩了。当然如果能够有条件自己制作光栅的话也可以实际制作。

复制代码
1
2
3
4
5
6
7
8
9
10
11
clear clc load('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里也可以演示其最终效果:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
%绘制变形图和光栅叠加的动图 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制作光栅动画(莫尔条纹动画)1原理2 预期动画准备3 底片绘制4 光栅动画的全部内容,更多相关利用matlab制作光栅动画(莫尔条纹动画)1原理2内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部