利用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制作光栅动画(莫尔条纹动画)相关推荐
- 利用MATLAB制作基于艾宾浩斯记忆曲线的背单词计划
利用MATLAB制作基于艾宾浩斯记忆曲线的背单词计划 最近感觉自己的英语不够用了,需要背点单词了.打算学期结束后就开始背单词,现在已经入手了<恋练有词>,整本书共30个小部分.听说根据艾宾 ...
- html靶心制作,如何利用PPT制作正中靶心小动画 实例教程
用PPT做了个射靶的小动画,如下所示, 本篇我们来讲解用PPT绘制动画中的素材--标和靶,下篇会讲解如何制作该动画. 1. 首先我们来画一个靶. 当然,我们可以依次点击"插入"-- ...
- 第四周作业:利用matlab制作图像的二值模板并分别利用模板进行“与模板相与”、“与模板相或”、“与模板异或”操作
文章目录 第四周作业 第一题 第二题 第四周作业 第一题 题目: 利用 MATLAB 编程,打开自己的一张照片,依次完成下列要求: 1) 以照片的自己作为目标,制作二值模板 2) 分别利用模板进行&q ...
- 如何利用Matlab制作色卡,手把手教你做一张属于自己的色卡,彩铅必备!
色卡是用于色彩选择.比对.沟通,是色彩实现在一定范围内统一标准的工具.很多彩铅刚入门的友友们对于色彩还不是特别熟悉,上色的时候找对应颜色的彩铅就会比较麻烦,做一张色卡可以方便按色号查找画笔颜色,让你快 ...
- 利用MATLAB制作各种心形
最近闲来无事,整理了一些采用MATLAB软件来绘制心形的代码: 1. >> [x,y,z]=meshgrid(linspace(-1.3,1.3)); >> val=(x.^2 ...
- 【转载】利用Matlab制作钟表
静态时钟 hObject=figure; set(hObject,'NumberTitle','off'); set(hObject,'MenuBar','none'); set(hObject,'v ...
- 如何利用Matlab制作色卡,(七)用matlab生成二值化图和24色卡
[code]%生成4个半径依次为10,30,50,100的圆 clc; clear; close all; I = zeros(256,256); %定义一个256*256的灰度图 iter = [1 ...
- 利用MATLAB实现图片切换动画效果详解
内容摘要:本博文介绍MATLAB图片切换动画效果的制作以及GIF文件保存,并结合具体代码详细解释.介绍了利用MATLAB编程进行几幅图片的轮流切换,切换时实现与幻灯片切换相似的炫酷的图片切换特效.其中 ...
- 莫尔条纹三维测量仿真matlab,利用莫尔条纹测量物体三维形貌新方法研究
第 37 卷第 7 期 2008 年 7 月 光 子 学 报 ACTA PHOTONICA SINICA Vol. 37 No. 7 July 2008 3陕西省教育厅专项科研计划(05J K221) ...
- 用MATLAB做一个单摆运动的动画
用MATLAB做一个单摆运动的动画 MATLAB与单摆运动 MATLAB在机械机构分析和数值理论计算中中应用广泛.倒立摆系统的设计与弹簧振子设计类似,本文将利用MATLAB脚本建立单摆运动的动画演示. ...
最新文章
- 看漫画学Python,屏幕前的彦祖要不要试试?
- spring-security问题记录
- openHEVC 编译 for VS2017+Win10 x64
- 【王俊杰de人工智能实战课】第7次作业2
- ioca0中断 pic单片机_单片机入门知识-PIC为例程序.ppt
- python列表赋值 连续整数_Python_03_字符串_数据类型_for循环_列表操作
- ubuntu 安装Pangolin 过程
- 数据库系统概论--课后习题
- 【汇编】更灵活的定位内存地址方式——and,or命令、SI、DI变址寄存器、直接寻址[idata]、寄存器间接寻址[bx]、寄存器相对寻址[bx+idata]、基址变址寻址、相对基址变址寻址
- MD通过vscode生成PDF(带目录标签)
- fatal: couldn‘t find remote ref develop-XXXX fatal: the remote end hung up unexpectedly
- echarts中环形图加边框
- 计算机设备名称在哪里找,如何查看电脑驱动
- 雷军在北京大学的演讲
- 大学计算机课算绩点吗,大学体育成绩算入绩点吗?
- nyist 252 01串
- 前端面试题汇总(含答案)(JS篇)
- 通讯录管理系统报告java_java实现通讯录管理系统
- 射频功率测量角度看数字调制信号
- 计算机原理--计算机的控制器