void akBLoader::convertSkeleton(Blender::bArmature *bskel) { akSkeleton* skel = new akSkeleton(); btAlignedObjectArray<akMatrix4> bind; Blender::Bone* bone = static_cast<Blender::Bone*>(bskel->bonebase.first); while (bone) { // only process root bones if (bone->parent == 0) buildBoneTree(skel, bind, bone, AK_JOINT_NO_PARENT); bone = bone->next; } akSkeletonPose* bindPose = new akSkeletonPose(skel, akSkeletonPose::SP_MODEL_SPACE); for(int i=0; i<skel->getNumJoints(); i++) { akTransformState t; akMathUtils::extractTransform(bind[i], t.loc, t.rot,t.scale ); *bindPose->getJointPose(i) = t; } skel->setBindingPose(bindPose); m_demo->addSkeleton(AKB_IDNAME(bskel), skel); }
void buildBoneTree(akSkeleton* skel, btAlignedObjectArray<akMatrix4>& bind, Blender::Bone* bone, UTuint8 parent) { //if(!(bone->flag & BONE_NO_DEFORM) || parent == AK_JOINT_NO_PARENT) { utHashedString jname = bone->name; float* bmat = (float*)bone->arm_mat; akMatrix4 mat(akVector4(bmat[4*0+0], bmat[4*0+1], bmat[4*0+2], bmat[4*0+3]), akVector4(bmat[4*1+0], bmat[4*1+1], bmat[4*1+2], bmat[4*1+3]), akVector4(bmat[4*2+0], bmat[4*2+1], bmat[4*2+2], bmat[4*2+3]), akVector4(bmat[4*3+0], bmat[4*3+1], bmat[4*3+2], bmat[4*3+3])); bind.push_back(mat); parent = skel->addJoint(jname, parent); if(bone->flag & BONE_NO_SCALE) skel->getJoint(parent)->m_inheritScale = false; } Blender::Bone* chi = static_cast<Blender::Bone*>(bone->childbase.first); while (chi) { // recurse buildBoneTree(skel, bind, chi, parent); chi = chi->next; } }
void core::Model::Animation::buildBoneTree(const aiScene *scene, aiNode *node, BoneNode *bNode, Model *m){ if(scene->HasAnimations()){ if(m->boneID.find(node->mName.data) != m->boneID.end()){ BoneNode tempNode; tempNode.name = node->mName.data; tempNode.parent = bNode; tempNode.nodeTransform = toMat4(&node->mTransformation); tempNode.boneTransform = boneOffset[tempNode.name]; bNode->children.push_back(tempNode); } if(node->mNumChildren > 0){ for(unsigned int x = 0; x < node->mNumChildren; x++){ if(m->boneID.find(node->mName.data) != m->boneID.end()) buildBoneTree(scene, node->mChildren[x], &bNode->children[bNode->children.size() - 1], m); else buildBoneTree(scene, node->mChildren[x], bNode, m); } } } };
void gkSkeletonConverter::buildBoneTree(Blender::Bone* cur, Blender::Bone* prev, gkBone* parent) { // This is the normal resposition GK_ASSERT(cur); GK_ASSERT(m_skeleton); gkMatrix4 parBind = gkMatrix4::IDENTITY; if (prev != 0 && parent != 0) parBind = gkMathUtils::getFromFloatNorm(prev->arm_mat).inverse(); // create the ogre bone gkBone* bone = m_skeleton->createBone(cur->name); if (parent) bone->setParent(parent); gkMatrix4 bind = parBind * gkMathUtils::getFromFloatNorm(cur->arm_mat); gkQuaternion rot; gkVector3 loc, scl; gkMathUtils::extractTransformFast(bind, loc, rot, scl); if (rot.isNaN()) { rot = gkQuaternion(); scl = gkVector3(1, 1, 1); } bone->setRestPosition(gkTransformState(loc, rot, scl)); Blender::Bone* chi = static_cast<Blender::Bone*>(cur->childbase.first); while (chi) { // recurse buildBoneTree(chi, cur, bone); chi = chi->next; } }