Этот пример иллюстрирует использование Simulink® 3D 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';
Теперь мы подготовим палитру, которая представляет различные уровни температуры. 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, который мы загрузили, содержит основную кубическую форму, которую мы можем изменить во что-либо, что мы хотим путем установки ее 'точки' и 'coordIndex' полей, которые представляют координаты вершины и индексы в массив вершины. Мы также выберем цвета путем выбирания 'цвета' и '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, необходимо закрыть и удалить его. Это выполняется при помощи команд DELETE и ЗАКРЫТИЯ.
близкий (мир); удалите (мир);
Однако мы не сделаем этого здесь. Вместо этого мы оставляем мир открытым так, чтобы можно было вопроизвести с ним далее. Мы очистим только используемые глобальные переменные.
clear ans ci cm cmap colind f facets i lblock nh u ucolor; clear urange uslice v vert;