Анимация в MATLAB - PullRequest
       221

Анимация в MATLAB

13 голосов
/ 27 апреля 2010

Как анимировать поверхность, если ее координаты меняются во времени (например, эллипсоид) с помощью MATLAB?

Ответы [ 4 ]

15 голосов
/ 27 апреля 2010

Вот несколько примеров того, как вы можете анимировать графики в MATLAB ...

Изменить график в цикле for:

Вы можете создать цикл, в котором вы измените координаты поверхности, обновите объект графика с помощью команды set и используйте команду pause, чтобы приостановить каждый цикл итерация в течение короткого периода времени. Вот пример:

[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1);  % Make an ellipsoid shape
hMesh = mesh(x, y, z);                    % Plot the shape as a mesh
axis equal                                % Change the axis scaling
for longAxis = 4:-0.1:1
  [x, y, z] = ellipsoid(0, 0, 0, longAxis, 1, 1);  % Make a new ellipsoid
  set(hMesh, 'XData', x, 'YData', y, 'ZData', z);  % Update the mesh data
  pause(0.25);                                     % Pause for 1/4 second
end

Когда вы запустите вышеприведенное, вы должны увидеть, как длинная ось эллипсоида сжимается до тех пор, пока не станет сферой.


Изменить сюжет с помощью таймера:

Вы также можете использовать объект таймера вместо цикла для выполнения обновлений графика. В этом примере я сначала создам функцию timer_fcn, которую я хочу выполнять каждый раз при срабатывании таймера:

function timer_fcn(obj,event,hMesh)
  n = get(obj, 'TasksExecuted');  % The number of times the
                                  %   timer has fired already
  [x, y, z] = ellipsoid(0, 0, 0, 4-(3*n/40), 1, 1);  % Make a new ellipsoid
  set(hMesh, 'XData', x, 'YData', y, 'ZData', z);    % Update the mesh data
  drawnow;                                           % Force the display to update
end

Теперь я могу создать сюжет и таймер и запустить таймер следующим образом:

[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1);  % Make an ellipsoid shape
hMesh = mesh(x, y, z);                    % Plot the shape as a mesh
axis equal                                % Change the axis scaling
animationTimer = timer('ExecutionMode', 'fixedRate', ...  % Fire at a fixed rate
                       'Period', 0.25, ...                %   every 0.25 seconds
                       'TasksToExecute', 40, ...          %   for 40 times and
                       'TimerFcn', {@timer_fcn, hMesh});  %   run this function
start(animationTimer);  % Start timer, which runs on its own until it ends

Будет отображаться та же анимация, что и в примере цикла for. И как только вы закончите с объектом таймера, не забудьте всегда удалять его:

delete(animationTimer);
3 голосов
/ 27 апреля 2010

Вы хотите, чтобы анимация отображалась на экране или сохранялась в виде видеофайла? Если вы хотите, чтобы анимация отображалась на экране, ваша программа может многократно перерисовывать график, на который вы планируете, с некоторой паузой, как это сделал в своем ответе gnovice.

Если вы хотите сохранить файл для воспроизведения, я бы посоветовал посмотреть на функцию movie (учебное пособие здесь ) и, возможно, вспомогательный инструмент mpgwrite из файла MATLAB. обмен.

2 голосов
/ 27 апреля 2010

Если вы хотите простой способ создания анимации, взгляните на ANYMATE из обмена файлами. Просмотрите справку к файлу и примеры, чтобы увидеть, как вы делаете анимацию на рисунке или создаете анимированные GIF-изображения.

Посмотрите обзор anymate в файле обмена недели

EDIT

Вот как вы бы оживили эллипсоид из примера @ gnovice с любым другом

%# create an sphere
[xs,ys,zs] = sphere; %# default is center at 0, radius 1
%# create an ellipsoid
[xe,ye,ze] = ellipsoid(0,0,0,4,1,1);

%# use anymate to interpolate between the two
anymate(@surf,{cat(3,xe,xs) cat(3,ye,ys) cat(3,ze,zs)});
%# color the surface
colormap(jet);
%# fix axes
axis equal

На рисунке изображена панель инструментов «Фильм», где вы можете нажать «Играть» и посмотреть анимацию. Или вы можете сохранить его в файл.

0 голосов
/ 26 февраля 2013

Одно небольшое различие, которое я хотел обрисовать в общих чертах между двумя реализациями, приведенными выше:

1) pause ():

pause () может использоваться для простых анимаций с небольшим объемом данных. Это мой предпочтительный метод, так как он прост и понятен. Но я использую паузу только в том случае, если анимация требует мало данных, поскольку pause () блокирует обработку на указанное количество времени.

2) Таймер: Если я хочу анимировать спектрограммы или спектры и вычислять их в режиме реального времени или синхронизировать со звуком, я обычно использую объект таймера, который в то же время не блокирует обработку. Если я использую pause () с такими анимациями, синхронизация между аудио и анимацией быстро теряется ...

...