Matlab动画技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

下面程序制作了两个按钮用来控制视角的改变。
uicontrol('Style','pushbutton','String','In',... 'Position',[20 20 60 20],'Callback','if camva<=1;return;else;camva(camva-1);end'); uicontrol('Style','pushbutton','String','Out',... 'Position',[100 20 60 20],'Callback','if camva>=179;return;else;camva(camva+1);end');
3. 计时函数 函数cputime计算自当前Matlab程序启动之后到运行结 束所占用的CPU时间(单位是秒)。 >>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秒。之所以比前面语句 的计算时间少,是由于该程序已从硬盘装入等原因
3. 函数 函数campan() () 函数campan(dt,dp) 按照 dt 和 dp 的大小绕相机旋转目标 点,dt 是水平旋转角度,dp 是垂直旋转角度。 surf(peaks) axis vis3d for i=1:720 campan(2,0) pause(0.01) end 该程序绕相机位置水平旋转 了720×2=1440度,即4圈, 转完后又回到原先位置,一 共停留时间720×0.01=7.2 秒。
2. 函数 函数camorbit()与camroll() ()与 () () 函数camorbit(d1,d2) 根据d1与d2的大小(单位是度)绕 相机目标点旋转相机,d1表示水平旋转角度,d2表示垂 直旋转角度。 surf(peaks) axis off for i=1:36 camorbit(10,0,'data',[0 1 0]) pause(0.2) end 函数camroll操纵相机绕视轴旋转 a) camroll(d)按照d指定的大小绕相机视轴旋转相机, 视轴由经过相机位置和相机目标点的直线确定。 b) camroll(h,d)操作由第一个句柄参数h确定的坐标系。
程序:fpatch.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) patch('faces',fac,'vertices',vert,'FaceVertexCData',hsv(8),'FaceColor','interp'); view(3);
使用datestr()函数可以将now函数返回的日期值 转换成日期字符串。
>>datestr(7.336418131145024e+005) ans= 21-Aug-2008 19:30:53
使用date函数可以返回dd-mmm-yy格式的当天日期。 >>date ans= 21-Aug-2008 使用datenum()函数可以将日期字符串变成日期值 >>datenum(2008,8,21) ans= 733641
surf(peaks) axis vis3d off for x=-200:10:200 campos([x,0,0]) drawnow end
为了验证campos函数不带参数时的功能,设计如下程序: a1= campos surf(peaks) a2= campos axis vis3d off a3= campos for x=-200:10:200 campos([x,0,0]) drawnow end a4= campos 该程序中设置了4个campos, 返回了相机的4个位置,分别 是: a1 = 0.5000 0.5000 9.1603 a2 = -203.2855 -327.0090 86.6025 a3 = -194.1541 -317.7286 83.9027 a4 = 200 0 0
例 使用函数view()从不同角度观察图形。
[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(y>0.1 & y<3.2); j=find(x>-3.6 & x<3.5); Z(i,j)=nan; subplot(2,2,1);surf(X,Y,Z); xlabel('x'), ylabel('y'), zlabel('z'); subplot(2,2,2);surf(X,Y,Z); xlabel('x'), ylabel('y'), zlabel('z');view(-30,60); subplot(2,2,3);surf(X,Y,Z); xlabel('x'), ylabel('y'), zlabel('z'); view(2); subplot(2,2,4);surf(X,Y,Z); xlabel('x'), ylabel('y'), zlabel('z'); view(30, -60);
函数campan还可以添加一个或两个参数 campan(dt,dp,'s1','s2') 参数s1用来确定旋转中心, 参数s2用来确定旋转轴。
该函数还可以在第一个参数位置上加入坐标系句柄,决 定操作哪一个坐标系,默认是操作当前坐标系。
4. 函数 函数campos() () 该函数设置或查询相机的位置,其调用格式如下: campos campos([x,y,z]) 返回相机在当前坐标系中的位置 将相机位置设置为当前坐标系中(x,y,z)处 该程序使相机沿x轴方向 运动。 axis vis3d off是取 消了三维视觉功能,取 消三维视觉功能后不论 是campos([x,0,0]) ,还是 campos([0,y,0]) ,或是 campos([x,y,z])效果都是 垂直屏幕表面运动,可 以更清晰的观察运动的 情况。
(二)相机与视点
相机与视点的概念与动画制作密切相关。 1. 函数 函数camdolly() () surf(peaks) for i=0:0.05:0.5 camdolly(i,0,0) pause(0.2) end camdolly(0,i,0) camdolly(0,i,0,'fixtarget') 只移动相机,物体不移动 用来移动相机位置和目标位置 表示左右移动 i 个单位, i 为正则向左,为负则向 右。camdolly函数的第3 个参数表示沿视轴移动。 上下移动 i 个单位
其中a1的值是相机默认位置,a4是程序运行完成后的相 机位置。
5. 函数 函数camtarget() () 该函数设置或查询相机目标点的位置,调用格式为: camtarget camtarget ([x,y,z]) 返回相机目标点在当前坐标系中的位置 将相机目标点位置设置为当前坐标系中 (x,y,z)处
surf(peaks) for i=1:100 camtarget([i,0,0]) pause(0.01) end 改为camtarget([0,i,0]) 改为camtarget([0,0,i])
该程序使相机目标点 (物体)沿x轴移动。
沿y轴移动 沿z轴移动
6. 函数 函数camva()与camzoom() ()与 () () 函数camva()的调用格式是: camva camva(a) 返回当前坐标系设置的相机视角 将当前坐标系的相机视角设置为a,单位是度
2. 当前日期与时间 使用clock函数可以返回当前时间。 >>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函数将返回当天的日期值。 >>format long;now ans = 7.336418131145024e+005 这个时间的单位是天,转换成普通日期是2008年8月21日 19点30分53秒左右(误差小于1分钟)。
参考文献:
基于Matlab的计算机图形与动画技术
于万波
编著
清华大学出版社,2007
一、动画制作方法
Matlab提供了许多与动画制作相关的函数,能够比较 容易完成动画的制作。
(一)时间函数
1. Timer 函数 可以使用Timer函数创建计时器对象,如: 当前目录中的程序名称,其程序见下一页。 mytimer=timer('TimerFcn','fPatch','StartDelay',6); start(mytimer) 关键词 程序运行后,6秒钟后才执行程序fPatch.m。 用start()函数激活计数器对象,6秒钟后才执行程序 fPatch.m。
for i=-2*pi:0.5:2*pi R=[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;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
设置相机新的视角 函数camzoom()的调用格式是: camzoom(f)
返回相机视角
根据 f 的值对场景进行缩放。
7. 函数 函数view() ()
视角函数
该函数指定视点方向,其调用格式为: view(az,el) 和 view([az,el]) view(2) view(3) 设置三维图的视角。方位角 az 为从 y 轴 的负轴开始绕 z 轴水平旋转的角度。正 值表示视点逆时针旋转。el 为仰角。az 与 el 的单位为度。 设置为默认二维视图,az=0,el=90 设置为默认三维视图,az=-37.5,el=30
计算运行时间的函数还有 tic 函数与 toc 函数,前者启 动一个秒表,表示计时开始;后者则停止这个秒表,并 且计算运行时间。
>>tic;plot(rand(50,5));toc Elapsed time is 0.147644 seconds.
4. pause函数 函数 pause()函数是延迟等待函数,例如,程序中如果 出现pause(5),那么在执行到这句话的时候,停留5秒, 然后继续。 例 使用pause函数制作动画。
正方体网格图
Biblioteka Baidu
各面着色正方体
插值着色正方体
一个计时器中可以同时对多个M文件进行不同的定时 操作。如: Mtimer=timer('TimerFcn','file1','StartFcn', 'file2','StopFcn', 'file3','ErrorFcn', 'file4')
该计时器对象执行如下操作: • 将'file1'作为基本计时器代码执行; • 当使用start函数启动计时器时执行'file2'; • 当使用stop函数终止计时器时执行'file3'; • 出错时执行'file4'。
程序是先绘制一个长方体,然后隔0.1秒又绘制出另外一 个长方体,新长方体的顶点坐标经过了变换,此变换是 乘以矩阵R完成的,该矩阵是绕Z轴旋转矩阵。如此下去, 绘制出下一页所示的图形,从而完成了此动画。
如果没有pause(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轴旋 转。
相关文档
最新文档