使用Aero.Animation进行视频



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

* data[time, x, y, angle]矩阵的形式,其中所有的timexyangle都是我事先计算nx1向量。就我而言,n = 1312xy作为列向量的零。 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';

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

谢谢。

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

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

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

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

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是由于加速动画,您将动画录制为加速动画。

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

% // ...
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';

相关内容

  • 没有找到相关文章

最新更新