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

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

Чтобы получить доступ к узлу 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;

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

После того, как вы будете сделаны с объектом VRWORLD, необходимо закрыть и удалить его. Это выполняется с помощью команд DELETE и ЗАКРЫТИЯ.

близкий (мир); удалите (мир);

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

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