如果使用 MATLAB 的坐标随时间变化(例如椭圆体),我如何为表面设置动画?
4 回答
以下是一些可以在 MATLAB 中为绘图设置动画的方法示例...
在 for 循环中修改绘图:
您可以创建一个循环,在其中更改表面坐标,使用命令更新绘图对象set
,并使用该pause
命令暂停每个循环迭代一小段时间。这是一个例子:
[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1); % Make an ellipsoid shape
hMesh = mesh(x, y, z); % Plot the shape as a mesh
axis equal % Change the axis scaling
for longAxis = 4:-0.1:1
[x, y, z] = ellipsoid(0, 0, 0, longAxis, 1, 1); % Make a new ellipsoid
set(hMesh, 'XData', x, 'YData', y, 'ZData', z); % Update the mesh data
pause(0.25); % Pause for 1/4 second
end
当你运行上面的代码时,你应该看到椭圆体的长轴收缩直到它变成一个球体。
使用计时器修改绘图:
您还可以使用计时器对象而不是循环来执行绘图的更新。在此示例中,我将首先创建一个timer_fcn
我希望在每次计时器触发时执行的函数:
function timer_fcn(obj,event,hMesh)
n = get(obj, 'TasksExecuted'); % The number of times the
% timer has fired already
[x, y, z] = ellipsoid(0, 0, 0, 4-(3*n/40), 1, 1); % Make a new ellipsoid
set(hMesh, 'XData', x, 'YData', y, 'ZData', z); % Update the mesh data
drawnow; % Force the display to update
end
现在我可以创建情节和计时器并按如下方式启动计时器:
[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1); % Make an ellipsoid shape
hMesh = mesh(x, y, z); % Plot the shape as a mesh
axis equal % Change the axis scaling
animationTimer = timer('ExecutionMode', 'fixedRate', ... % Fire at a fixed rate
'Period', 0.25, ... % every 0.25 seconds
'TasksToExecute', 40, ... % for 40 times and
'TimerFcn', {@timer_fcn, hMesh}); % run this function
start(animationTimer); % Start timer, which runs on its own until it ends
这将显示与 for 循环示例相同的动画。完成计时器对象后,请记住始终删除它:
delete(animationTimer);
您想在屏幕上显示动画还是将其保存为视频文件?如果您希望动画显示在屏幕上,您可以让您的程序重复重绘您正在绘制的情节,并在那里暂停,就像 gnovice 在他刚刚弹出的答案中所说的那样。
如果您想保存到文件中进行重播,我建议您查看movie
函数(此处为教程)以及可能来自 MATLAB 文件交换的辅助mpgwrite工具。
如果您想要一种创建动画的简单方法,请查看文件交换中的ANYMATE。查看文件的帮助和示例,了解如何在图形中制作动画或创建动画 gif。
在本周的文件交换精选中查看 anymate 的评论
编辑
这是您如何使用 anymate 为@gnovice的示例中的椭球设置动画
%# create an sphere
[xs,ys,zs] = sphere; %# default is center at 0, radius 1
%# create an ellipsoid
[xe,ye,ze] = ellipsoid(0,0,0,4,1,1);
%# use anymate to interpolate between the two
anymate(@surf,{cat(3,xe,xs) cat(3,ye,ys) cat(3,ze,zs)});
%# color the surface
colormap(jet);
%# fix axes
axis equal
在图中,会有一个“电影”工具栏,您可以在其中点击“播放”并观看动画。或者您可以将其保存到文件中。
我想概述上面给出的 2 个实现之间的一个小区别:
1)暂停():
pause() 可用于数据很少的简单动画。这是我的首选方法,因为它简单明了。但是我只在动画需要很少数据的情况下使用暂停,因为 pause() 会在给定的时间内阻塞处理。
2)计时器:如果我想为频谱图或频谱设置动画并“实时”计算它们或将它们与音频同步,我通常使用计时器对象,它不会同时阻止处理。如果我对此类动画使用 pause(),音频和动画之间的同步会很快丢失......