Пример визуализации взлета и погони самолета с объектом анимации виртуальной реальности

Визуализация взлета самолета через объект анимации виртуальной реальности

В этом примере показано, как визуализировать взлет самолета и преследовать вертолет с объектом анимации виртуальной реальности. В этом примере можно использовать объект Aero.VirtualRealityAnimation, чтобы настроить анимацию виртуальной реальности на основе файла asttkoff.wrl. Сцена моделирует взлет самолета. Пример добавляет машину погони к симуляции и точку зрения погони, сопоставленную с новым транспортным средством.

Создайте объект анимации

Этот код создает образец Aero.VirtualRealityAnimation объект.

h = Aero.VirtualRealityAnimation;

Установите свойства объекта анимации

Этот код устанавливает количество систем координат в секунду и секунды данных анимации в секунду масштабирования. 'FramesPerSecond' управляет частотой отображения систем координат в окне рисунка. 'TimeScaling' - секунды данных анимации в секунду во время масштабирования.

The 'TimeScaling' и 'FramesPerSecond' свойства определяют временной шаг симуляции. Настройки в этом примере приводят к временному шагу приблизительно 0,5. Уравнение является:

(1/FramesPerSecond) * TimeScaling + дополнительные условия для обработки для субсекундной точности.

h.FramesPerSecond = 10;
h.TimeScaling = 5;

Этот код устанавливает файл .wrl, который будет использоваться в анимации виртуальной реальности.

h.VRWorldFilename = [matlabroot,'/toolbox/aero/astdemos/asttkoff.wrl'];

Изменение директории

Методы объекта VirtualRealityAnimation используют временные .wrl файлы, чтобы отслеживать изменения в мире. Это требует, чтобы директория, содержащий исходный файл .wrl, была доступным для записи. Этот код запускает пример из временной директории, чтобы убедиться, что нет проблем с разрешениями директории. Обратите внимание, что для запуска этого примера требуется лицензия для 3D Animation™ Simulink ®.

% Copy file to temporary directory
copyfile(h.VRWorldFilename,[tempdir,'asttkoff.wrl'],'f');
% Set world filename to the copied .wrl file.
h.VRWorldFilename = [tempdir,'asttkoff.wrl'];

Инициализация объекта анимации виртуальной реальности

The initialize метод загружает мир анимации, описанный в 'VRWorldFilename' поле объекта анимации. При анализе мира объекты узлов создаются для существующих узлов с именами DEF. The initialize метод также открывает средство просмотра Simulink 3D Animation.

h.initialize();

Установка дополнительной информации о узле

Этот код устанавливает данные timeseries симуляции. takeoffData.mat содержит записанные моделируемые данные. takeoffData настраивается как 'StructureWithTime', который является одним из форматов данных по умолчанию.

load takeoffData
[~, idxPlane] = find(strcmp('Plane', h.nodeInfo));
h.Nodes{idxPlane}.TimeseriesSource = takeoffData;
h.Nodes{idxPlane}.TimeseriesSourceType = 'StructureWithTime';

Установите функцию координатного преобразования

Объект анимации виртуальной реальности ожидает положения и повороты в координатах аэрокосмического тела. Если входные данные другие, необходимо создать функцию преобразования координат в порядок, чтобы правильно выровнять данные о положении и повороте с окружающими объектами в виртуальном мире. Этот код устанавливает функцию преобразования координат для анимации виртуальной реальности.

В этой конкретной ситуации, если вход координаты преобразования [x1, y1, z1], они должны быть скорректированы следующим образом: [X, Y, Z] = - [y1, x1, z1]. Пользовательскую функцию преобразования можно увидеть здесь: matlabroot/toolbox/aero/astdemos/vranimCustomTransform.m

h.Nodes{idxPlane}.CoordTransformFcn = @vranimCustomTransform;

Добавить Chase Helicopter

Этот код показывает, как добавить вертолет погони к объекту анимации.

Вы можете просмотреть все узлы в настоящее время в объекте анимации виртуальной реальности с помощью nodeInfo способ. При вызове без выходного аргумента этот метод печатает информацию о узле в командном окне. С выходным аргументом метод устанавливает информацию о узле на этот аргумент.

h.nodeInfo;
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1

Этот код перемещает угол камеры рисунка виртуальной реальности, чтобы просмотреть самолет.

set(h.VRFigure,'CameraDirection',[0.45 0 -1]);

