Этот пример показывает, как визуализировать моделируемый по сравнению с фактическими траекториями рейса с объектом Animation (Аэро. Анимация) при показе части функциональности объекта Animation. В этом примере можно использовать Аэро. Объект Animation, чтобы создать и сконфигурировать объект Animation, затем используйте тот объект создать, визуализировать, и управлять телами для траекторий рейса.
Этот код создает экземпляр объекта Aero.Animation
.
h = Aero.Animation;
Это кодовые наборы количество кадров в секунду. Это управляет уровнем, на котором кадры отображены в окне рисунка.
h.FramesPerSecond = 10;
Это кодовые наборы секунды данных анимации в секунду время, масштабируясь. Это свойство и свойство 'FramesPerSecond'
определяют временной шаг симуляции. Настройки в этом примере приводят к временному шагу приблизительно 0,5 с. Уравнение (1/FramesPerSecond) *TimeScaling наряду с некоторыми дополнительными условиями, чтобы обработать для подвторой точности.
h.TimeScaling = 5;
Этот код загружает тела с помощью createBody
для объекта Animation, h
. Этот пример будет использовать эти тела, чтобы работать с и отобразить моделируемые и фактические траектории рейса. Первое тело является оранжевым и будет представлять моделируемые данные. Второе тело является синим и будет представлять фактические полетные данные.
idx1 = h.createBody('pa24-250_orange.ac','Ac3d'); idx2 = h.createBody('pa24-250_blue.ac','Ac3d');
Используя тела из предыдущего кода, этот код предоставляет моделируемые и фактические записанные данные для траекторий рейса в следующих файлах:
simdata файл содержит регистрируемые моделируемые данные. simdata
настраивается как 6DoF массив, который является одним из форматов данных по умолчанию.
fltdata файл содержит фактические данные о летном испытании. В этом примере fltdata
настраивается в пользовательском формате. Пример должен создать пользовательскую функцию чтения и установить параметр 'TimeSeriesSourceType'
на 'Custom'
.
Загружать simdata и fltdata файлы:
load simdata load fltdata
Работать с пользовательскими данными о летном испытании, это кодовые наборы второе тело 'TimeSeriesReadFcn'
. Пользовательская функция чтения расположена здесь: matlabroot/toolbox/aero/astdemos/CustomReadBodyTSData.m
h.Bodies{2}.TimeseriesReadFcn = @CustomReadBodyTSData;
Установите данные о timeseries тел.
h.Bodies{1}.TimeSeriesSource = simdata;
h.Bodies{2}.TimeSeriesSource = fltdata;
h.Bodies{2}.TimeSeriesSourceType = 'Custom';
Этот код иллюстрирует, как можно управлять камерой для этих двух тел.
Свойство 'PositionFcn'
объекта камеры управляет положением камеры относительно тел в анимации. Камера по умолчанию 'PositionFcn'
следует за путем автомобиля преследования первого порядка. Поэтому это делает несколько шагов для камеры, чтобы расположить себя правильно в положение плоскости преследования. 'PositionFcn'
по умолчанию расположен здесь: matlabroot/toolbox/aero/aero/doFirstOrderChaseCameraDynamics.m
Установите 'PositionFcn'
.
h.Camera.PositionFcn = @doFirstOrderChaseCameraDynamics;
Этот код использует метод show
, чтобы создать графический объект фигуры для объекта Animation.
h.show();
Этот код использует метод play
, чтобы анимировать тела на время данных о timeseries. Используя этот метод проиллюстрирует незначительные различия между моделируемым и полетными данными.
h.play();
Код может также использовать пользовательский, упрощенный 'PositionFcn'
, который является статическим положением на основе положения тел (т.е. никакая динамика). Упрощенный 'PositionFcn'
расположен здесь: matlabroot/toolbox/aero/astdemos/staticCameraPosition.m
Установите новый 'PositionFcn'
.
h.Camera.PositionFcn = @staticCameraPosition;
Запустите анимацию с новым 'PositionFcn'
.
h.play();
Этот код иллюстрирует, как двигать телами к стартовой позиции (на основе данных о timeseries) и обновить положение камеры согласно новому 'PositionFcn'
. Этот код использует updateBodies
и updateCamera
.
t = 0; h.updateBodies(t); h.updateCamera(t);
Этот код иллюстрирует, как изменить местоположение тел первым получением текущего положения тела и затем разделением тел.
Получите текущие положения тела и вращения от объектов тела.
pos1 = h.Bodies{1}.Position; rot1 = h.Bodies{1}.Rotation; pos2 = h.Bodies{2}.Position; rot2 = h.Bodies{2}.Rotation;
Отдельные тела с помощью moveBody
. Этот код разделяет и меняет местоположение этих двух тел.
h.moveBody(1,pos1 + [0 0 -3],rot1); h.moveBody(2,pos1 + [0 0 0],rot2);
Этот код иллюстрирует, как создать прозрачность в первом теле. Код делает это путем изменения свойств исправления тела через 'PatchHandles'
. (Для получения дополнительной информации о закрашенных фигурах в MATLAB® смотрите раздел Introduction to Patch Objects
в документации MATLAB.)
Примечание: На некотором программном обеспечении использования платформ рендеринг OpenGL®, прозрачность может вызвать уменьшение в скорости анимации.
См. документацию opengl
для получения дополнительной информации о OpenGL в MATLAB.
Чтобы создать прозрачность, код получает указатели закрашенной фигуры для первого тела.
patchHandles2 = h.Bodies{1}.PatchHandles;
Боритесь и альфа-значения ребра.
desiredFaceTransparency = .3; desiredEdgeTransparency = 1;
Этот код получает текущую поверхность и альфа-данные о ребре и изменяет все значения на желаемые альфа-значения. В фигуре заметьте, что первое тело теперь имеет прозрачность.
for k = 1:size(patchHandles2,1) tempFaceAlpha = get(patchHandles2(k),'FaceVertexAlphaData'); tempEdgeAlpha = get(patchHandles2(k),'EdgeAlpha'); set(patchHandles2(k),... 'FaceVertexAlphaData',repmat(desiredFaceTransparency,size(tempFaceAlpha))); set(patchHandles2(k),... 'EdgeAlpha',repmat(desiredEdgeTransparency,size(tempEdgeAlpha))); end
Этот код иллюстрирует, как изменить телесный цвет цвет второго тела. Код делает это путем изменения свойств исправления тела через 'PatchHandles'
.
patchHandles3 = h.Bodies{2}.PatchHandles;
Это кодовые наборы желаемый (красный) цвет шаблона.
desiredColor = [1 0 0];
Код может теперь получить текущие данные о цвете поверхности и изменить все значения на значения требуемого цвета. Отметьте следующие моменты на коде:
Условие if
мешает окнам окрашиваться.
Свойство имени хранится в данных о геометрии тела (h. Тела {2}.Geometry. FaceVertexColorData (k) .name).
Код только изменяет индексы в patchHandles3
с дубликатами неокна в данных о геометрии тела.
Свойство имени не может всегда быть доступным, чтобы определить различные части автомобиля. В этих случаях необходимо будет использовать альтернативный подход к выборочной окраске.
for k = 1:size(patchHandles3,1) tempFaceColor = get(patchHandles3(k),'FaceVertexCData'); tempName = h.Bodies{2}.Geometry.FaceVertexColorData(k).name; if ~contains(tempName,'Windshield') &&... ~contains(tempName,'front-windows') &&... ~contains(tempName,'rear-windows') set(patchHandles3(k),... 'FaceVertexCData',repmat(desiredColor,[size(tempFaceColor,1),1])); end end
Следующий код выключает посадочное устройство для второго тела. Для этого это выключает видимость всех частей автомобиля, сопоставленных с посадочным устройством. Обратите внимание, что индексы в вектор patchHandles3
были определены из свойства имени в данных о геометрии. Другие источники данных не могут иметь эту информацию в наличии. В этих случаях необходимо будет знать, какие индексы соответствуют конкретным частям геометрии.
for k = [1:8,11:14,52:57] set(patchHandles3(k),'Visible','off') end
Закрыть и удалить
h.delete();
%#ok<*REPMAT>