使用aero.animation视频

时间:2015-01-05 00:42:51

标签: matlab animation aero

我尝试使用aero.animation在matlab中制作导弹动画的动画。 当我使用以下代码时,它会播放视频,但只保存第一帧。

* data采用[time, x, y, angle]矩阵的形式,其中所有timexyangle均为nx1我事先计算过的向量。在我的案例n = 1312中,我将xy作为列向量的零。 angleSOLUTION的第五列,它是1312x7的矩阵,我之前已计算过。

data = [time, zeros(length(time), 1), zeros(length(time), 1), SOLUTION(:, 5)];
h=Aero.Animation;
f=figure;
h.Figure=f;
h.initialize();
h.FramesPerSecond=10
h.TimeScaling = 5;
idx1=h.createBody('testrocket.ac','ac');
h.bodies{1}.TimeseriesSourceType='Array3DoF';
h.bodies{1}.timeseriesSource=data;

h.Camera.offset=[-150 -150 0];
h.show()

h.VideoRecord = 'on';
h.VideoQuality = 50;
h.VideoCompression = 'Motion JPEG AVI'
h.VideoFilename = 'astMotion_JPEG';
h.play()
h.VideoRecord='off';

代码现在看起来像这样,但视频仍然记录相同的图像几秒钟,用导弹移动录制实际视频。 (当我播放录制视频时,它显示为冻结情况)。

感谢。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,但你必须知道动画的持续时间。

现在您的问题是由h.VideoRecord = 'off';命令后不久运行h.play命令引起的,但h.VideoRecord = 'off';命令没有'等待上一个命令完成。无论如何,你可以使用pause()函数来避免这个问题。

% // ...
h.play()
pause(timeDurationOfAnimation) % // timeDurationOfAnimation -> time unit in seconds
h.VideoRecord = 'off';

编辑:动画/视频的持续时间取决于您指定的FramesPerSecondTimeScaling属性值。

The combination of FramesPerSecond and TimeScaling property determine the time step of the simulation. Your settings result in a time step of approximately 0.5 s.


+++ 更多说明: 我的data为100x4矩阵表示time向量的长度为100.时间分辨率为0.1秒,因此时间向量类似于Time = [0, 0.1, 0.2, 0.3, ..., 9.8, 9.9, 10]'。如果我使用FramesPerSecond = 10TimeScaling = 5设置的时间,我会获得2秒的视频。因为TimeScaling = 5表示每秒显示5个数据包,但是一个数据包包含10个帧,因此根据您的设置动画显示每秒50帧。我的整个data包含100帧,因此100/50 = 2秒,因此动画/视频的持续时间为2秒。请记住TimeScaling是为了加快动画效果,并将动画录制为加速动画。

我的建议是根据FramesPerSecond更新的频率指定Time的值:

% // ...
h.FramesPerSecond = 1 / ( data(2, 1) - data(1, 1) ) % // According to my Time resolution that would be 10;
h.TimeScaling = 1;
% // ...
pause( data(end, 1) )
h.VideoRecord = 'off';