Эта серия команд создает объект анимации и конфигурирует объект.
Создайте объект анимации.
h = Aero.Animation;
Сконфигурируйте объект анимации, чтобы задать количество систем координат в секунду (FramesPerSecond
) свойство. Это строение управляет частотой отображения систем координат в окне рисунка.
h.FramesPerSecond = 10;
Сконфигурируйте объект анимации, чтобы задать секунды данных анимации в секунду масштабирования (TimeScaling
) свойство.
h.TimeScaling = 5;
Комбинация FramesPerSecond
и TimeScaling
свойство определяет временной шаг симуляции. Эти настройки приводят к временному шагу приблизительно 0,5 с.
Создайте и загрузите тела для объекта анимации. Этот пример использует эти тела для работы и отображения моделируемых и фактических траекторий рейса. Первое тело оранжевое; он представляет моделируемые данные. Второе тело синего цвета; он представляет фактические данные о рейсе.
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
а затем задайте пользовательскую функцию чтения.
Загрузите данные траектории рейса.
load simdata load fltdata
Установите данные временных рядов для этих двух тел.
h.Bodies{1}.TimeSeriesSource = simdata; h.Bodies{2}.TimeSeriesSource = fltdata;
Идентифицируйте временные ряды для второго тела как пользовательские.
h.Bodies{2}.TimeSeriesSourceType = 'Custom';
Задайте пользовательскую функцию чтения для доступа к данным в 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
свойства для хранения записи см. в разделе Просмотр записанных файлов анимации для описания способа просмотра файлов.
Если у вас нет файла анимации для просмотра, смотрите Запись файлов анимации.
Откройте папку, содержащую файл анимации, который вы хотите просмотреть.
Просмотрите файл анимации с приложением по своему выбору.
Если ваш файл анимации еще не запущен, запустите его сейчас из приложения.
Чтобы предотвратить другие h.play
команды от перезаписи содержимого файла анимации отключите запись после удовлетворения содержимым.
h.VideoRecord = 'off';
Этот командный ряд показывает, как можно манипулировать камерой на двух телах и повторно отобразить анимацию. The PositionFcn
свойство объекта камеры управляет положением камеры относительно тел в анимации. В игре траекторий рейса с использованием объекта анимации объект камеры использует значение по умолчанию для PositionFcn
свойство. В этой командной серии пример ссылается на пользовательское PositionFcn
функция, которая использует статическое положение, основанное на положении тел. Динамика не задействована.
Примечание
Настраиваемая PositionFcn
функция расположена в
папка.matlabroot
\ toolbox\aero\astdemos
Установите камеру PositionFcn
в пользовательскую функцию staticCameraPosition
.
h.Camera.PositionFcn = @staticCameraPosition;
Запустите анимацию еще раз.
h.play();
Эта серия команд иллюстрирует перемещение и изменение положения тел.
Установите время запуска равным 0.
t = 0;
Переместите тело в начальное положение, основанное на данных временных рядов. Используйте объект Aero.Animation updateBodies
способ.
h.updateBodies(t);
Обновите положение камеры с помощью пользовательского PositionFcn
набор функций в предыдущем разделе. Используйте объект Aero.Animation updateCamera
способ.
h.updateCamera(t);
Измените положение тел путем вначале получения текущего положения тел, а затем отделения тел.
Получаем текущие положения тел и повороты от объектов обоих тел.
pos1 = h.Bodies{1}.Position; rot1 = h.Bodies{1}.Rotation; pos2 = h.Bodies{2}.Position; rot2 = h.Bodies{2}.Rotation;
Разделите и переместите тела путем перемещения их в новые положения.
h.moveBody(1,pos1 + [0 0 -3],rot1); h.moveBody(2,pos1 + [0 0 0],rot2);
Эта серия команд иллюстрирует, как создать и прикрепить прозрачность к телу. Объект анимации сохраняет геометрию тела как закрашенные фигуры. Этот пример манипулирует свойствами прозрачности этих закрашенных фигур (см. «Закрашенные фигуры»).
Примечание
Использование прозрачностей может снизить скорость анимации на платформах, которые используют программное обеспечение OpenGL® визуализация (см. opengl
).
Измените свойства закрашенной фигуры к телу. Используйте PatchHandles
Aero.Body свойство для получения указателей на закрашенную фигуру для первого тела.
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
Эта серия команд иллюстрирует, как изменить цвет тела. Объект анимации сохраняет геометрию тела как закрашенные фигуры. Этот пример манипулирует FaceVertexColorData
свойство этих закрашенных фигур.
Измените свойства закрашенной фигуры к телу. Используйте PatchHandles
Aero.Body свойство для получения указателей на закрашенную фигуру для первого тела.
patchHandles3 = h.Bodies{2}.PatchHandles;
Установите красный цвет закрашенной фигуры.
desiredColor = [1 0 0];
Получите текущий цвет лица и данные и распространите новый цвет закрашенной фигуры, красный, на лицо.
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