Визуализируйте Взлет Самолета через Объект Animation Виртуальной реальности

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

Создайте объект Animation

Этот код создает экземпляр Aero.VirtualRealityAnimation объект.

h = Aero.VirtualRealityAnimation;

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

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

'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 файл, была перезаписываема. Этот код запускает пример из временной директории, чтобы гарантировать, что нет никаких проблем с полномочиями директории. Отметьте, лицензия на Simulink® 3D Animation™ требуется запустить этот пример.

% 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'];

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

initialize метод загружает мир анимации, описанный в 'VRWorldFilename' поле объекта Animation. При парсинге мира объекты узла создаются для существующих узлов с именами DEF. 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';

Координата набора преобразовывает функцию

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

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

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

Добавьте вертолет преследования

Этот код показывает, как добавить вертолет преследования в объект Animation.

Можно просмотреть все узлы в настоящее время в объекте Animation виртуальной реальности при помощи 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];

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

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

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

Этот код использует addViewpoint метод, чтобы создать новую точку зрения, названную 'chaseView'. Новая точка зрения появится в выпадающем меню точки зрения в окне виртуальной реальности как "Представление От Вертолета". Другой вызов nodeInfo показывает недавно добавленные объекты узла. Узел создается как дочерний элемент вертолета преследования.

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

Проигрывайте анимацию

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');

Добавьте МАРШРУТ

Этот код вызывает addRoute метод, чтобы добавить команду МАРШРУТА, чтобы соединить плоское положение с узлом Camera1. Это будет допускать "Поездку на Плоской" точке зрения функционировать, как предназначено.

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' свойство объекта Animation. Чтобы поднять исходный мир, установите 'VRWorldFilename' к настоящему имени и переинициализации его.

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

Закройте и удалите мир

Закрыться и delete

h.delete();