Я упертый\упоротый - вот все мои исходники скелетки.
Расчет вершин по скелету
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] - анимировать объект