Matlab动画技术.ppt
《Matlab动画技术.ppt》由会员分享,可在线阅读,更多相关《Matlab动画技术.ppt(64页珍藏版)》请在三一办公上搜索。
1、第五讲 Matlab动画技术,参考文献:,基于Matlab的计算机图形与动画技术,于万波 编著,清华大学出版社,2007,一、动画制作方法,(一)时间函数,可以使用Timer函数创建计时器对象,如:,Matlab提供了许多与动画制作相关的函数,能够比较容易完成动画的制作。,1.Timer 函数,mytimer=timer(TimerFcn,fPatch,StartDelay,6);start(mytimer),关键词,当前目录中的程序名称,其程序见下一页。,程序运行后,6秒钟后才执行程序fPatch.m。,用start()函数激活计数器对象,6秒钟后才执行程序fPatch.m。,程序:fpat
2、ch.m功能:使用patch函数绘制正方体网格图与表面图。,vert=1 1 1;1 2 1;2 2 1;2 1 1;1 1 2;1 2 2;2 2 2;2 1 2;fac=1 2 3 4;2 6 7 3;4 3 7 8;1 5 8 4;1 2 6 5;5 6 7 8;subplot(1,3,1)patch(faces,fac,vertices,vert,FaceColor,w);view(3);subplot(1,3,2)patch(faces,fac,vertices,vert,FaceVertexCData,hsv(6),FaceColor,flat);view(3);subplot(1
3、,3,3)patch(faces,fac,vertices,vert,FaceVertexCData,hsv(8),FaceColor,interp);view(3);,正方体网格图,各面着色正方体,插值着色正方体,该计时器对象执行如下操作:,一个计时器中可以同时对多个M文件进行不同的定时操作。如:,当使用start函数启动计时器时执行file2;,Mtimer=timer(TimerFcn,file1,StartFcn,file2,StopFcn,file3,ErrorFcn,file4),出错时执行file4。,当使用stop函数终止计时器时执行file3;,将file1作为基本计时器代码
4、执行;,使用clock函数可以返回当前时间。,2.当前日期与时间,clock ans=1.0e+003 2.0060 0.0090 0.0190 0.020 0.0310 0.0384,当前机器时间是2006年9月19日20点31分38.4秒。,使用now函数将返回当天的日期值。,这个时间的单位是天,转换成普通日期是2008年8月21日19点30分53秒左右(误差小于1分钟)。,format long;now ans=,使用datestr()函数可以将now函数返回的日期值转换成日期字符串。,使用date函数可以返回dd-mmm-yy格式的当天日期。,date ans=21-Aug-2008,
5、使用datenum()函数可以将日期字符串变成日期值,datenum(2008,8,21)ans=733641,ans=21-Aug-2008 19:30:53,函数cputime计算自当前Matlab程序启动之后到运行结束所占用的CPU时间(单位是秒)。,3.计时函数,t0=cputime;fpatch;cputime-t0 ans=0.0156,程序fpatch.m的运行时间是0.0156秒。,函数etime计算两个时间向量的间隔。,t1=clock;fpatch;etime(clock,t1)ans=0.0150,程序fpatch.m的运行时间是0.0150秒。之所以比前面语句的计算时间
6、少,是由于该程序已从硬盘装入等原因,计算运行时间的函数还有 tic 函数与 toc 函数,前者启动一个秒表,表示计时开始;后者则停止这个秒表,并且计算运行时间。,tic;plot(rand(50,5);toc Elapsed time is 0.147644 seconds.,pause()函数是延迟等待函数,例如,程序中如果出现pause(5),那么在执行到这句话的时候,停留5秒,然后继续。,4.pause函数,for i=-2*pi:0.5:2*piR=cos(i)sin(i)0;-sin(i)cos(i)0;0 0 1;vert=1 1 1;1 2 1;2 2 1;2 1 1;1 1 2
7、;1 2 2;2 2 2;2 1 2;vert=vert*R;fac=1 2 3 4;2 6 7 3;4 3 7 8;1 5 8 4;1 2 6 5;5 6 7 8;pause(0.1)patch(faces,fac,vertices,vert,FaceVertexCData,hsv(8),FaceColor,interp);view(3)end,例 使用pause函数制作动画。,程序是先绘制一个长方体,然后隔0.1秒又绘制出另外一个长方体,新长方体的顶点坐标经过了变换,此变换是乘以矩阵R完成的,该矩阵是绕Z轴旋转矩阵。如此下去,绘制出下一页所示的图形,从而完成了此动画。,如果没有pause(
8、0.1),那么就直接绘制出上图,没有了动画效果。,如果把 R=cos(i)sin(i)0;-sin(i)cos(i)0;0 0 1;变换成 R=cos(i)0 sin(i);0 1 0;-sin(i)0 cos(i);那么就是绕Y轴旋转。,(二)相机与视点,相机与视点的概念与动画制作密切相关。,1.函数camdolly(),surf(peaks)for i=0:0.05:0.5 camdolly(i,0,0)pause(0.2)end,表示左右移动 i 个单位,i 为正则向左,为负则向右。camdolly函数的第3个参数表示沿视轴移动。,用来移动相机位置和目标位置,camdolly(0,i,0
9、),上下移动 i 个单位,camdolly(0,i,0,fixtarget),只移动相机,物体不移动,2.函数camorbit()与camroll(),surf(peaks)axis offfor i=1:36 camorbit(10,0,data,0 1 0)pause(0.2)end,函数camorbit(d1,d2)根据d1与d2的大小(单位是度)绕相机目标点旋转相机,d1表示水平旋转角度,d2表示垂直旋转角度。,函数camroll操纵相机绕视轴旋转,camroll(d)按照d指定的大小绕相机视轴旋转相机,视轴由经过相机位置和相机目标点的直线确定。,camroll(h,d)操作由第一个句
10、柄参数h确定的坐标系。,3.函数campan(),surf(peaks)axis vis3dfor i=1:720 campan(2,0)pause(0.01)end,函数campan(dt,dp)按照 dt 和 dp 的大小绕相机旋转目标点,dt 是水平旋转角度,dp 是垂直旋转角度。,函数campan还可以添加一个或两个参数,campan(dt,dp,s1,s2),该程序绕相机位置水平旋转了72021440度,即4圈,转完后又回到原先位置,一共停留时间7200.017.2秒。,参数s1用来确定旋转中心,参数s2用来确定旋转轴。,该函数还可以在第一个参数位置上加入坐标系句柄,决定操作哪一个坐
11、标系,默认是操作当前坐标系。,4.函数campos(),surf(peaks)axis vis3d offfor x=-200:10:200 campos(x,0,0)drawnowend,campos,该程序使相机沿x轴方向运动。axis vis3d off是取消了三维视觉功能,取消三维视觉功能后不论是campos(x,0,0),还是campos(0,y,0),或是campos(x,y,z)效果都是垂直屏幕表面运动,可以更清晰的观察运动的情况。,该函数设置或查询相机的位置,其调用格式如下:,返回相机在当前坐标系中的位置,campos(x,y,z),将相机位置设置为当前坐标系中(x,y,z)处
12、,为了验证campos函数不带参数时的功能,设计如下程序:,a1=campossurf(peaks)a2=camposaxis vis3d offa3=camposfor x=-200:10:200 campos(x,0,0)drawnowenda4=campos,a1=0.5000 0.5000 9.1603a2=-203.2855-327.0090 86.6025a3=-194.1541-317.7286 83.9027a4=200 0 0,该程序中设置了4个campos,返回了相机的4个位置,分别是:,其中a1的值是相机默认位置,a4是程序运行完成后的相机位置。,5.函数camtarge
13、t(),surf(peaks)for i=1:100 camtarget(i,0,0)pause(0.01)end,camtarget,该程序使相机目标点(物体)沿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,20 20 60
14、 20,Callback,if camva=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 轴水平旋
15、转的角度。正值表示视点逆时针旋转。el 为仰角。az 与 el 的单位为度。,view(2),设置为默认二维视图,az=0,el90,view(3),设置为默认三维视图,az=-37.5,el30,视角函数,X,Y=meshgrid(-10:0.5:10);Z=X.2/36-Y.2/25+sin(X+Y)*2;x=X(1,:);y=Y(:,1);i=find(y0.1,例 使用函数view()从不同角度观察图形。,上述程序运行后结果如下图所示,4个图形分别是不同视角下显示的同一个曲面。,1.程序动画,从计算机图形学上看,动画就是绘制的图形发生变化。这个变化不能太快,也不能太慢,要被人的视觉接受
16、。在程序执行时,能够使图形变化达到视觉要求。,例 程序动画制作。下面程序就完成了一个动画。,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,56决定了旋转轴方向;i表示旋转角度,单位是度。,程序运行后,观看到的效果是一个面片在飞舞。为了更好的观察面片的变化情况,改动上面程
17、序为:,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.绘制图形制作电影动画,Matlab提供了动画制作函数movie,使用movie函数生成动画就称为电影动画。生成动画必须有很多帧图形连续
18、播放,如果这些图形是绘制而成的,就叫这种动画为绘制图形的电影动画。,程序中使用了moviein函数创建一个结构体数组,专门用来装载动画的各帧;使用getframe函数(命令)把绘制出的图形装入结构体。其中,绘制每一帧图形之前,先使用了FFT变换函数。程序最后一句是播放函数,以每秒5幅的速度播放画面。,M=moviein(16);for j=1:16 plot(fft(eye(j+16);axis equal M(:,j)=getframe;pause(0.1)endmovie(M,5),例 播放一个不断变化的眼球程序段。,getframe函数,getframe函数可将当前图形窗口作为一个画面取
19、下并保存,格式为:m=getframe。它将每一帧画面信息数据截取下来整理成列向量。该函数截取图形的点阵信息,图形窗口的大小,对数据向量的大小影响较大,窗口越大,所需存储容量越大。而图形的复杂性对数据容量要求没有直接的关系。,moviein函数,函数m=moviein(n)用来建立一个足够大的 n 列的矩阵 m,用来保存 n 幅画面的数据,以备播放。,movie(m,k)以每秒 k 幅图形的速度播放由矩阵 m 的列向量所组成的画面。,movie函数,改动前面的程序如下,能够制作出新的动画。,右边程序可以观察到一个椭圆转化成矩形的过程。,左边程序演示一个球体从多面体演化来的过程。,M=movie
20、in(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.基于图像制作电影动画,动画效果是由于一幅幅图形变化产生的,如果这些图形来自于图像,那么就称该动画为基于图像的动画。,(a)1.jpg(b)2.jpg(c)3.jpg,下列3个图象是用画图工具绘制出来的,分别命名为1.jpg、2.
21、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.几个例题,例 下述程序播放一个直径不断变化的球体。,n=30 x,y,z=spherem=moviein(n);for j=1:n surf(j*x,j*y,j*z)m(:,j)=getframe;endmovie(m,30);,例 三维图
22、形的影片动画。,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)=getframe;endmovie(mmm,5,10),function f=anim_zzy1(K,ki)%anim_zzy1.m 演示红色小球沿一条封闭螺线运动的实时动画%仅演示实时动画的调用格式为 anim_zzy1(K)%既演
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 动画 技术
链接地址:https://www.31ppt.com/p-5438964.html