如何在MATLAB中创建相机飞越效果?

时间:2018-07-16 10:57:14

标签: matlab animation camera matlab-figure

enter image description here我想实现如this nice example所示的飞越效果。首先,我使用hm函数从矩阵surf创建了一个图形,该矩阵是300X300矩阵:

surf(hm); 

然后,我根据变量xyz定义了一条动画线,并在图形上显示如下:

curve = animatedline;
curve.LineWidth = 6;
curve.Color = [ 1 0 1];
for i = 1:length(x)
  addpoints(curve, x(i), y(i), z(i));
  drawnow;
end

然后,我想实现飞越效果,以便相机沿线移动。我尝试了从上面的示例中获取的这段代码,并对它进行了一些修改:

for i = 1:length(x)
  campos([(x(i) -5), (y(i)-5), 0]);
  camtarget([x(i), y(i), z(i)]);
  drawnow;
end

但是相机没有按照我的预期移动。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

如果要模仿链接示例的行为,则需要使摄像机目标摄像机位置都沿着(x, y, z)定义的曲线移动。在上面的编写方式中,摄影机目标沿着曲线移动,但是摄影机位置始终在(-5, -5)平面中和xy上偏离目标z = 0。如果要让摄像机跟随目标后面的曲线,则应尝试以下操作:

for iPoint = 6:numel(x)
  campos([x(iPoint-5) y(iPoint-5) z(iPoint-5)]);  % Note the index is shifted, not the value
  camtarget([x(iPoint) y(iPoint) z(iPoint)]);
  drawnow;
end

如果您不希望摄像机沿着相同的曲线移动,而是希望它始终与移动的摄像机目标保持固定的偏移量,则可以尝试以下操作:

offset = [-5 -5 0];  % X, Y, and Z offset from target
for iPoint = 1:numel(x)
  campos([x(iPoint)+offset(1) y(iPoint)+offset(2) z(iPoint)+offset(3)]);
  camtarget([x(iPoint) y(iPoint) z(iPoint)]);
  drawnow;
end

最后,如果您想控制动画的速度,可以将drawnow命令替换为对pause的调用。请注意,a call to pause is equivalent to a call to drawnow会强制更新图形对象。您还可以使用timer object为图形制作动画,如图所示in this answer