ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX



Клипы - часть 16


Чтобы упростить код приложения, я включил в него глобальный объект C3dAnimation, который позволяет записывать состояние только одного объекта.

Программная реализация настолько проста, что ее даже не стоит приводить здесь, однако для полноты картины мы все же кратко рассмотрим ключевые функции класса C3dAnimation. Давайте для начала посмотрим, как новая ключевая точка заносится в список. Предполагается, что фигура для анимации была выбрана ранее, при вызове функции C3dAnimation::Attach:

BOOL C3dAnimation::AddKey(double time) {

if (!m_pFrame) return FALSE;

// Определить положение и ориентацию фрейма C3dVector p, d, u;

m pFrame-»GetPosition (p) ;

m_pFrame-»GetDirection (d, u) ;

// Создать новый ключ C3dAnimKey* pKey = new C3dAnimKey(time, p, d, u);

// Внести ключ в список return AddKey(pKey);

}

Функция определяет текущее положение и ориентацию фрейма и создает по ним новый объект C3dAnimKey. Затем ключ вносится в список:

BOOL C3dAnimation::AddKey(C3dAnimKey* pNewKey) {

if (!pNewKey) return FALSE;

.'^япиг^ nauu^iy itfvi-ei/Ta ^IRK: ^AO

// Обновить текущее время m dCurTime = pNewKey-»m_dTime;

// Внести ключ в список if (IsEmptyO) {

AddTail(pNewKey) ;

return TRUE;

}

// Перебрать элементы списка в обратном направлении

POSITION роз = GetTailPositionO ;

ASSERT(pos) ;

do {

POSITION thispos = pos;

C3dAnimKey* pKey = (C3dAnimKey*) GetPrev(pos);

if (pKey-»m dTime «= pNewKey-»m_dTime) { // Вставить новый ключ после текущего InsertAfter(thispos, pNewKey);

return TRUE;

) } while (pos);

// Внести новый ключ в начало списка AddHead(pNewKey) ;

return TRUE;

}

Примечание

Если вы никогда не пользовались классом MFC СОЫ-ist, то можете растеряться при виде функций GetNext (см. выше) и GetPrev (см. ниже). Эти функции извлекают данные по ключу, после чего увеличивают или уменьшают значение ключевой переменной. Я ненавижу их, поскольку их использование противоречит здравому смыслу, однако в целом класс СОЫ-ist достаточно удобен — во всяком случае, до тех пор, пока я не разберусь с шаблонами и стандартными библиотеками C++ и не разработаю более удачное решение.




Содержание  Назад  Вперед