exponenta event banner

Визуализация теплопередачи с помощью анимации 2D

В этом примере показано использование интерфейса 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');

Изменение формы объекта для VRML

Геометрия 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;

Работа с текстовыми объектами VRML

Текстовые комментарии также могут быть настроены на что-то разумное.

world.TEXT.string = {'Time = 0'};

Открыть средство просмотра виртуальной реальности

fig = vrfigure(world);

Запись 2D офлайновой анимации Используя интерфейс MATLAB®

У нас есть дескрипторы виртуального мира и внутренних объектов фигуры зрителя, сохраненных в переменных «мир» и «рис». Теперь мы задаем виртуальный мир и свойства фигур, связанные с записью. Мы хотим активировать запись запланированных 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

Файл AVI, созданный в рабочей папке

По мере остановки анимации 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.

Сохранение объекта виртуального мира в рабочей области MATLAB

После завершения работы с объектом VRWORLD его необходимо закрыть и удалить. Для этого используются команды ЗАКРЫТЬ (CLOSE) и УДАЛИТЬ (DELETE).

близко (мир); исключить (мир);

Однако здесь мы этого делать не будем. Вместо этого мы оставляем мир открытым, чтобы вы могли играть с ним дальше. Мы очистим только используемые глобальные переменные.

clear ans ci cm cmap colind f facets i lblock nh set_OK;
clear u ucolor urange uslice v vert;