В этом примере показано, как визуализировать взлет самолета и захват вертолета с помощью объекта анимации виртуальной реальности. В этом примере для настройки анимации виртуальной реальности на основе файла asttkoff.wrl можно использовать объект Aero.VirtityAnimation. Сцена имитирует взлет самолета. В этом примере к моделированию добавляется транспортное средство для погона и точка обзора, связанная с новым транспортным средством.
Этот код создает экземпляр Aero.VirtualRealityAnimation объект.
h = Aero.VirtualRealityAnimation;
Этот код задает количество кадров в секунду и секунды масштабирования данных анимации в секунду. 'FramesPerSecond' управляет скоростью отображения кадров в окне рисунка. 'TimeScaling' - это секунды масштабирования данных анимации в секунду.
'TimeScaling' и 'FramesPerSecond' свойства определяют временной шаг моделирования. Настройки в этом примере приводят к временному шагу приблизительно 0,5 с. Уравнение:
(1/FramesPerSecond) * TimeScaling + дополнительные члены для обработки для субсекундной точности.
h.FramesPerSecond = 10; h.TimeScaling = 5;
Этот код задает файл .wrl для использования в анимации виртуальной реальности.
h.VRWorldFilename = [matlabroot,'/toolbox/aero/astdemos/asttkoff.wrl'];
Для отслеживания изменений в мире в объектных методах VirtureSharingAnimation используются временные файлы .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'];
initialize загружает анимационный мир, описанный в 'VRWorldFilename' поле объекта анимации. При анализе мира объекты узла создаются для существующих узлов с именами DEF. initialize также открывается средство просмотра Simulink 3D Animation.
h.initialize();

Этот код задает данные временных интервалов моделирования. 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;
В этом коде показано, как добавить вертолет погона к анимационному объекту.
Все узлы, находящиеся в данный момент в объекте анимации виртуальной реальности, можно просмотреть с помощью 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' в объекте VirtityTalkAnimation.
h.ShowSaveWarning = 0; h.addNode('Lynx',[matlabroot,'/toolbox/aero/astdemos/chaseHelicopter.wrl']);

Еще один звонок nodeInfo показывает вновь добавленные объекты Node.
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 метод запускает моделирование для указанных данных временных интервалов.
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 метод добавления команды 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();