exponenta event banner

Визуализация теплопередачи

В этом примере показано использование 3D Simulink ® Animation™ с интерфейсом MATLAB ® для управления сложными объектами.

В этом примере данные матричного типа передаются между MATLAB и миром виртуальной реальности. С помощью этой функции можно добиться массивных изменений цвета или морфинга. Это полезно для визуализации различных физических процессов.

Мы используем предварительно рассчитанные данные о временных распределениях температуры в L-образном металлическом блоке и отправляем эти данные в виртуальный мир. Это создает анимацию с относительно большими изменениями.

Загрузка предварительно рассчитанных данных

load('vrheat.mat');

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

Геометрия L-образного блока хранится в структуре «блока». В целях визуализации блок подразделяется на треугольные грани. Координаты вершин фасета поверхности сохраняются в поле 'lblock.mesh.p', а треугольные ребра описываются индексами в массиве вершин.

vert = lblock.mesh.p';

Набор фасетов в VRML определяется как единственный вектор вершинных индексов, где фасеты разделены на -1, поэтому необходимо соответствующим образом преобразовать вершинный массив. Индексы в VRML основаны на нуле, поэтому 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);

Давайте начнем с зрителя. В окне просмотра должен появиться куб.

fig = view(world, '-internal');
vrdrawnow;

Теперь подготовим Г-образный блок. Загруженный мир 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'};
vrdrawnow;

Анимация сцены

Теперь мы можем начать анимацию. Смотрите его в зрителе. Можно перемещаться по объекту или пытаться задать другие режимы визуализации. Например, каркасный режим, который показывает, как подразделяется L-блок.

for i = 1:size(u,2)
    pause(0.2);
    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))};
    vrdrawnow;
end

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

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

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

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

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