我尝试使用aero.animation在matlab中制作导弹动画的动画。 当我使用以下代码时,它会播放视频,但只保存第一帧。
* data
采用[time, x, y, angle]
矩阵的形式,其中所有time
,x
,y
和angle
均为nx1
我事先计算过的向量。在我的案例n = 1312
中,我将x
和y
作为列向量的零。 angle
是SOLUTION
的第五列,它是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';
代码现在看起来像这样,但视频仍然记录相同的图像几秒钟,用导弹移动录制实际视频。 (当我播放录制视频时,它显示为冻结情况)。
感谢。
答案 0 :(得分:0)
我找到了一个解决方案,但你必须知道动画的持续时间。
现在您的问题是由h.VideoRecord = 'off';
命令后不久运行h.play
命令引起的,但h.VideoRecord = 'off';
命令没有'等待上一个命令完成。无论如何,你可以使用pause()
函数来避免这个问题。
% // ...
h.play()
pause(timeDurationOfAnimation) % // timeDurationOfAnimation -> time unit in seconds
h.VideoRecord = 'off';
编辑:动画/视频的持续时间取决于您指定的FramesPerSecond
和TimeScaling
属性值。
+++ 更多说明:
我的data
为100x4矩阵表示time
向量的长度为100.时间分辨率为0.1秒,因此时间向量类似于Time = [0, 0.1, 0.2, 0.3, ..., 9.8, 9.9, 10]'
。如果我使用FramesPerSecond = 10
和TimeScaling = 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';