




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五讲Matlab参考文献:基于Matlab的计算机图形与动画技术于万波编著清华大学出版社,2007一、动画制作方法(一)时间函数可以使用Timer函数创建计时器对象,如:Matlab提供了许多与动画制作相关的函数,能够比较容易完成动画的制作。1.Timer函数mytimer=timer('TimerFcn','fPatch','StartDelay',6);start(mytimer)关键词当前目录中的程序名称,其程序见下一页。程序运行后,6秒钟后才执行程序fPatch.m。用start()函数激活计数器对象,6秒钟后才执行程序fPatch.m。该计时器对象执行如下操作:一个计时器中可以同时对多个M文件进行不同的定时操作。如:
当使用start函数启动计时器时执行'file2';Mtimer=timer('TimerFcn','file1','StartFcn','file2','StopFcn',
'file3','ErrorFcn',
'file4')出错时执行'file4'。当使用stop函数终止计时器时执行'file3';将'file1'作为基本计时器代码执行;使用clock函数可以返回当前时间。2.当前日期与时间>>clock
ans=1.0e+0032.00600.00900.01900.0200.03100.0384当前机器时间是2006年9月19日20点31分38.4秒。使用now函数将返回当天的日期值。这个时间的单位是天,转换成普通日期是2008年8月21日19点30分53秒左右(误差小于1分钟)。>>formatlong;now
ans=7.336418131145024e+005使用datestr()函数可以将now函数返回的日期值转换成日期字符串。使用date函数可以返回dd-mmm-yy格式的当天日期。>>date
ans=21-Aug-2008使用datenum()函数可以将日期字符串变成日期值>>datenum(2008,8,21)
ans=733641>>datestr(7.336418131145024e+005)ans=21-Aug-200819:30:53
计算运行时间的函数还有tic函数与toc
函数,前者启动一个秒表,表示计时开始;后者则停止这个秒表,并且计算运行时间。>>tic;plot(rand(50,5));toc
Elapsedtimeis0.147644seconds.pause()函数是延迟等待函数,例如,程序中如果出现pause(5),那么在执行到这句话的时候,停留5秒,然后继续。4.pause函数fori=-2*pi:0.5:2*piR=[cos(i)sin(i)0;-sin(i)cos(i)0;001];vert=[111;121;221;211;112;122;222;212];vert=vert*R;fac=[1234;2673;4378;1584;1265;5678];pause(0.1)patch('faces',fac,'vertices',vert,'FaceVertexCData',hsv(8),'FaceColor','interp');view(3)end例使用pause函数制作动画。程序是先绘制一个长方体,然后隔0.1秒又绘制出另外一个长方体,新长方体的顶点坐标经过了变换,此变换是乘以矩阵R完成的,该矩阵是绕Z轴旋转矩阵。如此下去,绘制出下一页所示的图形,从而完成了此动画。如果没有pause(0.1),那么就直接绘制出上图,没有了动画效果。如果把R=[cos(i)sin(i)0;-sin(i)cos(i)0;001];变换成R=[cos(i)0sin(i);010;-sin(i)0cos(i)];那么就是绕Y轴旋转。2.函数camorbit()与camroll()surf(peaks)axisofffori=1:36camorbit(10,0,'data',[010])pause(0.2)end函数camorbit(d1,d2)根据d1与d2的大小(单位是度)绕相机目标点旋转相机,d1表示水平旋转角度,d2表示垂直旋转角度。函数camroll操纵相机绕视轴旋转camroll(d)按照d指定的大小绕相机视轴旋转相机,视轴由经过相机位置和相机目标点的直线确定。camroll(h,d)操作由第一个句柄参数h确定的坐标系。3.函数campan()surf(peaks)axisvis3dfori=1:720campan(2,0)pause(0.01)end函数campan(dt,dp)按照dt
和dp
的大小绕相机旋转目标点,dt
是水平旋转角度,dp
是垂直旋转角度。函数campan还可以添加一个或两个参数campan(dt,dp,'s1','s2')该程序绕相机位置水平旋转了720×2=1440度,即4圈,转完后又回到原先位置,一共停留时间720×0.01=7.2秒。参数s1用来确定旋转中心,参数s2用来确定旋转轴。该函数还可以在第一个参数位置上加入坐标系句柄,决定操作哪一个坐标系,默认是操作当前坐标系。4.函数campos()surf(peaks)axisvis3doffforx=-200:10:200campos([x,0,0])drawnowendcampos该程序使相机沿x轴方向运动。axisvis3doff是取消了三维视觉功能,取消三维视觉功能后不论是campos([x,0,0])
,还是campos([0,y,0])
,或是campos([x,y,z])效果都是垂直屏幕表面运动,可以更清晰的观察运动的情况。该函数设置或查询相机的位置,其调用格式如下:返回相机在当前坐标系中的位置campos([x,y,z])将相机位置设置为当前坐标系中(x,y,z)处5.函数camtarget()surf(peaks)fori=1:100camtarget([i,0,0])pause(0.01)endcamtarget该程序使相机目标点(物体)沿x轴移动。该函数设置或查询相机目标点的位置,调用格式为:返回相机目标点在当前坐标系中的位置camtarget([x,y,z])将相机目标点位置设置为当前坐标系中(x,y,z)处改为camtarget([0,i,0])沿y轴移动改为camtarget([0,0,i])沿z轴移动6.函数camva()与camzoom()uicontrol('Style','pushbutton','String','In',...'Position',[20206020],'Callback','ifcamva<=1;return;else;camva(camva-1);end');uicontrol('Style','pushbutton','String','Out',...'Position',[100206020],'Callback','ifcamva>=179;return;else;camva(camva+1);end');camva函数camva()的调用格式是:返回当前坐标系设置的相机视角camva(a)将当前坐标系的相机视角设置为a,单位是度camzoom(f)函数camzoom()的调用格式是:根据f的值对场景进行缩放。下面程序制作了两个按钮用来控制视角的改变。返回相机视角设置相机新的视角7.函数view()view(az,el)和view([az,el])该函数指定视点方向,其调用格式为:设置三维图的视角。方位角az为从y轴的负轴开始绕z轴水平旋转的角度。正值表示视点逆时针旋转。el为仰角。az与el的单位为度。view(2)设置为默认二维视图,az=0,el=90view(3)设置为默认三维视图,az=-37.5,el=30视角函数上述程序运行后结果如下图所示,4个图形分别是不同视角下显示的同一个曲面。1.程序动画从计算机图形学上看,动画就是绘制的图形发生变化。这个变化不能太快,也不能太慢,要被人的视觉接受。在程序执行时,能够使图形变化达到视觉要求。例
程序动画制作。下面程序就完成了一个动画。[X,Y]=meshgrid(-10:1:10);Z=X.^2/36-Y.^2/25;h=mesh(Z)fori=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,56]决定了旋转轴方向;i表示旋转角度,单位是度。程序运行后,观看到的效果是一个面片在飞舞。为了更好的观察面片的变化情况,改动上面程序为:fori=1:6subplot(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)axistightoffpause(0.1)end2.绘制图形制作电影动画Matlab提供了动画制作函数movie,使用movie函数生成动画就称为电影动画。生成动画必须有很多帧图形连续播放,如果这些图形是绘制而成的,就叫这种动画为绘制图形的电影动画。程序中使用了moviein函数创建一个结构体数组,专门用来装载动画的各帧;使用getframe函数(命令)把绘制出的图形装入结构体。其中,绘制每一帧图形之前,先使用了FFT变换函数。程序最后一句是播放函数,以每秒5幅的速度播放画面。M=moviein(16);forj=1:16plot(fft(eye(j+16)));axisequalM(:,j)=getframe;pause(0.1)endmovie(M,5)例
播放一个不断变化的眼球程序段。
getframe函数getframe函数可将当前图形窗口作为一个画面取下并保存,格式为:m=getframe。它将每一帧画面信息数据截取下来整理成列向量。该函数截取图形的点阵信息,图形窗口的大小,对数据向量的大小影响较大,窗口越大,所需存储容量越大。而图形的复杂性对数据容量要求没有直接的关系。
moviein函数函数m=moviein(n)用来建立一个足够大的n列的矩阵m,用来保存n幅画面的数据,以备播放。movie(m,k)以每秒k幅图形的速度播放由矩阵m的列向量所组成的画面。
movie函数fori=1:3k=int2str(i);k1=strcat('d:\',k,'.jpg');a1=imread(k1);image(a1);m(:,i)=getframeendmovie(m,10)下面程序使用getframe函数装载上述几幅图像,使用movie函数播放这几幅图像就是一个动画。4.几个例题例下述程序播放一个直径不断变化的球体。n=30[x,y,z]=spherem=moviein(n);forj=1:nsurf(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);axisoffn=12;mmm=moviein(n); fori=1:nrotate(h,[001],25);mmm(:,i)=getframe;endmovie(mmm,5,10)functionf=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,程序如下:(接下一页)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=[x1x2x3x4];y=[y1y2y3y4];z=[z1z2z3z4];plot3(x,y,z,'Color',[1,0.6,0.4],'LineWidth',2.5) axisoff%h=line('xdata',x(1),'ydata',y(1),'zdata',z(1),'Color',[100],'Marker','.','MarkerSize',40,'EraseMode','xor'); >%n=length(x);i=2;j=1;while1 set(h,'xdata',x(i),'ydata',y(i),'zdata',z(i)); drawnow; pause(0.0005) i=i+1;ifnargin==2&nargout==1 if(i==ki&j==1);f=getframe(gcf);end endifi>ni=1;j=j+1;ifj>K;break;endendend(2)f=anim_zzy1(2,450);(3)image(f.cdata),axisoff红球沿下旋螺线运动的瞬间照片既演示实时动画又拍摄照片观察拍摄的照片二、动画制作原理有时动画制作可以只凭借逐帧图像来完成,这些是基于图像的动画制作。三维动画主要是靠三维模型的变换实现的,这些变换包括平移、旋转、错切、比例变换,其它线性变换、非线性变换等。因时间关系,这些内容在此不做介绍。动画制作的基本原理是把一些图形或图像快速逐帧播放,在人眼与人脑中产生连续的刺激,形成了动画。(一)基于图像的动画制作图像旋转1.利用图像几何操作制作动画B=imread('D:\112.bmp');fori=1:60imrotate(B,i)end例制作图像旋转动画。这个程序把名称为112.bmp的图像旋转60度,出现动画效果。图像作为一种特殊的图形,有着很强的描述自然的能力。在有些动画制作过程中,要充分的利用图像这个载体。距离变换例使用cityblock距离制作动画。程序运行结果是随着i增加,图形边数增加,产生了动画效果。B1=zeros(50,50,50);B1(25,25,25)=1;D2=bwdist(B1,'cityblock');fori=1:10isosurface(D2,i),axisequal,view(3),axisoffpause(0.2)end图像块移动例利用图像块切割函数制作图像块移动动画。动画的效果是图像块在一个窗口中移动。A=imread('D:\111.jpg');fori=1:20A1=imcrop(A,[i,i,i+20,i+30]);imshow(A1)end例图像块逐渐放大制作出的动画效果。程序的运行结果使图像块逐渐扩大,形成动画。A=imread('D:\111.jpg');fori=1:70A1=imcrop(A,[80-i,80-i,i+20,i+30]);imshow(A1)end图像颜色2.基于图像颜色与亮度的动画制作I=imread('D:\111.jpg');I1=I(:,:,2);s=size(I1);a=ones(s(1),s(2));I2=double(I1);fori=1:50I2(:,:)=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(I1);fori=1:8I2(:,:)=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);fori=1:50I2(:,:)=I2(:,:)-a*i;I(:,:,1)=I2(:,:);imshow(I)end例逐渐减少一幅彩色(RGB图像)人脸照片的红色成分,完成一个颜色渐变的动画。程序中照片文件D:\face001.jpg是以红色为背景的,经过渐变,红色背景逐渐消失。图像亮度I=imread('D:\face001.jpg');I1=rgb2gray(I);s=size(I1);a=ones(s(1),s(2));I2=double(I1);fori=1:30I2(:,:)=I2(:,:)-a*i;imshow(I2)end例逐渐减少灰度图像的亮度,完成一个亮度渐变的动画。该程序完成了一个亮度渐变动画。为了把亮度渐变情况记录下来,使用下面程序把一些中间帧绘制出来。I=imread('D:\flower1.bmp');I1=rgb2gray(I);s=size(I1);a=ones(s(1),s(2));I2=double(I1);fori=8:22I2(:,:)=I2(:,:)-a*i;subplot(3,5,i-7)imshow(I2)end上述程序的运行结果如下图所示:右图为彩色图像D:\flower1.bmp图像膨胀与腐蚀的动画效果3.图像处理与分析用于动画制作例使用膨胀与腐蚀制作动画。程序的运行结果是演示图像逐渐被腐蚀与膨胀的过程。许多图像处理与分析的方法都可以用于图像动画制作,下面以图像膨胀与腐蚀以及图像的Radon变换为例简单介绍。A=imread('D:\flower1.bmp');A1=rgb2gray(A);fori=1:6se=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);fori=0:5:60
[R,xp]=radon(A,i)
imagesc(i,xp,R);pause(0.2)end(二)动画的分类制作方法另外,从图形空间维数可以分为二维动画与三维动画。从动画的表现上可以分为真实感动画与非真实感动画;一般从制作动画所用素材、制作方法、制作工具等多个角度对动画进行分类,也可以从观赏者是否干预、场景是否运动等对动画进行分类。从动画制作所用素材可以分为图形动画与图像动画等;从动画的制作方法可以分为逐帧动画、形变动画与路径动画;从制作工具上可以分为语言制作动画与软件制作动画;从观赏者是否参与可以分为普通动画与虚拟现实动画;逐帧动画1.逐帧动画、形变动画与路径动画可以使用Matlab中的函数moviein()与getframe等完成逐帧动画设计,使用函数movie()播放逐帧动画。逐帧动画、形变动画与路径动画是三种基本的动画制作方式,每个动画制作软件都提供这三种动画制作方法。这里研究如何使用Matlab语言实现这三种动画。一方面,在以后的实际应用中,可以直接使用语言进行动画设计;另一方面,可以探索动画制作软件的开发机理,以便更好的使用动画制作软件。在前面介绍的动画制作方法中,电影动画制作中有一段程序,程序完成了一个简单的逐帧动画。该程序段就是使用了moviein()、getframe与movie()这几个函数,完成了一个从多面体转化成球体的动画。其实,这几个函数是通用的逐帧动画制作函数,利用这几个函数,可以制作出各种各样的逐帧动画。M=moviein(16);forj=1:16sphere(j);axisequalM(:,j)=getframe;endmovie(M,10)fori=1:15k=int2str(i);k1=strcat('D:\picture\',k,'.jpg');a1=imread(k1);image(a1);
m(:,i)=getframe;endmovie(m,2)例修改前述的动画制作程序,完成编号图像动画制作。一共15张墙纸图片,存储在D:\picture文件夹下。从上例可以看到,只要把图像编号,就可以制作出逐帧动画,也就是可以完成序列图像播放。目前,有些动画作品就是先手工绘制,然后扫入计算机,进行动画编辑与制作。制作的方法与上例类似。软件制作逐帧动画与语言制作逐帧动画本质上是相同的。软件Flash与3DMAX等都提供了逐帧动画制作功能,其方法也是把每一帧图像或图形存入播放数组,然后进行逐帧播放。形变动画动画制作软件都提供了形变动画制作功能。首先给定一个物体的初始形状,然后给定终止形状,中间过程的各个帧使用插值计算来实现。插值计算的关键是找好初始与终结两个时刻的对应顶点(关键点),然后计算中间各帧的顶点(关键点),最后,使用类似surf的函数绘制每一帧。一般的形变动画都是靠计算给出中间帧,这虽然增加了计算时间,但是不需要存储大量的中间图像(图形),节省了存储空间。例作动画演示peaks图形逐渐趋近于平面的过程。p=peaks(11);h=axes('Position',[0,0,1,1],'visible','off')fori=1:10p1=p/i;surf(p1)set(h,'Zlim',[010])axisoff;pause(0.3)end程序运行时,随着i的增加,曲面的高度逐渐缩小,形成了动画效果。为了更好的观察,设置固定了坐标系的Z轴范围为[010]。例作动画演示一个图形逐渐演化成peaks图形的过程。p=peaks(16);s=sphere(15);fori=30:-2:1p1=s+p/i;surf(p1);axisoff;pause(0.1);end程序中,先使用peaks函数产生图形数据,再使用sphere函数产生数据,然后对这些数据进行组合,实现从一个图形到peaks图形的转变。下图是一些中间帧。注:sphere函数产生数据后,使用surf函数对这些数据进行绘制不能产生球体。而是类似于上图中的第一个图形。[X1,Y1,Z1]=peaks(16);[X2,Y2,Z2]=sphere(15);fori=1:5:100Z3=Z1/i+Z2;surf(X2,Y2,Z3)axissquareoffpause(0.1)end如果演示从sphere曲面变成一个球体,可以使用下面程序。路径动画路径动画制作方法也是动画制作软件常用的一个方法。首先为动画设定一个路径,路径可以是规则的几何曲线,也可以是手工绘制的曲线;然后先把物体放到始点位置,再放到终点位置,确认后,让物体沿曲线运动。三维物体路径动画制作过程中,需要处理好消隐问题。根据使用的具体语言或软件来处理消隐问题,Matlab语言函数可以自动实现消隐,三维软件也都可以自动处理消隐问题;但是象C语言、VB等就没有提供这方面的功能。使用Matlab可以很容易地实现路径动画。例作一个球体沿一段正弦曲线运动。x=0:0.1:1;y=sin(x);h=axes('Position',[0,0,0.1,0.1])fori=1:10set(h,'Position',[x(i),y(i),0.1,0.1])sphere(15);axisoffpause(0.1)end因为程序中的正弦曲线是自变量取0~1之间的一段,所以,看上去像是沿直线运动。程序关键是每次重新设置绘图坐标轴的起始位置。例作一个球体沿正弦曲线运动一个周期。修改前一页中的程序如下:该程序能够实现一个球体沿正弦曲线运动一个周期。如下图所示。x=0:0.1:2*pi;y=sin(x);h=axes('Position',[0,0,0.1,0.1])fori=1:62set(h,'Position',[x(i)/(2*pi),y(i)/(2*pi)+0.5,0.1,0.1])sphere(15);axisoff;pause(0.1);end图中的曲线是使用语句后加入的。例作一个球体沿随机曲线运动。下例演示的是一个球体沿随机曲线运动的动画。y=rand(1,30);axisoffh1=axes('Position',[0,0,1,1])plot(y)axisoffh=axes('Position',[0,0,0.1,0.1])fori=1:30set(h,'Position',[i/30,y(i),0.1,0.1])sphere(15);axissquareoffpause(0.1)end上述程序的运行结果如下图所示。一个球体沿着随机曲线运动例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年房屋终止合同协议书模板
- 六年级下册数学教案-数学好玩2《神奇的莫比乌斯带》 |北师大版
- 2024-2025学年六年级下学期数学第二单元圆柱和圆锥的综合复习(教案 )
- 五金厂的劳动合同(2025年版)
- 二年级上册数学教案-3.2 儿童乐园-北师大版
- (高清版)DB45∕T 838-2021 三江侗族自治县侗族百家宴服务规范
- 2025年湖南工艺美术职业学院单招职业技能测试题库一套
- 【单元测试】部编版语文三年级上册第六单元分层训练B卷(提升篇)-(含解析)
- 2024年海洋石油修井机项目投资申请报告代可行性研究报告
- 2024年年物流仓储项目资金需求报告代可行性研究报告
- 借哪吒精神燃开学斗志 开学主题班会课件
- 2025年初中主题班会课件:好习惯成就好人生
- 学校教职工代表大会全套会议会务资料汇编
- 新部编版小学六年级下册语文第二单元测试卷及答案
- 2025年山东传媒职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 《中医基础理论》课件-中医学理论体系的基本特点-整体观念
- 2025年广东省深圳法院招聘书记员招聘144人历年高频重点提升(共500题)附带答案详解
- 2025年人教版新教材数学一年级下册教学计划(含进度表)
- GB/T 45107-2024表土剥离及其再利用技术要求
- 2025年春西师版一年级下册数学教学计划
- 课题申报书:“四新”视域下地方高校学科建设与人才培养研究
评论
0/150
提交评论