В этом примере показано использование интерфейса Simulink ® 3D Animation™ MATLAB ® для создания 2D автономных файлов анимации.
Механизм записи автономной анимации управляется путем установки соответствующих свойств объекта vrworld и vrfigure. Рекомендуется записывать анимации с помощью графического интерфейса программы просмотра Simulink 3D Animation. Также возможно непосредственное управление записью.
В этом примере мы используем данные распределения тепла, используемые в примере VRHEAT, для создания анимационного файла, который может быть легко распределен и независимо просмотрен другими. Для такого вида визуализации, где статическая геометрия, представленная VRML IndexedFaceSet, окрашена на основе моделирования какого-то физического явления, она подходит для создания файлов анимации 2D - AVI.
Существует несколько способов записи анимации. В этом случае мы используем запланированную запись. Когда запланированная запись активна, временной кадр записывается в анимационный файл с каждой настройкой свойства виртуального мира Time. Запись завершается при установке времени сцены в конце или за пределами заданного интервала записи.
При использовании интерфейса Simulink 3D Animation MATLAB пользователь должен установить время сцены равным требуемому времени, обычно с точки зрения моделируемого явления равноудаленным. Это самое важное отличие по сравнению с записью анимаций для виртуальных миров, связанных с моделями Simulink ®, где время сцены соответствует непосредственно времени Simulink.
Обратите внимание, что время сцены может представлять любую независимую величину, вдоль которой требуется анимировать вычисленное решение.
load('vrheat.mat');
Геометрия L-образного блока хранится в структуре «блока». В целях визуализации блок подразделяется на треугольные грани. Координаты вершин фасета поверхности сохраняются в поле 'lblock.mesh.p', а треугольные ребра описываются индексами в массиве вершин.
vert = lblock.mesh.p';
Набор фасетов в VRML определяется как единственный вектор вершинных индексов, где фасеты разделены на -1, поэтому необходимо соответствующим образом преобразовать вершинный массив. Индексы в VRML основаны на нуле, поэтому 1 вычитается из всех значений индекса, первоначально сохраненных в массиве индексов на основе 1 «lblock.mesh.e».
facets = lblock.mesh.e(1:3,:)-1; facets(4,:) = -1; f = facets; f = f(:); facets = facets';
Теперь мы подготовим карту цветов, которая представляет различные уровни температуры. Для этих целей разработана встроенная «реактивная» карта цвета MATLAB.
cmap = jet(192);
Поле 'lblock.sol.u' содержит матрицу, описывающую температуры вершин по мере прохождения времени. У нас есть 41 предварительно рассчитанная фаза (1 является начальной) для 262 вершин. Нам нужно масштабировать значения температуры, чтобы они отображались в карте цветов.
u = lblock.sol.u; ucolor = (u-repmat(min(u),size(u,1),1)) .* (size(cmap,1)-1); urange = max(u) - min(u); urange(urange == 0) = 1; ucolor = round(ucolor./repmat(urange,size(u,1),1));
Мы рассчитаем первый анимационный кадр, так что нам есть с чего начать.
uslice=ucolor(:,1); colind=zeros(size(facets)); colind(:,1:3)=uslice(facets(:,1:3)+1); colind(:,4)=-1; ci = colind'; ci = ci(:);
Данные готовы, чтобы мы могли загрузить мир.
world = vrworld('vrheat.x3d');
open(world);
Теперь подготовим Г-образный блок. Загруженный нами мир VRML содержит базовую кубическую форму, которую мы можем изменить, установив поля «point» и «coordIndex», которые представляют координаты вершин и индексы массива вершин. Мы также зададим цвета, установив поля color и colorIndex.
Сначала мы задаем цвета, индексы цветов, вершины, а затем индексы вершин. Порядок не является обязательным, но, как правило, лучше, потому что таким образом мы уверены, что нет временного состояния, где у нас больше вершин, чем цветов, или больше индексов, чем значений, что может привести к тому, что некоторые вершины будут иметь неопределенный цвет или некоторые индексы, ссылающиеся на несуществующие (еще) значения.
world.IFS_Colormap.color = cmap; world.IFS.colorIndex = ci; world.IFS_Coords.point = vert; world.IFS.coordIndex = f;
Текстовые комментарии также могут быть настроены на что-то разумное.
world.TEXT.string = {'Time = 0'};
Открыть средство просмотра виртуальной реальности
fig = vrfigure(world);

