Анимация в MATLAB

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

Ответы

Ответ 1

Вот несколько примеров способов анимации графиков в 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-loop. И как только вы закончите с объектом таймера, не забудьте всегда его удалять:

delete(animationTimer);

Ответ 2

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

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

Ответ 3

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

Посмотрите обзор любого участника в выбор файла обмена за неделю

ИЗМЕНИТЬ

Здесь вы можете оживить эллипсоид из @gnovice с помощью anymate

%# 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

На рисунке появится панель инструментов "movie", в которой вы можете нажать "играть" и посмотреть анимацию. Или вы можете сохранить его в файл.

Ответ 4

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

1) pause():

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

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