Моделируемые и фактические данные о рейсе с использованием объектов Aero.Animation

Создание и конфигурирование объекта анимации

Эта серия команд создает объект анимации и конфигурирует объект.

  1. Создайте объект анимации.

    h = Aero.Animation;
  2. Сконфигурируйте объект анимации, чтобы задать количество систем координат в секунду (FramesPerSecond) свойство. Это строение управляет частотой отображения систем координат в окне рисунка.

    h.FramesPerSecond = 10;
  3. Сконфигурируйте объект анимации, чтобы задать секунды данных анимации в секунду масштабирования (TimeScaling) свойство.

    h.TimeScaling = 5;

    Комбинация FramesPerSecond и TimeScaling свойство определяет временной шаг симуляции. Эти настройки приводят к временному шагу приблизительно 0,5 с.

  4. Создайте и загрузите тела для объекта анимации. Этот пример использует эти тела для работы и отображения моделируемых и фактических траекторий рейса. Первое тело оранжевое; он представляет моделируемые данные. Второе тело синего цвета; он представляет фактические данные о рейсе.

    idx1 = h.createBody('pa24-250_orange.ac','Ac3d');
    idx2 = h.createBody('pa24-250_blue.ac','Ac3d');

    Оба тела являются файлами AC3D формата. AC3D является одним из нескольких форматов файлов, которые поддержка объекты анимации. FlightGear использует тот же формат файла. Объект анимации читается в телах в AC3D формате и сохраняет их как закрашенные фигуры в объекте геометрии в объекте анимации.

Загрузка записанных данных для траекторий рейса

Эта серия команд загружает зарегистрированные данные траектории рейса, которые содержатся в файлах в matlabroot\ toolbox\aero\astdemos папка.

  • simdata - Содержит моделируемые данные траектории рейса, который настраивается как 6DoF массив.

  • fltdata - Содержит фактические данные траектории рейса, которые настроены в пользовательском формате. Чтобы получить доступ к этим пользовательским данным формата, пример должен задать значение параметра TimeSeriesSourceType объекта тела Custom а затем задайте пользовательскую функцию чтения.

  1. Загрузите данные траектории рейса.

    load simdata
    load fltdata
  2. Установите данные временных рядов для этих двух тел.

    h.Bodies{1}.TimeSeriesSource = simdata;
    h.Bodies{2}.TimeSeriesSource = fltdata;
  3. Идентифицируйте временные ряды для второго тела как пользовательские.

    h.Bodies{2}.TimeSeriesSourceType = 'Custom';
  4. Задайте пользовательскую функцию чтения для доступа к данным в fltdata для второго тела. Пример предоставляет пользовательскую функцию чтения в matlabroot\ toolbox\aero\astdemos\CustomReadBodyTSData.m.

    h.Bodies{2}.TimeseriesReadFcn = @CustomReadBodyTSData;

Отображение геометрии тела в окне фигуры

Эта команда создает объект рисунка для объекта анимации.

h.show();

Запись файлов анимации

Включите запись воспроизведения траекторий рейса с помощью объекта анимации.

h.VideoRecord = 'on';
h.VideoQuality = 50;
h.VideoCompression = 'Motion JPEG AVI'
h.VideoFilename = 'astMotion_JPEG';

Включите запись анимации в любой точке, в которой необходимо сохранить последовательность анимации.

Примечание

При выборе типа сжатия видео имейте в виду, что вам понадобится соответствующее программное обеспечение средство просмотра. Для примера, если вы создаете формат AVI, вам нужен такое средство просмотра, как Windows Media® Проигрыватель для просмотра файла.

После воспроизведения анимации, как описано в «Игру траекторий рейса» Использование объекта анимации, astMotion_JPEG содержит запись воспроизведения.

Игра обратный Рейс траекторий с использованием объекта анимации

Эта команда воспроизводит тела анимации на время данных временных рядов. Это воспроизведение показывает различия между моделируемыми и фактическими данными о рейсе.

h.play();

Если вы использовали Video свойства для хранения записи см. в разделе Просмотр записанных файлов анимации для описания способа просмотра файлов.

Просмотр записанных файлов анимации

Если у вас нет файла анимации для просмотра, смотрите Запись файлов анимации.

  1. Откройте папку, содержащую файл анимации, который вы хотите просмотреть.

  2. Просмотрите файл анимации с приложением по своему выбору.

    Если ваш файл анимации еще не запущен, запустите его сейчас из приложения.

  3. Чтобы предотвратить другие h.play команды от перезаписи содержимого файла анимации отключите запись после удовлетворения содержимым.

    h.VideoRecord = 'off';