У нас есть дескрипторы виртуального мира и внутренних объектов фигуры зрителя, сохраненных в переменных «мир» и «рис». Теперь мы задаем виртуальный мир и свойства фигур, связанные с записью. Мы хотим активировать запись запланированных 2D в файл vrheat_anim.avi в течение интервала времени сцены (0,4), который соответствует заранее вычисленному времени распределения тепла.
set(world, 'RecordInterval', [0 4]); set(fig, 'Record2DFileName', 'vrheat_anim.avi'); set(fig, 'Record2D', 'on'); set(fig, 'Record2DCompressQuality', 100); set(fig, 'NavPanel', 'none'); vrdrawnow; % Setting the 'RecordMode' property protected by try-catch as this triggers % recording mechanism that is not allowed in the Demonstration version. try set(world, 'RecordMode', 'scheduled'); set_OK = true; catch ME set_OK = false; disp('Setting the ''RecordMode'' property failed.'); disp('Most probable reason is that you are running in the Simulink 3D Animation Demonstration version'); disp('that doesn''t allow animation recording. The animation file will NOT be created.'); end

Теперь мы можем начать анимацию, и вы можете смотреть ее в зрителе. Составьте как окно команд MATLAB, так и фигуру программы просмотра Simulink 3D Animation так, чтобы они были полностью видимыми, и настройте размер фигуры в соответствии с требуемым разрешением результирующего файла анимации 2D. 2D анимация записывается точно так, как вы видите на рисунке зрителя, используя объект VIDEOWRITER.
Когда запланированная запись активна, в анимационный файл записывается временной кадр, задающий свойство «Time» виртуального мира. Пользователь должен установить время сцены на желаемое время, обычно с точки зрения моделируемого явления равноудаленным. Обратите внимание, что время сцены может представлять любую независимую величину, вдоль которой требуется анимировать вычисленное решение.
for i = 1:size(u,2) pause(0.01); uslice = ucolor(:,i); colind = zeros(size(facets)); colind(:,1:3) = uslice(facets(:,1:3)+1); colind(:,4) = -1; ci=colind'; ci=ci(:); world.IFS.colorIndex = ci; world.TEXT.string = {sprintf('Time = %g', lblock.sol.tlist(i))}; set(world,'Time', lblock.sol.tlist(i)); vrdrawnow; end

По мере остановки анимации vrheat_anim.avi файлов создается в рабочей папке. Теперь мы можем закрыть и удалить виртуальный мир.
Теперь 2D офлайновый файл анимации был создан в Вашем рабочем справочнике. Если в системе имеется проигрыватель AVI, его можно использовать для воспроизведения файла анимации.
if set_OK disp('The file vrheat_anim.avi is created in your working directory.'); disp('You can play this file using an AVI player.'); end
The file vrheat_anim.avi is created in your working directory. You can play this file using an AVI player.
После завершения работы с объектом VRWORLD его необходимо закрыть и удалить. Для этого используются команды ЗАКРЫТЬ (CLOSE) и УДАЛИТЬ (DELETE).
близко (мир); исключить (мир);
Однако здесь мы этого делать не будем. Вместо этого мы оставляем мир открытым, чтобы вы могли играть с ним дальше. Мы очистим только используемые глобальные переменные.
clear ans ci cm cmap colind f facets i lblock nh set_OK; clear u ucolor urange uslice v vert;