exponenta event banner

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

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

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

близко (мир); исключить (мир);

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

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