В этом примере показано, как визуализировать взлет самолета и преследовать вертолет с объектом анимации виртуальной реальности. В этом примере можно использовать объект 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;
Этот код показывает, как добавить вертолет погони к объекту анимации.
Вы можете просмотреть все узлы в настоящее время в объекте анимации виртуальной реальности с помощью 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');
Этот код вызывает 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();