Автомобиль в горах

Этот пример иллюстрирует использование интерфейса 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

Для доступа к узлу 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;

Сохраните объект виртуального мира в рабочей области MATLAB ®

После завершения работы с объектом VRWORLD необходимо закрыть и удалить его. Это достигается с помощью команд CLOSE и DELETE.

close (мир); исключить (мир);

Однако здесь мы этого делать не будем. Вместо этого оставим мир открытым, чтобы можно было играть с ним дальше. Можно попробовать переместить машину с помощью команд, аналогичных приведенным выше, или можно попытаться получить доступ к другим узлам и их полям. Мы очистим только используемые глобальные переменные.

clear ans car i x1 x2 x3 y1 y2 y3 z1 z2 z3