Показать сообщение отдельно
Старый 18.06.2014, 14:46   #299
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

Я упертый\упоротый - вот все мои исходники скелетки.

Расчет вершин по скелету
if ( node->skinned )
  {
    int i = 0; 

    for( auto meshIter = node->meshes.begin(); meshIter != node->meshes.end(); ++meshIter )
    {
      Mesh * mesh = *meshIter;

      vector< Vertex > temp = mesh->vertices;

      for( int i = 0; i < mesh->vertices.size(); i++ )
      {
        Vertex & vertex = mesh->vertices[ i ];
        Weight & weight = mesh->weights[ i ];

        btVector3 lastPosition = btVector3( vertex.coords.x, vertex.coords.y, vertex.coords.z );
        btVector3 newPosition = btVector3( 0, 0, 0 );

        for( int j = 0; j < weight.boneCount; j++ )
        {
          SceneNode * bone = weight.bones[ j ].node;

          newPosition += newPosition += bone->invBoneBindTransform * bone->globalTransform * lastPosition * weight.bones[ j ].weight;
        }

        vertex.coords.x = newPosition.x();
        vertex.coords.y = newPosition.y();
        vertex.coords.z = newPosition.z();
      }

      UpdateBuffers( mesh );

      mesh->vertices = temp;
    }
  }
Поиск костей и расчет их инверсных матриц.
  for( int i = 0; i < numMeshes; i++ )
  {
    SceneNode * node = scene->childs[ i ];

    node->invBoneBindTransform = CalculateGlobalTransform( node ).inverse();

    for( int k = 0; k < node->meshes.size(); k++ )
    {
      Mesh * mesh = node->meshes[ k ] ;

      for( int j = 0; j < mesh->weights.size(); j++ )
      {
        Weight & w = mesh->weights[ j ];

        for( int q = 0; q < w.boneCount; q++ )
        {
          w.bones[ q ].node = reinterpret_cast< SceneNode* >( FindByName( w.bones[q].name.c_str() ));
        }
      }
    }
  }
Расчет глобальной трансформации
btTransform & CalculateGlobalTransform( SceneNode * n )
{
  if( n->body )
    n->body->activate( true );

  if( n->parent )
  {
    if( n->parent->frozen )
    {
      n->globalTransform = CalculateGlobalTransform( n->parent ) * n->localTransform;

      if( n->body )
      {
        n->body->setWorldTransform( n->globalTransform );
        n->body->setLinearVelocity( btVector3( 0, 0, 0 ));
      }
    }
    else
    {
      if( n->body )
        n->globalTransform = n->body->getWorldTransform();
      else
        n->globalTransform = CalculateGlobalTransform( n->parent ) * n->localTransform;
    }
  }
  else
  {
    if( n->body )
      n->globalTransform = n->body->getWorldTransform();
    else
      n->globalTransform = n->localTransform;
  }

  return n->globalTransform;
}
И в аттаче пример работы этой хуиты.

[E] - анимировать объект
Вложения
Тип файла: rar rrr.rar (653.2 Кб, 620 просмотров)
__________________


Последний раз редактировалось mr.DIMAS, 18.06.2014 в 19:21.
(Offline)
 
Ответить с цитированием