Этот пример иллюстрирует использование Simulink ® 3D Animation™ интерфейса MATLAB ® для создания 2D автономных файлов анимации.
Автономным механизмом записи анимации управляет установка соответствующих свойств vrworld и vrfigure объекта. Рекомендуемый способ записи анимации - это использование графического интерфейса пользователя Simulink 3D Animation viewer. Также возможно непосредственное управление записью.
В этом примере мы используем данные распределения тепла, используемые в примере VRHEAT, чтобы создать файл анимации, который может быть легко распространен и независимо просмотрен другими. Для такого рода визуализации, где статическая геометрия, представленная VRML IndexedFaceSet, окрашена на основе симуляции некоторого физического явления, пригодно создание 2D - AVI файлов анимации.
Для записи анимации можно использовать несколько методов. В этом случае мы используем запланированную запись. Когда запланированная запись активна, в файл анимации записывается временная система координат с каждым установлением свойства виртуального мира Time. Запись завершается, когда вы устанавливаете время сцены в конце или вне заданного интервала записи.
При использовании интерфейса MATLAB Simulink 3D Animation пользователь должен установить время сцены в желаемое время, обычно с точки зрения равноудаленного моделируемого явления. Это самое важное различие по сравнению с записью анимаций для виртуальных миров, которые связаны с моделями Simulink ®, где время сцены соответствует непосредственно времени Simulink.
Обратите внимание, что время сцены может представлять любую независимую величину, вдоль которой вы хотите анимировать вычисляемое решение.
load('vrheat.mat');
Геометрия L-образного блока сохранена в структуре 'lblock'. В целях визуализации блок подразделяется на треугольные грани. Координаты вершины поверхностной грани хранятся в поле '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';
Теперь мы подготовим палитру, которая представляет различные уровни температуры. Встроенная в 'jet' палитра 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);
Теперь мы подготовим L-образный блок. Загруженный мир 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'};
Откройте Virtual Reality Viewer
fig = vrfigure(world);
У нас есть указатели на виртуальный мир и внутренние объекты рисунка средства просмотра, сохраненные в переменных 'world' и 'fig'. Теперь мы задаем виртуальный мир и свойства рисунка, связанные с записью. Мы хотим активировать запланированную запись 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 viewer так, чтобы они оба были полностью видны, и скорректируйте размер фигуры под необходимое разрешение получившегося файла 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.
close (мир); исключить (мир);
Однако здесь мы этого делать не будем. Вместо этого оставляем мир открытым, чтобы можно было играть с ним дальше. Мы очистим только используемые глобальные переменные.
clear ans ci cm cmap colind f facets i lblock nh set_OK; clear u ucolor urange uslice v vert;