Этот пример иллюстрирует использование 3D Simulink ® Animation™ с интерфейсом MATLAB ® для манипулирования сложными объектами.
В этом примере данные матричного типа передаются между MATLAB и миром виртуальной реальности. Используя эту функцию, можно добиться массивных изменений цвета или морфинга. Это полезно для визуализации различных физических процессов.
Мы используем предварительно рассчитанные данные основанных на времени температурных распределений в L-образном металлическом блоке и отправляем эти данные в виртуальный мир. Это формирует анимацию с относительно большими изменениями.
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';
Теперь мы подготовим палитру, которая представляет различные уровни температуры. Встроенная в '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);
Давай запустим средство просмотра. Кубик должен появиться в окне средства просмотра.
fig = view(world, '-internal');
vrdrawnow;
Теперь мы подготовим L-образный блок. Загруженный нами мир VRML содержит базовую кубическую форму, которую мы можем перестроить во все, что хотим, задав его поля 'point' и 'coordIndex', которые представляют координаты и индексы вершин в вершинный массив. Мы также установим цвета путем установки полей 'color' и 'colorIndex'.
Сначала устанавливаем цвета, индексы цветов, вершины, а затем индексы вершин. Порядок не является обязательным, но обычно это лучше, потому что мы можем быть уверены, что нет временного состояния, когда существует больше вершин, чем цветов, или больше индексов, чем значений, что приведет к тому, что некоторые вершины будут иметь неопределенный цвет или некоторые индексы, ссылающиеся на несуществующие (еще) значения.
world.IFS_Colormap.color = cmap; world.IFS.colorIndex = ci; world.IFS_Coords.point = vert; world.IFS.coordIndex = f;
Текстовый комментарий также может быть установлен на что-то разумное.
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
После завершения работы с объектом VRWORLD необходимо закрыть и удалить его. Это достигается с помощью команд CLOSE и DELETE.
close (мир); исключить (мир);
Однако здесь мы этого делать не будем. Вместо этого оставляем мир открытым, чтобы можно было играть с ним дальше. Мы очистим только используемые глобальные переменные.
clear ans ci cm cmap colind f facets i lblock nh u ucolor; clear urange uslice v vert;