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

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

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

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

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

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

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

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

fig = vrfigure(world);

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

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

Файл 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, необходимо закрыть и удалить его. Это выполняется при помощи команд DELETE и ЗАКРЫТИЯ.

близкий (мир); удалите (мир);

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

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