Этот пример иллюстрирует использование интерфейса MATLAB® Simulink® 3D Animation™. В пошаговом руководстве это показывает команды для того, чтобы запросить и управлять объектами виртуального мира. Вы узнаете о структурах виртуального мира и затем переместитесь по виртуальному автомобилю вдоль пути через горы.
В этом примере мы покажем вам, как управлять объектом в виртуальном мире с помощью MATLAB объектно-ориентированный интерфейс.
Мы начинаем путем создания объекта класса VRWORLD, который представляет виртуальный мир. Файл VRML, составляющий мир, был ранее сделан с помощью 3D World Editor, содержавшегося в продукте Simulink 3D Animation. Имя файла является VRMOUNT.x3d.
world = vrworld('vrmount.x3d');
Мир должен быть открыт, прежде чем он сможет использоваться. Это выполняется с помощью ОТКРЫТЬ команды.
open(world);
Виртуальный мир может быть просмотрен в инструменте просмотра VRML. Simulink 3D Animation предлагает два способа просмотреть виртуальные миры - внутреннее средство просмотра (метод по умолчанию) и внешнее средство просмотра (интегрированный с вашим веб-браузером). Мы просмотрим виртуальный мир во внутреннем средстве просмотра с помощью функции ПРЕДСТАВЛЕНИЯ. Это может занять время, прежде чем средство просмотра открывается, поэтому быть терпеливым.
fig = view(world, '-internal');
vrdrawnow;
Можно исследовать свойства виртуального мира с помощью команды GET. Обратите внимание на то, что свойства 'FileName' и 'Description' содержат имя файла и описание, взятое из свойства 'заголовка' файла 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(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 'Автомобиль', который представляет модель автомобиля на дороге. Если вы не видите его в сцене, не волноваться. Это скрыто в туннеле слева.
car = vrnode(world, 'Automobile')
car = vrnode object: 1-by-1 Automobile (Transform) [VR Car in the Mountains]
Поля VRML данного узла могут быть запрошены с помощью ПОЛЕВОЙ команды. Вы будете видеть, что существуют поля, названные 'переводом' и 'вращением' в списке узлов. Можно переместить автомобиль путем изменения значений этих полей.
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));
Теперь давайте переместим автомобиль вдоль первой части его траектории. Автомобиль перемещен путем установки поля 'перевода' 'Автомобильного' узла.
for i=1:length(x1) car.translation = [x1(i) y1(i) z1(i)]; vrdrawnow; pause(0.1); end
Мы будем вращать автомобиль немного, чтобы добраться до второй части дороги. Это сделано путем установки свойства 'вращения' 'Автомобильного' узла.
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, необходимо закрыть и удалить его. Это выполняется с помощью команд DELETE и ЗАКРЫТИЯ.
близкий (мир); удалите (мир);
Однако мы не сделаем этого здесь. Вместо этого давайте оставим мир открытым так, чтобы можно было вопроизвести с ним далее. Можно попытаться переместить автомобиль вокруг использования команд, похожих на тех выше, или можно попытаться получить доступ к другим узлам и их полям. Мы очистим только используемые глобальные переменные.
clear ans car i x1 x2 x3 y1 y2 y3 z1 z2 z3