Animation* ModelInterface::loadAnimation(const aiAnimation* ai_animation, const int index) { QString animation_name(ai_animation->mName.data); double duration = ai_animation->mDuration; //qDebug() << "Animation: " + animation_name + " duration " + QString::number(duration); Animation* animation = new Animation(animation_name, duration, index); animation->setBoneCount(bones->getBoneNames().size()); for(uint bone_index = 0; bone_index < ai_animation->mNumChannels; ++bone_index) { aiNodeAnim* channel = ai_animation->mChannels[bone_index]; QString bone_name(channel->mNodeName.data); if(!bones->hasBone(bone_name)) continue; int bone_id = bones->getBone(bone_name)->getId(); animation->registerBone(bone_id); for(uint i = 0; i < channel->mNumPositionKeys; ++i) { aiVectorKey pos_key = channel->mPositionKeys[i]; animation->addBonePosition(bone_id, float(pos_key.mTime), QVector3D(pos_key.mValue.x, pos_key.mValue.y, pos_key.mValue.z)); } for(uint i = 0; i < channel->mNumRotationKeys; ++i) { aiQuatKey rot_key = channel->mRotationKeys[i]; animation->addBoneRotation(bone_id, float(rot_key.mTime), QQuaternion(rot_key.mValue.w, rot_key.mValue.x, rot_key.mValue.y, rot_key.mValue.z)); } for(uint i = 0; i < channel->mNumScalingKeys; ++i) { aiVectorKey scale_key = channel->mScalingKeys[i]; animation->addBoneScaling(bone_id, float(scale_key.mTime), QVector3D(scale_key.mValue.x, scale_key.mValue.y, scale_key.mValue.z)); } } return animation; }