AnimatedMesh* ModelLoader::LoadAnimatedModel(const char* filePath)
{
const aiScene* scene = aiImportFile(filePath, (aiProcessPreset_TargetRealtime_Quality|aiProcess_ConvertToLeftHanded) & ~aiProcess_FindInvalidData);
if(!scene)
{
return NULL;
}
AnimatedMesh* animMesh = new AnimatedMesh();
for(unsigned int i = 0; i < scene->mNumMeshes; i++)
{
aiMesh* mesh = scene->mMeshes[i];
//Copy vertex information
unsigned int numVertices = mesh->mNumVertices;
animMesh->vertexCount = numVertices;
animMesh->vertices = new AnimatedVertexType[numVertices];
for(unsigned int i_vert = 0; i_vert < numVertices; i_vert++)
{
aiVector3D vertex = mesh->mVertices[i_vert];
animMesh->vertices[i_vert].position = aiVector3toD3DVector(vertex);
}
//Copy index information
unsigned int numIndices = mesh->mNumFaces * 3;
animMesh->indexCount = numIndices;
animMesh->indices = new unsigned int[numIndices];
unsigned int indicePosition = 0;
for(unsigned int i_face = 0; i_face < mesh->mNumFaces; i_face++)
{
aiFace face = mesh->mFaces[i_face];
animMesh->indices[indicePosition++] = face.mIndices[0];
animMesh->indices[indicePosition++] = face.mIndices[1];
animMesh->indices[indicePosition++] = face.mIndices[2];
}
//Copy bone information
animMesh->boneCount = mesh->mNumBones;
std::vector<std::vector<aiVertexWeight>> weightPerVertex(mesh->mNumVertices);
for(unsigned int i_bone = 0; i_bone < mesh->mNumBones; i_bone++)
{
aiBone* b = mesh->mBones[i_bone];
for(unsigned int i_weight = 0; i_weight < b->mNumWeights; i_weight++)
{
aiVertexWeight vertexWeight = b->mWeights[i_weight];
weightPerVertex[vertexWeight.mVertexId].push_back(aiVertexWeight(i_bone, vertexWeight.mWeight));
}
aiNode* node = scene->mRootNode->FindNode(b->mName);
//Create bone transformations------------------->i think my problem is here
Bone* meshBone = new Bone();
meshBone->boneOffsetMatrix = aiMatrixtoD3DMatrix(b->mOffsetMatrix);
meshBone->localTransformMatrix = aiMatrixtoD3DMatrix(node->mTransformation);
meshBone->transformMatrix = meshBone->boneOffsetMatrix * meshBone->localTransformMatrix;
meshBone->name = node->mName.data;
node = node->mParent;
while(node)
{
meshBone->transformMatrix = aiMatrixtoD3DMatrix(node->mTransformation) * meshBone->transformMatrix;
node = node->mParent;
}
animMesh->bones.push_back(meshBone);
}
//Get weights for each vertex
for(unsigned int x = 0; x < numVertices; x++)
{
for(unsigned int y = 0; y < weightPerVertex[x].size(); y++)
{
animMesh->vertices[x].boneIndices[y] = weightPerVertex[x][y].mVertexId; // vertex id is used as bone id when creating this vector
animMesh->vertices[x].boneWeights[y] = weightPerVertex[x][y].mWeight;
}
}
for(unsigned int x = 0; x < 35; x++) //tiny.x has 35 bones
{
animMesh->boneMatrices[x] = animMesh->bones[x]->transformMatrix; //for easy use
}
}
return animMesh;
}And shader.
matrix viewMatrix;
matrix projectionMatrix;
matrix boneMatrices[35];
struct VS_In
{
float4 position : POSITION;
unsigned int4 boneIndices : BONEINDICES;
float4 boneWeights : BLENDWEIGHTS;
};
struct PS_In
{
float4 position : SV_POSITION;
};
PS_In VS_Main(VS_In vertex)
{
PS_In output = (PS_In)0;
output.position = float4(0.0f, 0.0f, 0.0f, 1.0f);
for(int i = 0; i < 4; i++)
{
output.position += vertex.boneWeights[i] * mul(vertex.position, boneMatrices[vertex.boneIndices[i]]);
}
output.position.w = 1.0f;
matrix viewProjection = mul(viewMatrix, projectionMatrix);
output.position = mul(output.position, viewProjection);
return output;
}
float4 PS_Main(PS_In frag) : SV_TARGET0
{
return float4(1.0f, 1.0f, 1.0f, 1.0f);
}
technique11 AnimatedMesh
{
pass p0
{
SetVertexShader(CompileShader(vs_5_0, VS_Main()));
SetPixelShader(CompileShader(ps_5_0, PS_Main()));
}
}Thanks!






