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




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


При добавлении новых ключей список просматривается с конца, поскольку обычно это ускоряет поиск нужной позиции.

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

/b> Глава 11. Клипы

BOOL CMainFrame::Update() {

if (m bPlayAnimation) {

double 1 = m_Anim.GetLength();

double t = in_Anim.GetCurTime() ;

t += 0.1;

if (t » 1) (

if (m_bLoopAnim) {

m_Anim.SetTime(0.0) ;

} else {

m_bPlayAnimation = FALSE;

Status("End of animation");

} } else (

m Anim.SetTime (t);

}

i

Счетчик времени увеличивается с интервалом в 0,1 единицы. В конце анимация останавливается или запускается снова, в зависимости от состояния флага m_bLoopAnim. Ниже приведена функция C3dAnimationTime::SetTime, задающая состояние объекта для нужного момента времени:

BOOL C3dAnimation::SetTime(double time) (

m_dCurTime = time;

if (!m_pFrame) return FALSE;

if (IsEmptyO) return FALSE;

// Перебрать элементы списка в поисках пары ключей, // между которыми лежит заданная величина // (или точного совпадения) POSITION pos = GetHeadPositionO;

ASSERT(pos) ;

C3dAnimKey* pBefore = (C3dAnimKey*) GetNext(pos) ;

ASSERT(pBefore) ;

if (pBefore-»m_dTime » time) return FALSE;

// Слишком рано, // ключ отсутствует

C3dAnimKey* pAfter = NULL;

while (pos) {

pAfter = (C3dAnimKey*) GetNext(pos) ;

ASSERT(pAfter) ;

if ( (pBefore-»m_dTime «= time) && (pAfter-»m_dTime »= time) ) break;

pBefore = pAfter;

// Вычислить интерполированные значения C3dVector p, d, u;

double dt;

if (pAfter != NULL) {

dt = pAfter-»m dTime — pBefore-»m_dTime;

} else {

dt = pBefore-»m_dTime;

} if ((pAfter == NULL) ¦¦ (dt ==0)) {

p = pBefore-»m_vPos;

d = pBefore-»m_vDir;

u = pBefore-»m_vUp;

} else {

double r = (time — pBefore-»m_dTime) / dt;

p = pBefore-»m_vPos + (pAfter-»m_vPos — pBefore-




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