Этот пример иллюстрирует использование интерфейса Simulink ® 3D Animation™ MATLAB ®. В пошаговом руководстве показаны команды для запросов и манипуляций с объектами виртуального мира. Вы узнаете о виртуальных мировых структурах и затем перемещаетесь по виртуальному автомобилю по пути через горы.
В этом примере мы покажем, как управлять объектом в виртуальном мире с помощью объектно-ориентированного интерфейса MATLAB.
Начнем с создания объекта класса VRWORLD, который представляет виртуальный мир. Файл VRML, составляющий мир, ранее был сделан с использованием 3D World Editor, содержащегося в продукте Simulink 3D Animation. Имя файла VRMOUNT.x3d.
world = vrworld('vrmount.x3d');
Мир должен быть открыт, прежде чем его можно будет использовать. Это выполняется с помощью команды OPEN.
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.
close (мир); исключить (мир);
Однако здесь мы этого делать не будем. Вместо этого оставим мир открытым, чтобы можно было играть с ним дальше. Можно попробовать переместить машину с помощью команд, аналогичных приведенным выше, или можно попытаться получить доступ к другим узлам и их полям. Мы очистим только используемые глобальные переменные.
clear ans car i x1 x2 x3 y1 y2 y3 z1 z2 z3