exponenta event banner

Наложение смоделированных и фактических данных полета

В этом примере показано, как визуализировать моделируемые и фактические траектории полета с помощью объекта анимации (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>