2015-01-05 1 views
1

Я пытаюсь использовать aero.animation для анимации движения ракеты в Matlab. Когда я использую следующий код, он воспроизводит видео, но сохраняет только первый кадр.используя aero.animation для видео

* 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'; 

Код выглядит, как это сейчас, пока видео записи еще и то же изображение в течение нескольких секунд InstEd записи фактического видео с ракетным Movment. (когда я воспроизвожу запись, которую он показывает, как замороженная ситуация).

Спасибо.

ответ

0

Я нашел решение, но вы должны знать продолжительность времени вашей анимации.

Теперь ваша проблема вызвана запуском команды h.VideoRecord = 'off'; вскоре после команды h.play, но команда h.VideoRecord = 'off'; не ждет завершения предыдущей команды. В любом случае вы можете использовать функцию pause(), чтобы избежать проблемы.

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

EDIT: Время продолжительности анимации/видео зависит от вас заданных значений 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 = 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'; 
+0

это помогло мне получить видео нескольких секунд, но все же образом он показывает в целом видео является первым кадром. как видеозапись 30 секунд того же кадра. – Ben

+0

@ben - Я улучшил свой ответ, надеюсь, что это будет полезно. Удачи .. – mehmet

+0

Прежде всего спасибо за вашу помощь, я попытался сделать то, что вы сказали, и он воспроизводит видео в Matlab медленнее, чем раньше, и записывается как 5 минут видео. старая проблема все еще существует, что, когда я воспроизвожу видео, записанное в медиаплеере, например, оно показывает мне 5 минут того же изображения. – Ben