示例#1
0
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);
}
示例#2
0
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;
	}
}
示例#3
0
文件: Assimp.cpp 项目: Inzuki/Game
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);
			}
		}
	}
};
示例#4
0
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;
	}
}