《《Matlab动画技术》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《Matlab动画技术》PPT课件.ppt(43页珍藏版)》请在金锄头文库上搜索。
1、1. 程序动画程序动画 从计算机图形学上看,动画就是绘制的图形发生变化。这个变化不能太快,也不能太慢,要被人的视觉接受。在程序执行时,能够使图形变化达到视觉要求。例例 程序动画制作。下面程序就完成了一个动画。X,Y=meshgrid(-10:1:10);Z=X.2/36-Y.2/25;h=mesh(Z)for i=1:10:360rotate(h,20,3,56,i)pause(0.1)end 程序动画与电影动画程序动画与电影动画 程序中rotate函数是Matlab提供的一个图形变换函数。函数rotate(h,20,3,56,i)中, h是图形句柄,表示Mesh(Z)绘制的图形;20,3,5
2、6决定了旋转轴方向;i表示旋转角度,单位是度。 程序运行后,观看到的效果是一个面片在飞舞。为了更好的观察面片的变化情况,改动上面程序为:for i=1:6 subplot(2,3,i) X,Y=meshgrid(-10:1:10); Z=X.2/36-Y.2/25; h=mesh(Z) rotate(h,20,3,56,i*55) axis tight off pause(0.1)end 绘制出的动画效果比较好,为了仔细观察,下图截取了动画的一些中间图形。 这些图形是旋转时一些变化瞬间的图形。面片是一样的,只不过是旋转过程中看到的各个不同侧面而已。程序动画很多时候借助pause函数来完成。2.
3、 绘制图形制作电影动画绘制图形制作电影动画 Matlab提供了动画制作函数movie,使用movie函数生成动画就称为电影动画。生成动画必须有很多帧图形连续播放,如果这些图形是绘制而成的,就叫这种动画为绘制图形的电影动画。程序中使用了moviein函数创建一个结构体数组,专门用来装载动画的各帧;使用getframe函数(命令)把绘制出的图形装入结构体。其中,绘制每一帧图形之前,先使用了FFT变换函数。程序最后一句是播放函数,以每秒5幅的速度播放画面。M=moviein(16);for j=1:16 plot(fft(eye(j+16); axis equal M(:,j)=getframe;
4、pause(0.1)endmovie(M,5)例例 播放一个不断变化的眼球程序段。l getframe函数函数 getframe函数可将当前图形窗口作为一个画面取下并保存,格式为:m=getframe。它将每一帧画面信息数据截取下来整理成列向量。该函数截取图形的点阵信息,图形窗口的大小,对数据向量的大小影响较大,窗口越大,所需存储容量越大。而图形的复杂性对数据容量要求没有直接的关系。l moviein函数函数 函数m=moviein(n)用来建立一个足够大的 n 列的矩阵 m,用来保存 n 幅画面的数据,以备播放。 movie(m,k)以每秒 k 幅图形的速度播放由矩阵 m 的列向量所组成的画
5、面。l movie函数函数改动前面的程序如下,能够制作出新的动画。右边程序可以观察到一个椭圆转化成矩形的过程。左边程序演示一个球体从多面体演化来的过程。M=moviein(16);for j=1:16 sphere(j); axis equal M(:,j)=getframe; endmovie(M,10)M=moviein(16);for j=16:-1:1 rectangle(Position,4,5,15,10,Curvature,j/16); M(:,j)=getframe; axis equal endmovie(M,2)3. 基于图像制作电影动画基于图像制作电影动画 动画效果是由于
6、一幅幅图形变化产生的,如果这些图形来自于图像,那么就称该动画为基于图像的动画。(a) 1.jpg (b) 2.jpg (c) 3.jpg 下列3个图象是用画图工具绘制出来的,分别命名为1.jpg、2.jpg与3.jpg,存储在D盘根目录下。 制作动画的三幅图像制作动画的三幅图像for i=1:3 k=int2str(i); k1=strcat(d:,k,.jpg); a1=imread(k1); image(a1); m(:,i)=getframeendmovie(m,10) 下面程序使用getframe函数装载上述几幅图像,使用movie函数播放这几幅图像就是一个动画。4. 几个例题几个例题
7、例例 下述程序播放一个直径不断变化的球体。n=30x,y,z=spherem=moviein(n);for j=1:n surf(j*x,j*y,j*z) m(:,j)=getframe;endmovie(m,30);例例 三维图形的影片动画。clf;shg,x=3*pi*(-1:0.05:1);y=x;X,Y=meshgrid(x,y);R=sqrt(X.2+Y.2)+eps;Z=sin(R)./R;h=surf(X,Y,Z);colormap(jet);axis offn=12;mmm=moviein(n);for i=1:n rotate(h,0 0 1,25); mmm(:,i)=ge
8、tframe;endmovie(mmm,5,10)function f=anim_zzy1(K,ki)% anim_zzy1.m 演示红色小球沿一条封闭螺线运动的实时动画% 仅演示实时动画的调用格式为 anim_zzy1(K)% 既演示实时动画又拍摄照片的调用格式为 f=anim_zzy1(K,ki)% K 红球运动的循环数(不小于1)% ki 指定拍摄照片的瞬间,取 1 到 1034 间的任意整数。% f 存储拍摄的照片数据,可用image(f.cdata)观察照片。% 例例 制作红色小球沿一条带封闭路径的下旋螺线运动的实时动画。 (1)程序名为)程序名为anim_zzy1.m,程序如下:,
9、程序如下:(接下一页)(接下一页)t1=(0:1000)/1000*10*pi;x1=cos(t1);y1=sin(t1);z1=-t1;t2=(0:10)/10;x2=x1(end)*(1-t2);y2=y1(end)*(1-t2);z2=z1(end)*ones(size(x2);t3=t2;z3=(1-t3)*z1(end);x3=zeros(size(z3);y3=x3;t4=t2;x4=t4;y4=zeros(size(x4);z4=y4;x=x1 x2 x3 x4;y=y1 y2 y3 y4;z=z1 z2 z3 z4;plot3(x,y,z,Color,1,0.6,0.4,Lin
10、eWidth,2.5)axis off% h=line(xdata,x(1),ydata,y(1),zdata,z(1),Color,1 0 0,Marker, ., MarkerSize,40,EraseMode,xor); % n=length(x);i=2;j=1;while 1 set(h,xdata,x(i),ydata,y(i),zdata,z(i); drawnow; pause(0.0005) i=i+1; if nargin=2 & nargout=1 if(i=ki&j=1);f=getframe(gcf);end end if in i=1;j=j+1; if jK;br
11、eak;end endend (2)f=anim_zzy1(2,450);(3)image(f.cdata),axis off红球沿下旋螺线运动的瞬间照片红球沿下旋螺线运动的瞬间照片既演示实时动画又拍摄照片观察拍摄的照片二、动画制作原理二、动画制作原理 有时动画制作可以只凭借逐帧图像来完成,这些是基于图像的动画制作。 三维动画主要是靠三维模型的变换实现的,这些变换包括平移、旋转、错切、比例变换,其它线性变换、非线性变换等。因时间关系,这些内容在此不做介绍。 动画制作的基本原理是把一些图形或图像快速逐帧播放,在人眼与人脑中产生连续的刺激,形成了动画。(一)基于图像的动画制作(一)基于图像的动画制
12、作图像旋转图像旋转1. 利用图像几何操作制作动画利用图像几何操作制作动画B=imread(D:112.bmp);for i=1:60 imrotate(B,i)end例例 制作图像旋转动画。这个程序把名称为112.bmp的图像旋转60度,出现动画效果。 图像作为一种特殊的图形,有着很强的描述自然的能力。在有些动画制作过程中,要充分的利用图像这个载体。距离变换距离变换例例 使用cityblock距离制作动画。程序运行结果是随着 i 增加,图形边数增加,产生了动画效果。B1=zeros(50,50,50);B1(25,25,25)=1;D2=bwdist(B1, cityblock);for i=
13、1:10 isosurface(D2,i),axis equal,view(3),axis off pause(0.2)end图像块移动图像块移动例例 利用图像块切割函数制作图像块移动动画。动画的效果是图像块在一个窗口中移动。A=imread(D:111.jpg);for i=1:20 A1=imcrop(A,i,i,i+20,i+30); imshow(A1)end例例 图像块逐渐放大制作出的动画效果。程序的运行结果使图像块逐渐扩大,形成动画。A=imread(D:111.jpg);for i=1:70 A1=imcrop(A,80-i,80-i,i+20,i+30); imshow(A1)
14、end图像颜色图像颜色2. 基于图像颜色与亮度的动画制作基于图像颜色与亮度的动画制作I=imread(D:111.jpg);I1=I(:,:,2);s=size(I1);a=ones(s(1),s(2);I2=double(I1);for i=1:50 I2(:,:)= I2(:,:)-a*i; I (:,:,2)= I2(:,:); imshow(I)end例例 逐渐减少RGB图像的绿色成分,完成一个颜色渐变的动画。程序的运行结果是一个颜色渐变的动画。I=imread(D:111.jpg);I1=I(:,:,2);s=size(I1);a=ones(s(1),s(2);I2=double(I
15、1);for i=1:8 I2(:,:)= I2(:,:)-a*i*5; subplot(2,4,i) I (:,:,2)= I2(:,:); imshow(I)end为了把颜色渐变情况展示出来,下面程序绘制出一些中间帧。I=imread(D:face001.jpg);I1=I(:,:,1);s=size(I1);a=ones(s(1),s(2);I2=double(I1);for i=1:50 I2(:,:)= I2(:,:)-a*i; I (:,:,1)= I2(:,:); imshow(I)end例例 逐渐减少一幅彩色(RGB图像)人脸照片的红色成分,完成一个颜色渐变的动画。程序中照片文
16、件D:face001.jpg是以红色为背景的,经过渐变,红色背景逐渐消失。图像亮度图像亮度I=imread(D:face001.jpg);I1=rgb2gray(I);s=size(I1);a=ones(s(1),s(2);I2=double(I1);for i=1:30 I2(:,:)= I2(:,:)-a*i; imshow(I2)end例例 逐渐减少灰度图像的亮度,完成一个亮度渐变的动画。该程序完成了一个亮度渐变动画。为了把亮度渐变情况记录下来,使用下面程序把一些中间帧绘制出来。I=imread(D:flower1.bmp);I1=rgb2gray(I);s=size(I1);a=one
17、s(s(1),s(2);I2=double(I1);for i=8:22 I2(:,:)= I2(:,:)-a*i; subplot(3,5,i-7) imshow(I2)end上述程序的运行结果如下图所示:右图为彩色图像D:flower1.bmp图像膨胀与腐蚀的动画效果图像膨胀与腐蚀的动画效果3. 图像处理与分析用于动画制作图像处理与分析用于动画制作例例 使用膨胀与腐蚀制作动画。程序的运行结果是演示图像逐渐被腐蚀与膨胀的过程。 许多图像处理与分析的方法都可以用于图像动画制作,下面以图像膨胀与腐蚀以及图像的Radon变换为例简单介绍。A=imread(D:flower1.bmp);A1=rgb
18、2gray(A);for i=1:6 se=strel(square,i); A2=imdilate(A1,se); A3=imerode(A1,se); subplot(1,2,1),imshow(A2); subplot(1,2,2),imshow(A3); pause(0.2)end图像变换图像变换例例 使用Radon变换制作动画。程序的演示结果是随着角度的增加,Radon 变换变化的结果。A=imread(D:111.jpg);A1=rgb2gray(A);for i=0:5:60 R,xp =radon(A,i) imagesc(i,xp,R); pause(0.2)end(二)动画
19、的分类制作方法(二)动画的分类制作方法l另外,从图形空间维数可以分为二维动画与三维动画。l从动画的表现上可以分为真实感动画与非真实感动画; 一般从制作动画所用素材、制作方法、制作工具等多个角度对动画进行分类,也可以从观赏者是否干预、场景是否运动等对动画进行分类。l从动画制作所用素材可以分为图形动画与图像动画等;l从动画的制作方法可以分为逐帧动画、形变动画与路径动画;l从制作工具上可以分为语言制作动画与软件制作动画;l从观赏者是否参与可以分为普通动画与虚拟现实动画;逐帧动画逐帧动画1. 逐帧动画、形变动画与路径动画逐帧动画、形变动画与路径动画 可以使用Matlab中的函数moviein()与ge
20、tframe等完成逐帧动画设计,使用函数movie()播放逐帧动画。 逐帧动画、形变动画与路径动画是三种基本的动画制作方式,每个动画制作软件都提供这三种动画制作方法。这里研究如何使用Matlab语言实现这三种动画。一方面,在以后的实际应用中,可以直接使用语言进行动画设计;另一方面,可以探索动画制作软件的开发机理,以便更好的使用动画制作软件。 在前面介绍的动画制作方法中,电影动画制作中有一段程序,程序完成了一个简单的逐帧动画。 该程序段就是使用了moviein()、()、getframe与movie()()这几个函数,完成了一个从多面体转化成球体的动画。其实,这几个函数是通用的逐帧动画制作函数,
21、利用这几个函数,可以制作出各种各样的逐帧动画。M=moviein(16);for j=1:16 sphere(j); axis equal M(:,j)=getframe; endmovie(M,10)for i=1:15 k=int2str(i); k1=strcat(D:picture,k,.jpg); a1=imread(k1); image(a1); m(:,i)=getframe;endmovie(m,2)例例 修改前述的动画制作程序,完成编号图像动画制作。一共15张墙纸图片,存储在D:picture文件夹下。 从上例可以看到,只要把图像编号,就可以制作出逐帧动画,也就是可以完成序列
22、图像播放。目前,有些动画作品就是先手工绘制,然后扫入计算机,进行动画编辑与制作。制作的方法与上例类似。 软件制作逐帧动画与语言制作逐帧动画本质上是相同的。软件Flash与3D MAX等都提供了逐帧动画制作功能,其方法也是把每一帧图像或图形存入播放数组,然后进行逐帧播放。形变动画形变动画 动画制作软件都提供了形变动画制作功能。首先给定一个物体的初始形状,然后给定终止形状,中间过程的各个帧使用插值计算来实现。 插值计算的关键是找好初始与终结两个时刻的对应顶点(关键点),然后计算中间各帧的顶点(关键点),最后,使用类似 surf 的函数绘制每一帧。 一般的形变动画都是靠计算给出中间帧,这虽然增加了计
23、算时间,但是不需要存储大量的中间图像(图形),节省了存储空间。例例 作动画演示peaks图形逐渐趋近于平面的过程。p=peaks(11);h=axes(Position,0,0,1,1,visible,off)for i=1:10 p1=p/i;surf(p1) set(h,Zlim,0 10) axis off; pause(0.3)end程序运行时,随着i的增加,曲面的高度逐渐缩小,形成了动画效果。为了更好的观察,设置固定了坐标系的Z轴范围为0 10。例例 作动画演示一个图形逐渐演化成peaks图形的过程。p=peaks(16);s=sphere(15);for i=30:-2:1 p1=
24、s+p/i;surf(p1);axis off;pause(0.1); end程序中,先使用peaks函数产生图形数据,再使用sphere函数产生数据,然后对这些数据进行组合,实现从一个图形到peaks图形的转变。下图是一些中间帧。注:注:sphere函数产生数据后,使用surf函数对这些数据进行绘制不能产生球体。而是类似于上图中的第一个图形。X1,Y1,Z1= peaks(16);X2,Y2,Z2=sphere(15);for i=1:5:100 Z3=Z1/i+Z2; surf(X2,Y2,Z3) axis square off pause(0.1)end 如果演示从 sphere 曲面变
25、成一个球体,可以使用下面程序。路径动画路径动画 路径动画制作方法也是动画制作软件常用的一个方法。首先为动画设定一个路径,路径可以是规则的几何曲线,也可以是手工绘制的曲线;然后先把物体放到始点位置,再放到终点位置,确认后,让物体沿曲线运动。 三维物体路径动画制作过程中,需要处理好消隐问题。根据使用的具体语言或软件来处理消隐问题,Matlab语言函数可以自动实现消隐,三维软件也都可以自动处理消隐问题;但是象C 语言、VB等就没有提供这方面的功能。使用Matlab可以很容易地实现路径动画。例例 作一个球体沿一段正弦曲线运动。x=0:0.1:1;y=sin(x);h=axes(Position,0,0
26、,0.1,0.1)for i=1:10 set(h,Position,x(i),y(i),0.1,0.1) sphere(15); axis off pause(0.1) end 因为程序中的正弦曲线是自变量取 01 之间的一段,所以,看上去像是沿直线运动。程序关键是每次重新设置绘图坐标轴的起始位置。例例 作一个球体沿正弦曲线运动一个周期。修改前一页中的程序如下: 该程序能够实现一个球体沿正弦曲线运动一个周期。如下图所示。x=0:0.1:2*pi;y=sin(x);h=axes(Position,0,0,0.1,0.1)for i=1:62 set(h,Position,x(i)/(2*pi)
27、,y(i)/(2*pi)+0.5,0.1,0.1) sphere(15);axis off;pause(0.1); end图中的曲线是使用语句后加入的。例例 作一个球体沿随机曲线运动。下例演示的是一个球体沿随机曲线运动的动画。y=rand(1,30);axis offh1=axes(Position,0,0,1,1)plot(y)axis offh=axes(Position,0,0,0.1,0.1)for i=1:30 set(h,Position,i/30,y(i),0.1,0.1) sphere(15);axis square off pause(0.1)end上述程序的运行结果如下图所
28、示。一个球体沿着随机曲线运动例例 作一个球体沿空间中一条曲线运动。 从上面几个例子可以看出,只要给出路线,就可以沿着路线绘制物体,形成路径动画。X1,Y1,Z1=sphere(15);x=1:0.1:pi;y=sin(x)*10;z=cos(x)*10;for i=1:31 X2=X1+x(i)*10;Y2=Y1+y(i)*10; Z2=Z1+z(i);surf(X2,Y2,Z2) axis square off pause(0.1)end 上面例题是一个三维物体绕一个平面曲线运动,下面例子实现了一个球体沿着一条空间曲线运动。程序使用了球体的三维数据,每次把球体的三维数据增加一定的数值,再重新
29、绘制,形成了沿曲线运动的效果。2. 使用语言与软件制作动画使用语言与软件制作动画使用语言制作动画使用语言制作动画 从使用工具上分,可以把动画制作分为使用语言制作与使用软件制作两类。下面再举一例体会一下语言制作动画的方法。 X,Y,Z=peaks(50);surfl(X,Y,Z) axis(-3 3 -3 3 -10 10)axis vis3d offshading interpcolormap(copper)for i=1:15 view(-37.5+15*(i-1),30) m(i)=getframe;endclsmovie(m)surfl(X,Y,Z) 是绘制曲面时使用灯光效果。axis
30、vis3d off 把坐标轴设置为三维状态,并且不显示坐标轴,cls是擦除图形窗口内容。注:注:Matlab语言与其它语言不同,Matlab提供了更多的动画制作函数,例如view、getframe、movie等。使用软件制作动画使用软件制作动画 目前,常用的二维动画制作软件有Flash、Animator Studio、COOL 3D、Firework等;常用的三维动画制作软件有3DS Max、Softimage 3D、Maya、Lightwave3D等。 动画制作软件提供了可视化工具与集成模块,使动画制作更加方便,不过,使用语言制作动画,能够更加细腻逼真。另外,不同的语言或软件都有自己的特点,
31、根据具体要求,选择动画制作工具。 其实,使用语言制作动画与使用软件制作动画本质上是相同的,另外,为了更好地完成动画制作,有时软件与语言结合在一起使用。 Flash 软件与3D Max软件都有脚本语言,来完成更加复杂的设计任务。3. 动画播放与导出动画播放与导出 使用语言制作动画,还涉及到一个问题,就是界面制作问题。例如,使用Matlab语言制作动画,为了美观与操作方便,最好把动画程序放到GUI程序中,完成可视界面的制作。 为了增加动画的表现效果,有时需要给动画加入声音。Matlab中也提供了加入声音的功能。例如,函数sound就是其中的一个。 动画制作完成后,一般要脱离开原先的运行环境,这就需要把动画导出。多数软件与语言都提供了这种包装功能。 例如,Flash软件与3D MAX软件的文件菜单选项都有类似的导出功能,TC语言的文件选项中有制作.exe文件的功能,VB与VC等也有类似的功能。