В этом примере показано использование интерфейса Simulink ® 3D Animation™ MATLAB ®. В пошаговом учебном пособии показаны команды для запроса объектов виртуального мира и управления ими. Вы узнаете о структурах виртуального мира, а затем будете ориентироваться в виртуальном автомобиле по пути через горы.
В этом примере показано, как управлять объектом в виртуальном мире с помощью объектно-ориентированного интерфейса MATLAB.
Мы начинаем с создания объекта класса VRWORLD, который представляет виртуальный мир. Файл VRML, составляющий мир, был ранее сделан, используя 3D Мирового Редактора, содержавшегося в Simulink 3D продукт Анимации. Имя файла - VRMOUNT.x3d.
world = vrworld('vrmount.x3d');
Мир должен быть открыт, прежде чем его можно будет использовать. Для этого используется команда ОТКРЫТЬ.
open(world);
Виртуальный мир можно просмотреть в средстве просмотра VRML. Simulink 3D Animation предлагает два способа просмотра виртуальных миров - внутренний просмотр (метод по умолчанию) и внешний просмотр (интегрированный с веб-браузером). Мы будем просматривать виртуальный мир во внутреннем средстве просмотра с помощью функции VIEW. Это может занять некоторое время, прежде чем зритель откроется, так что, пожалуйста, будьте терпеливы.
fig = view(world, '-internal');
vrdrawnow;

Проверить свойства виртуального мира можно с помощью команды GET. Обратите внимание, что свойства FileName и Description содержат имя файла и описание, взятые из свойства title файла VRML. Подробное описание всех свойств выходит за рамки данного примера, но его легко найти в документации Simulink 3D Animation.
get(world)
Canvases = vr.canvas object: 0-by-0 Clients = 1 ClientUpdates = 'on' Comment = '' Description = 'VR Car in the Mountains' Figures = vrfigure object: 1-by-1 FileName = char array: 1-by-77 Nodes = vrnode object: 13-by-1 Open = 'on' Record3D = 'off' Record3DFileName = '%f_anim_%n.%e' Recording = 'off' RecordMode = 'manual' RecordInterval = [0 0] RemoteView = 'off' Time = 0 TimeSource = 'external' View = 'on' Viewpoints = vrnode object: 2-by-1
Все элементы в виртуальном мире представлены узлами VRML. Поведением любого элемента можно управлять путем изменения полей соответствующих узлов. Команда NODES выводит на печать список узлов, доступных в мире.
nodes(world)
View1 (Viewpoint) [VR Car in the Mountains] Camera_car (Transform) [VR Car in the Mountains] VPfollow (Viewpoint) [VR Car in the Mountains] Automobile (Transform) [VR Car in the Mountains] Wheel (Shape) [VR Car in the Mountains] Tree1 (Group) [VR Car in the Mountains] Wood (Group) [VR Car in the Mountains] Canal (Shape) [VR Car in the Mountains] ElevApp (Appearance) [VR Car in the Mountains] River (Shape) [VR Car in the Mountains] Bridge (Shape) [VR Car in the Mountains] Road (Shape) [VR Car in the Mountains] Tunnel (Transform) [VR Car in the Mountains]
Для доступа к узлу VRML необходимо создать соответствующий объект VRNODE. Узел идентифицируется по его названию и миру, которому он принадлежит.
Мы создадим объект VRNODE, связанный с узлом VRML 'Automobile', который представляет модель автомобиля на дороге. Если ты не видишь этого на сцене, не волнуйся. Он спрятан в тоннеле слева.
car = vrnode(world, 'Automobile')
car = vrnode object: 1-by-1 Automobile (Transform) [VR Car in the Mountains]
Поля VRML данного узла можно запросить с помощью команды FIELDS. Вы увидите, что в списке узлов есть поля с именами «translation» и «rotation». Можно переместить автомобиль, изменив значения этих полей.
fields(car)
Field Access Type Sync ----------------------------------------------------------- removeChildren eventIn MFNode off addChildren eventIn MFNode off metadata exposedField SFNode off children exposedField MFNode off center exposedField SFVec3f off rotation exposedField SFRotation off scale exposedField SFVec3f off scaleOrientation exposedField SFRotation off translation exposedField SFVec3f off bboxSize field SFVec3f off bboxCenter field SFVec3f off
Теперь мы готовим векторы координат, которые определяют движение автомобиля. Установив их в цикл, мы создадим анимированную сцену. Существует три набора данных для трех фаз движения автомобиля.
z1 = 0:12; x1 = 3 + zeros(size(z1)); y1 = 0.25 + zeros(size(z1)); z2 = 12:26; x2 = 3:1.4285:23; y2 = 0.25 + zeros(size(z2)); x3 = 23:43; z3 = 26 + zeros(size(x3)); y3 = 0.25 + zeros(size(z3));
Теперь двигаем машину по первой части ее траектории. Автомобиль перемещается путем установки поля «translation» узла «Automobile».
for i=1:length(x1) car.translation = [x1(i) y1(i) z1(i)]; vrdrawnow; pause(0.1); end
Мы немного повернем машину, чтобы добраться до второй части дороги. Это делается путем установки свойства «rotation» узла «Automobile».
car.rotation = [0, 1, 0, -0.7]; vrdrawnow;
Теперь пройдем второй участок дороги.
for i=1:length(x2) car.translation = [x2(i) y2(i) z2(i)]; vrdrawnow; pause(0.1); end
Наконец, мы снова поворачиваем машину влево...
car.rotation = [0, 1, 0, 0]; vrdrawnow;
... и пусть движется через третью часть дороги.
for i=1:length(x3) car.translation = [x3(i) y3(i) z3(i)]; vrdrawnow; pause(0.1); end
Если требуется восстановить исходное состояние сцены, определенное в файле VRML, просто перезагрузите мир.
reload(world); vrdrawnow;

После завершения работы с объектом VRWORLD его необходимо закрыть и удалить. Для этого используются команды ЗАКРЫТЬ (CLOSE) и УДАЛИТЬ (DELETE).
близко (мир); исключить (мир);
Однако здесь мы этого делать не будем. Вместо этого оставим мир открытым, чтобы можно было играть с ним дальше. Вы можете попробовать переместить автомобиль, используя команды, подобные приведенным выше, или вы можете попытаться получить доступ к другим узлам и их полям. Мы очистим только используемые глобальные переменные.
clear ans car i x1 x2 x3 y1 y2 y3 z1 z2 z3