Matlab动画技术
其中a1的值是相机默认位置,a4是程序运行完成后的相 机位置。
5. 函数 函数camtarget() () 该函数设置或查询相机目标点的位置,调用格式为: camtarget camtarget ([x,y,z]) 返回相机目标点在当前坐标系中的位置 将相机目标点位置设置为当前坐标系中 (x,y,z)处
使用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
函数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])效果都是 垂直屏幕表面运动,可 以更清晰的观察运动的 情况。
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
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 秒。
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
例 使用函数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);
计算运行时间的函数还有 tic 函数与 toc 函数,前者启 动一个秒表,表示计时开始;后者则停止这个秒表,并 且计算运行时间。
>>tic;plot(rand(50,5));toc Elapsed time is 0.147644 seconds.
4. pause函数 函数 pause()函数是延迟等待函数,例如,程序中如果 出现pause(5),那么在执行到这句话的时候,停留5秒, 然后继续。 例 使用pause函数制作动画。
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。
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确定的坐标系。
程序是先绘制一个长方体,然后隔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轴旋 转。
下面程序制作了两个按钮用来控制视角的改变。
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');