В этом примере показано, как визуализировать моделируемые и фактические траектории полета с помощью объекта анимации (Aero.Animation), показывая при этом некоторые функции объекта анимации. В этом примере можно использовать объект Aero.Animation для создания и настройки объекта анимации, а затем использовать этот объект для создания, визуализации и управления телами для траекторий полета.
Этот код создает экземпляр Aero.Animation объект.
h = Aero.Animation;
Этот код задает количество кадров в секунду. Этот параметр управляет скоростью отображения кадров в окне рисунка.
h.FramesPerSecond = 10;
Этот код задает секунды масштабирования данных анимации в секунду. Это свойство и 'FramesPerSecond' свойство определяет временной шаг моделирования. Настройки в этом примере приводят к временному шагу приблизительно 0,5 с. Уравнение (1/FramesPerSecond) * TimeScaling вместе с некоторыми дополнительными членами, обрабатываемыми для субсекундной точности.
h.TimeScaling = 5;
Этот код загружает тела с помощью createBody для объекта анимации, 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;
Задайте временные ряды тел.
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 для создания графического объекта фигуры для объекта анимации.
h.show();

Этот код использует play метод анимации тел на длительность данных временных рядов. Использование этого метода иллюстрирует небольшие различия между моделируемыми и полетными данными.
h.play();

Код также может использовать пользовательский, упрощенный 'PositionFcn' это статическое положение, основанное на положении тел (т.е. отсутствие динамики). Упрощенный 'PositionFcn' находится здесь: matlabroot/toolbox/aero/astdemos/staticCameraPosition.m
Установка нового 'PositionFcn'.
h.Camera.PositionFcn = @staticCameraPosition;
Запуск анимации с новыми 'PositionFcn'.
h.play();

Этот код иллюстрирует перемещение тел в исходное положение (на основе данных временных интервалов) и обновление положения камеры в соответствии с новым '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 условие не позволяет окнам быть окрашенными.
Свойство name хранится в данных геометрии тела (h.Bodies {2} .Geometry.FaceVertexColorData (k) .name).
Код изменяет только индексы в patchHandles3 с неоконными аналогами в данных геометрии тела.
Свойство name не всегда может использоваться для определения различных частей транспортного средства. В этих случаях необходимо использовать альтернативный подход к выборочной раскраске.
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 векторы были определены по свойству name в данных геометрии. Другие источники данных могут не иметь этой информации. В этих случаях необходимо знать, какие индексы соответствуют определенным частям геометрии.
for k = [1:8,11:14,52:57] set(patchHandles3(k),'Visible','off') end

Закрытие и удаление
h.delete();
%#ok<*REPMAT>