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

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

Изменение структуры объекта для 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';

Подготовка Палитры

Теперь мы подготовим палитру, которая представляет различные уровни температуры. Встроенная в '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;

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

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

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

Откройте Virtual Reality Viewer

fig = vrfigure(world);

Запись 2D автономную анимацию с помощью интерфейса MATLAB ®

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

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.

Сохраните объект Virtual World в рабочем пространстве MATLAB

После завершения работы с объектом VRWORLD необходимо закрыть и удалить его. Это достигается с помощью команд CLOSE и DELETE.

close (мир); исключить (мир);

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

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