Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Анимация X файлов в DirectX


Автор: dandy77 28.4.2009, 10:27
У меня есть следующий код:

Код

void CModel::SetCurrentAnimation(DWORD dwAnimationFlag, DWORD PrevAnim) 

  // If the animation is not one that we are already using 
  //  and the passed in flag is not bigger than the number of animations 
  if(dwAnimationFlag != m_dwCurrentAnimation && dwAnimationFlag < m_dwAnimationSetCount) 
  { 
  m_dwCurrentAnimation = dwAnimationFlag; 

  D3DXTRACK_DESC Desc; 
  LPD3DXANIMATIONSET AnimSet,AnimSetPrev; 
  


  if(dwAnimationFlag==PrevAnim) 
  { 
  m_pAnimController->GetAnimationSet(PrevAnim, &AnimSetPrev); 
  m_pAnimController->SetTrackAnimationSet(0, AnimSetPrev); 
  } 

  // Move Track 0 to track 1 
  m_pAnimController->GetTrackDesc(0, &Desc); 
  m_pAnimController->SetTrackDesc(1, &Desc); 

  m_pAnimController->GetTrackAnimationSet(0, &AnimSet); 
  m_pAnimController->SetTrackAnimationSet(1, AnimSet); 

  // Load the new animation set into track 0 
  m_pAnimController->GetAnimationSet(m_dwCurrentAnimation, &AnimSet); 
  m_pAnimController->SetTrackAnimationSet(0, AnimSet); 

  // Set the track description 
  // Set the weight to 0 for the blend 
  Desc.Weight = 0; 
  Desc.Position = AnimSet->GetPeriod(); 
  m_pAnimController->SetTrackDesc(0, &Desc); 

  // Key the blend 
  m_pAnimController->KeyTrackWeight(1, 0, m_pAnimController->GetTime(), 0.2, D3DXTRANSITION_EASEINEASEOUT ); 
  m_pAnimController->KeyTrackWeight(0, 1, m_pAnimController->GetTime(), 0.2, D3DXTRANSITION_EASEINEASEOUT ); 

  SAFE_RELEASE(AnimSet) 
  } 
}


Причем этот код вызываеться по нажатии клавиши "Вперед" так: 
Код

if (keys[VK_UP]) 

  g_pModel->SetCurrentAnimation(2,3); 

else 

  g_pModel->SetCurrentAnimation(3,2); 


Суть заключаеться в том, что одна анимация (например фигура Тини стоит на месте) сменяеться плавно другой анимацией- переход на ходьбу. Кто то может мне объяснить как работает эта функция SetCurrentAnimation что анимация меняеться плавно. В частности меня интересует что такое треки, зачем они если есть АнимСет, и подробно объясните как там эти треки меняються от одного до другого. Откуда например известно что такое трек 0 а что такое трек 1 когда мы переходим с 0 на 1-й? И почему мы описали 0-й трек и 1-й так потом нигде и не испльзуем?

Автор: BorisVorontsov 12.5.2009, 14:48
По поводу "как все это работает", могу посоветовать книжку Адамса "Advanced Animation in Directx" (примеры можно взять отсюда: http://itbookz.ru/nodata/nodataprog/4555-.html)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)