MATLAB入门简单动画制作.ppt

上传人:xt****7 文档编号:16591556 上传时间:2020-10-17 格式:PPT 页数:27 大小:428.50KB
返回 下载 相关 举报
MATLAB入门简单动画制作.ppt_第1页
第1页 / 共27页
MATLAB入门简单动画制作.ppt_第2页
第2页 / 共27页
MATLAB入门简单动画制作.ppt_第3页
第3页 / 共27页
点击查看更多>>
资源描述
MATLAB 程序设计入门篇 动画制作 张智星 清大资工系 补充内容:方炜 台大生机系 MATLAB 程式設計入門篇:動畫製作 6-1 MATLAB 动画简介 6-2 以电影方式产生动画 (a).电影动画之范例一 (b).电影动画之范例 二 (c).电影动画之范例 三 6-3以对象方式产生动画 (a).曲线的动画 (b).曲线的 EraseMode (c).对象动画之范例 MATLAB 程式設計入門篇:動畫製作 6-1 MATLAB 动画简介 MATLAB 产生动画的方式有两种: 电影方式: 以影像的方式预存多个画面,再将这些画面快速的呈现在屏幕上, 就可以得到动画的效果。此种方式类似于电影的原理,可以产生 很缤纷亮丽的动画,但是其缺点为每个画面都必需事先备妥,无 法进行及时成像( Real-time Rendering), 而且每个画面,以至 于整套动画,都必需占用相当大的内存空间。 物件方式: 在 MATLAB 的握把式图形( Handle Graphics, 详见本书第七 章)概念下,所有的曲线或曲面均可被视为一个对象, MATLAB 可以很快的抹去旧曲线,并产生相似但不同的新曲线,此时就可 以看到曲线随时间而变化的效果。使用对象方式(即握把式图形) 所产生的动画,可以呈现实时的变化,也不需要太高的内存需求, 但其缺点是较难产生太复杂的动画。 MATLAB 程式設計入門篇:動畫製作 6-2 以电影方式产生动画 以电影方式来产生动画,可由下列两个步骤 来达成: 使用 getframe 指令来抓取图形做为电影的画面, 每个画面都是以一个行向量的方式,置放于整个 代表电影的矩阵。 使用 movie 指令来播放电影,并可指定播放的重 复次数及每秒播放的画面数目。 MATLAB 程式設計入門篇:動畫製作 电影动画之范例一 在下例中,我们将以不同的角度来显示 peaks 函 数,并将其结果以电影的方式来呈现动画。 范例 6-1: movie01.m clear M % 清除电影资料矩阵 M n = 50; % 抓取 50 个画面 peaks; fprintf(抓取画面中 .n); for i = 1:n view(-37.5+i*360/n, 30); % 改变观测角度 M(i) = getframe; % 抓取画面,并存入电影资料矩阵 M end fprintf(播放电影中 .n); movie(M, 3); % 播放电影三次 MATLAB 程式設計入門篇:動畫製作 电影动画之范例一 最后一个 frame 的画面 MATLAB 程式設計入門篇:動畫製作 电影动画之范例二 将 peaks 函数画在圆盘上,然后再变换此函数的 高度,以动画呈现 范例 6-2: movie02.m clear M % 清除电影资料矩阵 M r=linspace(0, 4, 30); % 圆盘的半径 t=linspace(0, 2*pi, 50); % 圆盘的极坐标角度 rr, tt=meshgrid(r, t); xx=rr.*cos(tt); % 产生圆盘上的 x 坐标 yy=rr.*sin(tt); % 产生圆盘上的 y 坐标 zz=peaks(xx,yy); % 产生 peaks 在极坐标的数据 n = 30; % 抓取 30 个画面 scale = cos(linspace(0, 2*pi, n); fprintf(抓取画面中 .n); for i = 1:n surf(xx, yy, zz*scale(i); % 画图 axis(-inf inf -inf inf -8.5 8.5); % 固定图轴的范围 box on M(i) = getframe; % 抓取画面,并存入电影资料矩阵 M end fprintf(播放电影中 .n); movie(M, 5); % 播放电影 5 次 MATLAB 程式設計入門篇:動畫製作 电影动画之范例二 最后一个 frame 的画面 MATLAB 程式設計入門篇:動畫製作 电影动画之范例三 改变影像的色盘矩阵,让影像出现从正片变到 负片的效果 范例 6-3: movie03.m clear M % 清除电影资料矩阵 M load clown.mat image(X); colormap(map); % 画出小丑脸 n = 30; % 抓取 30 个画面 scale = cos(linspace(0, 2*pi, n); fprintf(抓取画面中 .n); for i = 1:n colormap(i-1)*(1-map)+(n-i)*map)/n); % 改变色盘矩阵 M(i) = getframe; % 抓取画面,并存入电影资料矩阵 M end fprintf(播放电影中 .n); movie(M, -5); % 播放电影 5 次(含正向与逆向播放) MATLAB 程式設計入門篇:動畫製作 电影动画之范例三 在上述范例中,正片(如下张投影片图左)的色 盘矩阵是 map, 而 1-map 则是负片(如下张投 影片图右)的色盘矩阵,因此我们在抓影片时, 让色盘矩阵进行渐进式的变化,因此呈现的电影 就有从正片变到负片的效果。 另外, movie(M, -5) 代表电影将播放 5 次,但由 于第二个参数是负数,所以每次播放会包含一次 正向播放及一次逆向播放。 MATLAB 程式設計入門篇:動畫製作 电影动画之范例三 正片 色盘矩阵是 map 负片 色盘矩阵是 1-map MATLAB 程式設計入門篇:動畫製作 电影动画的其他范例 MATLAB 的 demo 程序中亦包含了数个与电 影方式相关的动画,读者可以在指令窗口输 入下列任一指令: xpmovie vibes xpmovie logospin xpmovie crulspin MATLAB 程式設計入門篇:動畫製作 6-3 以对象方式产生动画 以电影方式产生动画可以说是暴力法,因为此 方法占掉了许多内存空间。另一个技巧性较高的方 法则是以对象方式产生动画,此种方法不需要大量 的内存,而且可以产生实时( Real-time) 或 交互式( Interactive) 的动画。 MATLAB 的所有图形组件(曲线、曲面、图轴等) 都是对象,您可以控制这些对象的各种性质,此种 特性称为握把式图形( Handle Graphics), 可 详见第七章。握把式图形包含的层面很广,但牵涉 到动画部份的基本概念并不复杂,以下我们以曲线 的动画来说明。 MATLAB 程式設計入門篇:動畫製作 曲线的动画 我们可以快速地改变图形对象的性质(如颜 色、坐标等),就可以达到动画的效果 每一条曲线都有下列三种性质: xdata: 此为一向量,代表曲线的 x 坐标值 ydata: 此为一向量,代表曲线的 y 坐标值 EraseMode: 此为一字符串,代表曲线被抹除的 方式,亦即当 xdata 或 ydata 被改变时,对于旧 曲线的处理方式。 MATLAB 程式設計入門篇:動畫製作 曲线的 EraseMode EraseMode 对于动画的呈现相当重要,此字符串可 是下列几种选择: normal: 重画整个画面。 xor: 将旧曲线的点以 xor 的方式还原。 background: 将旧曲线的点改成背景颜色。 none: 保留旧曲线的点,不做任何处理。 在上述四种 EraseMode 中,耗费时间的次序是 normal xor background none xor 和 background 很接近,但是 background 会抹 去其他旧曲线所扫过的其他对象(如图轴、网格线、 另一条曲线等),所以较少用到,所以一般在产生 动画时,最常用到的 EraseMode 就是 xor。 MATLAB 程式設計入門篇:動畫製作 曲线的动画 有了这些概念后,产生曲线的动画就很容易 了!其主要步骤有两点: 产生一条曲线,其 EraseMode 为 xor, background, 或 none。 在 for-loop 之中,改变此曲线的 xdata 或 ydata ( 或两者)。 我们产生一条随 x 而衰减的正弦曲线,并让 k 随时间而便大(即改变正弦波的相角), 使整条曲线产生舞动的效果。 5)s in ( x ekxy MATLAB 程式設計入門篇:動畫製作 对象动画之范例一 我们产生一条衰减的正弦曲线 让 k 随时间而便大(即改变正弦波的相角),使 整条曲线产生舞动的效果。 范例 6-1: movie04.m x = 0:0.1:8*pi; h = plot(x, sin(x).*exp(-x/5), EraseMode, xor); axis(-inf inf -1 1); % 设定图轴的范围 grid on % 画出网格线 for i = 1:5000 y = sin(x+i/50).*exp(-x/5); set(h, ydata, y); % 设定新的 y 坐标 drawnow % 立即作图 end 5)s in ( x ekxy MATLAB 程式設計入門篇:動畫製作 对象动画之范例一 我们产生一条衰减的正弦曲线 让 k 随时间而便大(即改变正弦波的相角),使 整条曲线产生舞动的效果。 范例 6-1: movie04.m x = 0:0.1:8*pi; h = plot(x, sin(x).*exp(-x/5), EraseMode, xor); axis(-inf inf -1 1); % 设定图轴的范围 grid on % 画出网格线 for i = 1:5000 y = sin(x+i/50).*exp(-x/5); set(h, ydata, y); % 设定新的 y 坐标 drawnow % 立即作图 end 5)s in ( x ekxy MATLAB 程式設計入門篇:動畫製作 对象动画之范例一 最后一个 frame 的画面 MATLAB 程式設計入門篇:動畫製作 对象动画之范例一 在上例中,我们使用 set 指令,总共改变曲线的 y 坐标 5000 次,并以 xor 的方式抹掉旧曲线。 drawnow 的作用是使 MATLAB 立刻处理 set 指令, 若无 drawnow, MATLAB 会累积 set 指令,直到 for-loop 结束时再一并处理图形的变化,这时就不 会看到动画的效果。 如果您将上例的 EraseMode 改成 background, 则 会发现曲线会 “ 抹掉 ” 图形中的网格线及代表图轴 的直线。 如果您将上例的 EraseMode 改成 none, 则旧的曲 线会被保留下来,产生不同的效果。 MATLAB 程式設計入門篇:動畫製作 对象动画之范例 : MATLAB MATLAB 有很多对象动画之范例: lorenz: 以 3D动画呈现的 Lorenz 混沌方程式( Chaotic Equation), 好像慧星在运行。 truss: 一座桥梁在地震时的震动方式,共有 12 种喔! travel: 显示如何以杂乱搜寻( Random Search) 的方式 来解 Traveling Salesperson Problem. fitdemo: 显示如何以 Downhill Simplex Search 来解决非 线性曲线拟合( Nonlinear Curve Fitting) 的问题。 spinner: 常见的屏幕保护程序。 xphide: 试试您的眼力 。 MATLAB 程式設計入門篇:動畫製作 对象动画之范例 : Simulink 若您有安装 Simulink, 可试试下列动态系统 仿真加上动画呈现: onecart: 传统的弹簧加上砝码的动态系统。 dblcart1: 一条弹簧加上两个砝码的动态系统。 simppend: 简单的单摆系统。 dblpend1: 两截的摆动系统。 dblpend2: 更复杂的摆动系统。 penddemo: 倒单摆系统。 MATLAB 程式設計入門篇:動畫製作 对象动画之范例 : 模糊工具箱 如果您有安装 Fuzzy Logic Toolbox, 可以试试由张 老师开发的各项模拟及动画展示: fcmdemo: Fuzzy C-means Clustering。 juggler: 用板子接皮球。 invkine: 两截机器手臂的 Inverse Kinematics。 slcp1: 倒单摆,杆子长度随时间而变,您可以控制所欲 到达的位置。 slcpp1: 双倒单摆,其中一个杆子的长度随时间而变,您 可以控制所欲到达的位置。 slbb: 跷跷板加上滚球系统,您可以控制球的最后位置。 sltbu: 倒车入库系统 MATLAB 程式設計入門篇:動畫製作 以对象方式产生动画 , 呈现一个小圆 ( 半径为 1) 在一个 大圆 ( 半径为 3) 的圆周外部滚动的动画 。 function mymovie02 close all theta = 0:0.1:2*pi; r1 = 3; x1 = r1*cos(theta); y1 = r1*sin(theta); plot(x1, y1), axis image % 大圆 r2 = 1; center = (r1+r2)*1, 0; x2 = r2*cos(theta); y2 = r2*sin(theta); h = line(center(1)+x2, center(2)+y2, EraseMode, xor, color, r); % 小圆 axis(-5 5 -5 5); % 设定图轴的范围 n = 5; % 转 5圈 theta1 = 0:0.005:n*2*pi; for i = 1:length(theta1); center = (r1+r2)*cos(theta1(i), sin(theta1(i); set(h, xdata, center(1)+x2, ydata, center(2)+y2); % 设定小圆的 x, y 坐标 drawnow % 立即作图 end MATLAB 程式設計入門篇:動畫製作 function mymovie02_2 close all theta = 0:0.1:2*pi; r1 = 3; circle1 = r1*exp(sqrt(-1)*theta); % 大圆 plot(circle1), axis image r2 = 1; circle2 = r2*exp(sqrt(-1)*theta); % 小圆 center = r1+r2; h = line(real(center+circle2), imag(center+circle2), EraseMode, xor, color, r); axis(-5 5 -5 5); % 设定图轴的范围 n = 5; % 转 5圈 theta1 = 0:0.005:n*2*pi; for i = 1:length(theta1); center = (r1+r2)*exp(sqrt(-1)*(theta1(i); set(h, xdata, real(center+circle2), ydata, imag(center+circle2); % 设定小圆的 x, y 坐标 drawnow % 立即作图 end MATLAB 程式設計入門篇:動畫製作 以对象方式产生动画 , 呈现一个圆圈 ( 半径为 1) 由画面 左边滚到右边 , 圆周上的任一点所拉出的一条摆线 。 function cycloid01 % 摆线的动画 , x = 0:0.01:5*pi; theta = linspace(0, 2*pi); r = 1; circle = j+r*exp(sqrt(-1)*theta); subplot(2,1,1); circleH=plot(circle); axis image set(circleH, erase, xor); axis(min(x)-r, max(x)+r, -0.5, 2*r+0.5); dot1H=line(0, 0, marker, o, color, k, erase, xor); dot2H=line(0, 0, marker, ., color, r, erase, none); for i=1:length(x) set(circleH, xdata, x(i)+real(circle); angle=-pi/2-x(i); set(dot1H, xdata, x(i)+cos(angle), ydata, r+sin(angle); set(dot2H, xdata, x(i)+cos(angle), ydata, r+sin(angle); % line(xdata, x(i)+cos(angle), ydata, r+sin(angle), color, r, marker, .); drawnow end MATLAB 程式設計入門篇:動畫製作 以对象的方式产生动画,呈现下列方程式: y = cos2(x+k)*exp(-x/5) 让 k 随时间而变大,来显示此方程式的动画。 function mymovie06 x = 0:0.1:8*pi; k = 0; h = plot(x, cos(x+k).*cos(x+k).*exp(-x/5), EraseMode, xor); axis(-inf inf -1 1); % 设定图轴的范围 grid on % 画出网格线 for k = 1:0.01:50 y = cos(x+k).*cos(x+k).*exp(-x/5); set(h, ydata, y); % 设定新的 y 坐标 drawnow % 立即作图 end
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!