netlib.narod.ru | < Назад | Оглавление | Далее > |
Фреймы (frame) являются важной частью абстрактного режима Direct3D. Использование этого термина может привести к путанице, поскольку общепринятое его значение — «кадр анимации». В Direct3D значение этого термина происходит от словосочетания «система координат» (frame of reference). Фреймы применяются для размещения объектов в трехмерном пространстве. Объекты, такие как сетки, грани, камеры и источники света не имеют определенного местоположения или ориентации. Но если эти объекты присоединяются к фрейму, они получают свое местоположение и ориентацию от этого фрейма. В результате, при перемещении фрейма будут перемещаться все присоединенные к нему объекты.
Сцена Direct3D определяется как иерархия фреймов. Каждая сцена содержит корневой фрейм и произвольное число дочерних фреймов, присоединенных к корневому. Каждый дочерний фрейм может в свою очередь иметь собственные дочерние фреймы. Фреймы представлены интерфейсом Direct3DRMFrame и создаются функцией CreateFrame() интерфейса Direct3DRM.
LPDIRECT3DRMFRAME newframe; d3drm->CreateFrame(parentframe, &newframe);
В приведенном фрагменте кода объявляется указатель на фрейм, а затем он инициализируется функцией CreateFrame(). Переменная parentframe является указателем на фрейм, являющийся родителем нового фрейма. Чтобы создать корневой фрейм для новой сцены, значение этой переменной должно быть равно NULL.
Дочерние фреймы наследуют свои характеристики от родительских. Одной из наследуемых характеристик является система координат. Дочерние фреймы присоединяются к родительскому таким образом, что они следуют за ним — при перемещении родительского фрейма перемещаются и дочерние. Это позволяет создавать сложную анимацию частей объекта. Например, если вы хотите создать и анимировать вертолет (с вращающимися лопастями, разумеется), вы можете создать фрейм для корпуса вертолета, а затем создать дочерний фрейм для лопастей. Для анимации лопастей можно задать вращение для фреймов, к которым привязаны лопасти. Для анимации корпуса вертолета можно перемещать и изменять ориентацию фрейма к которому присоединен корпус. Поскольку фреймы лопастей являются дочерними по отношению к фрейму корпуса, они будут совершать те же перемещения, что и корпус.
В качестве системы отсчета фреймы могут использовать не только свой родительский фрейм. Многие функции позволяют указать, какой фрейм должен использоваться в качестве системы отсчета независимо от отношений «родитель-потомок». Гибкость иерархии фреймов — одна из причин исключительной мощности абстрактного режима Direct3D.
Интерфейс Direct3DRMFrame предоставляет ряд функций, используемых для позиционирования фреймов. К их числу относятся:
Функции GetPosition() и SetPosition() позволяют получить или задать местоположение фрейма. Аналогично, функции GetOrientation() и SetOrientation() позволяют задать ориентацию фрейма. Корме того, интерфейс предоставляет функцию LookAt() которая ориентирует фрейм, чтобы он был направлен (указывал) на другой фрейм. Функция LookAt() удобна в ситуации, когда камера или источник света следуют за другим объектом.
Функции SetPosition(), SetOrientation() и LookAt() устанавливают новые параметры объекта фрейма независимо от предыдущих. Кроме них интерфейс фрейма предоставляет функции AddTranslation(), AddRotation() и AddScale(), которые корректируют параметры фрейма, а не заменяют их. Функция AddTranslation() корректирует местоположение фрейма, согласно указанному перемещению. AddRotation() корректирует ориентацию фрейма, добавляя новое вращение к существующему. Функция AddScale() изменяет размеры фрейма относительно текущего размера.
Интерфейс фрейма предоставляет функции для пошаговой корректировки позиции фрейма. Эти функции задают атрибуты движения, которые будут применяться к фрейму при каждом обновлении сцены.
Функции GetRotation() и SetRotation() используются для управления атрибутами вращения фрейма. Вращение, заданное функцией SetRotation(), оказывает эффект при каждом обновлении сцены.
Возможность размещать фреймы и назначать атрибуты движения очень важна, но ее недостаточно. Интерактивная графика требует, чтобы объекты в сцене могли взаимодействовать друг с другом и реагировать на действия пользователя. Интерфейс фрейма позволяет осуществлять коррекцию во время выполнения с помощью функций обратного вызова. Функции обратного вызова (callback) — это написанные вами функции, которые устанавливаются, или регистрируются в Direct3D. После регистрации Direct3D будет выполнять функцию обратного вызова всякий раз, когда рисуется новая сцена, что позволяет вам внести последние изменения в объекты сцены.
Функции обратного вызова устанавливаются с помощью функции AddMoveCallback(). Каждый объект фрейма может установить несколько функций обратного вызова и эти функции будут вызываться в порядке установки. Чтобы удалить функцию обратного вызова, используйте функцию DeleteMoveCallback().
netlib.narod.ru | < Назад | Оглавление | Далее > |