Используйте addNode метод для добавления другого узла к объекту. По умолчанию каждый раз, когда вы добавляете или удаляете узел или маршрут, или когда вы вызываете saveas метод, Aerospace Toolbox отображает сообщение о текущем расположении файла .wrl. Чтобы отключить это сообщение, установите 'ShowSaveWarning' свойство в объекте VirtualRealityAnimation.

h.ShowSaveWarning = 0;
h.addNode('Lynx',[matlabroot,'/toolbox/aero/astdemos/chaseHelicopter.wrl']);

Еще один вызов nodeInfo показывает вновь добавленные объекты узел.

h.nodeInfo
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1
9	Lynx
10	Lynx_Inline

Скорректируйте добавленный вертолет, чтобы сидеть на взлетно-посадочной полосе.

[~, idxLynx] = find(strcmp('Lynx',h.nodeInfo));
h.Nodes{idxLynx}.VRNode.translation = [0 1.5 0];

Этот код устанавливает свойства данных для вертолета погони. The 'TimeseriesSourceType' является значением по умолчанию 'Array6DoF'поэтому никаких дополнительных свойств изменений не требуется. Та же функция преобразования координат (vranimCustomTransform) используется для этого узла в качестве предыдущего узла. Предыдущий вызов nodeInfo возвращен индекс узла (2).

load chaseData
h.Nodes{idxLynx}.TimeseriesSource = chaseData;
h.Nodes{idxLynx}.CoordTransformFcn = @vranimCustomTransform;

Создайте новую точку зрения

Этот код использует addViewpoint метод для создания новой точки обзора с именем 'chaseView'. Новая точка обзора появится в раскрывающемся меню точки обзора в окне виртуальной реальности как «View From Helicopter». Еще один вызов nodeInfo показывает вновь добавленные объекты узла. Узел создается как дочерний элемент вертолета погони.

h.addViewpoint(h.Nodes{idxLynx}.VRNode,'children','chaseView','View From Helicopter');

Воспроизведение анимации

The play метод запускает симуляцию для заданных данных timeseries.

h.play();

Воспроизведение анимации с вертолета

Этот код устанавливает ориентацию точки обзора через объект vrnode, сопоставленный с объектом узла для точки зрения. В этом случае он изменит точку зрения, чтобы взглянуть на левую сторону вертолета в самолете.

[~, idxChaseView] = find(strcmp('chaseView',h.nodeInfo));
h.Nodes{idxChaseView}.VRNode.orientation = [0 1 0 convang(200,'deg','rad')];
set(h.VRFigure,'Viewpoint','View From Helicopter');

Добавить ROUTE

Этот код вызывает addRoute метод добавления команды ROUTE для соединения положения плоскости с узлом Camera1. Это позволит, чтобы точка зрения «Ride on the Plane» функционировала должным образом.

h.addRoute('Plane','translation','Camera1','translation');

Сцена с точки зрения вертолета

Этот код воспроизводит анимацию.

h.play();

Добавить другое тело

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

set(h.VRFigure,'Viewpoint','See Whole Trajectory');
h.addNode('Lynx1',[matlabroot,'/toolbox/aero/astdemos/chaseHelicopter.wrl']);
h.nodeInfo
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1
9	Lynx
10	Lynx_Inline
11	chaseView
12	Lynx1
13	Lynx1_Inline

Отрегулируйте вновь добавленный вертолет, чтобы сидеть над взлетно-посадочной полосой.

[~, idxLynx1] = find(strcmp('Lynx1',h.nodeInfo));
h.Nodes{idxLynx1}.VRNode.translation = [0 1.3 0];

Удаление тела

Этот код использует removeNode СПОСОБ ИЗВЛЕЧЕНИЯ ВТОРОГО ВЕРТОЛЕТА. removeNode принимает имя узла или индекс узла (как получено из nodeInfo). Также удаляется связанный встроенный узел.

h.removeNode('Lynx1');
h.nodeInfo
Node Information
1	Camera1
2	Plane
3	_V2
4	Block
5	Terminal
6	_v3
7	Lighthouse
8	_v1
9	Lynx
10	Lynx_Inline
11	chaseView

Вернуться к оригинальному миру

Исходное имя файла хранится в 'VRWorldOldFilename' свойство объекта анимации. Чтобы воспитать оригинальный мир, задайте 'VRWorldFilename' на исходное имя и его повторную инициализацию.

h.VRWorldFilename = h.VRWorldOldFilename{1};
h.initialize();

Закрыть и удалить мир

Чтобы закрыть и delete

h.delete();