我想实现如this nice example所示的飞越效果。首先,我使用hm
函数从矩阵surf
创建了一个图形,该矩阵是300X300矩阵:
surf(hm);
然后,我根据变量x
,y
和z
定义了一条动画线,并在图形上显示如下:
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
但是相机没有按照我的预期移动。我在做什么错了?
答案 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。