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