Манипулирование камерой

Этот командный ряд показывает, как можно манипулировать камерой на двух телах и повторно отобразить анимацию. The PositionFcn свойство объекта камеры управляет положением камеры относительно тел в анимации. В игре траекторий рейса с использованием объекта анимации объект камеры использует значение по умолчанию для PositionFcn свойство. В этой командной серии пример ссылается на пользовательское PositionFcn функция, которая использует статическое положение, основанное на положении тел. Динамика не задействована.

Примечание

Настраиваемая PositionFcn функция расположена в matlabroot\ toolbox\aero\astdemos папка.

  1. Установите камеру PositionFcn в пользовательскую функцию staticCameraPosition.

    h.Camera.PositionFcn = @staticCameraPosition;
  2. Запустите анимацию еще раз.

    h.play();

Перемещение и изменение положения тел

Эта серия команд иллюстрирует перемещение и изменение положения тел.

  1. Установите время запуска равным 0.

    t = 0;
  2. Переместите тело в начальное положение, основанное на данных временных рядов. Используйте объект Aero.Animation updateBodies способ.

    h.updateBodies(t);
  3. Обновите положение камеры с помощью пользовательского PositionFcn набор функций в предыдущем разделе. Используйте объект Aero.Animation updateCamera способ.

    h.updateCamera(t);
  4. Измените положение тел путем вначале получения текущего положения тел, а затем отделения тел.

    1. Получаем текущие положения тел и повороты от объектов обоих тел.

      pos1 = h.Bodies{1}.Position;
      rot1 = h.Bodies{1}.Rotation;
      pos2 = h.Bodies{2}.Position;
      rot2 = h.Bodies{2}.Rotation;
    2. Разделите и переместите тела путем перемещения их в новые положения.

      h.moveBody(1,pos1 + [0 0 -3],rot1);
      h.moveBody(2,pos1 + [0 0  0],rot2);

Создание прозрачности в первом теле

Эта серия команд иллюстрирует, как создать и прикрепить прозрачность к телу. Объект анимации сохраняет геометрию тела как закрашенные фигуры. Этот пример манипулирует свойствами прозрачности этих закрашенных фигур (см. «Закрашенные фигуры»).

Примечание

Использование прозрачностей может снизить скорость анимации на платформах, которые используют программное обеспечение OpenGL® визуализация (см. opengl).

  1. Измените свойства закрашенной фигуры к телу. Используйте PatchHandles Aero.Body свойство для получения указателей на закрашенную фигуру для первого тела.

    patchHandles2 = h.Bodies{1}.PatchHandles;

  2. Установите значения граней и ребер, необходимые для прозрачности.

    desiredFaceTransparency = .3;
    desiredEdgeTransparency = 1;
  3. Получите текущую грань и ребро альфа- данных и измените все значения на требуемые альфа-значения. На рисунке первое тело теперь имеет прозрачность.

    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

Изменение цвета второго тела

Эта серия команд иллюстрирует, как изменить цвет тела. Объект анимации сохраняет геометрию тела как закрашенные фигуры. Этот пример манипулирует FaceVertexColorData свойство этих закрашенных фигур.

  1. Измените свойства закрашенной фигуры к телу. Используйте PatchHandles Aero.Body свойство для получения указателей на закрашенную фигуру для первого тела.

    patchHandles3 = h.Bodies{2}.PatchHandles;

  2. Установите красный цвет закрашенной фигуры.

    desiredColor = [1 0 0];
  3. Получите текущий цвет лица и данные и распространите новый цвет закрашенной фигуры, красный, на лицо.

    • The if условие препятствует окнам быть окрашенными.

    • The 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 isempty(strfind(tempName,'Windshield')) &&...
           isempty(strfind(tempName,'front-windows')) &&...
           isempty(strfind(tempName,'rear-windows'))
        set(patchHandles3(k),...
            'FaceVertexCData',repmat(desiredColor,[size(tempFaceColor,1),1]));
        end
    end

Выключение шасси второго кузова

Эта серия команд иллюстрирует, как выключить шасси на втором корпусе путем отключения видимости всех деталей транспортного средства, связанных с шасси.

Примечание

Индексы в patchHandles3 вектор определяются из name свойство. Если вы не можете получить доступ к name Свойство определения индексов необходимо использовать альтернативный способ определения индексов, соответствующих геометрическим деталям.

for k = [1:8,11:14,52:57]
    set(patchHandles3(k),'Visible','off')
end