网上常说ogre+oFusion+3dsMax是开源游戏编程的黄金组合,但是在刚接触时我就遇到了一个问题,用oFusion导出的.mesh只能和一个.skeleton文件绑定,而一个.skeleton中只只能包含一个动作,这问题就大了,一般游戏,一个模型都应该能在n个动作中切换,为了解决这个问题,我在ogre3d.org的论坛中泡了好一阵子,终于找到了解决方案,为了让后来人能够少走弯路,总结如下:
(1)创建mesh
(2)载入2个与.mesh相关的.skeleton文件(一般需要从3dsMax中导出2次)
(3)两两合并
(4)接着重复步骤2,3
(5)更新mesh的骨骼列表
源代码如下:
//已经载入的.mesh文件(step.1)
Entity* tmpEnt = mSceneMgr->getEntity( idName );
//其中的两个.skeleton的合并(step.2-3)
SkeletonPtr pSkeletonMaster = SkeletonManager::getSingleton().getByName( anim_1.c_str() );
SkeletonPtr pSkeletonSearch = SkeletonManager::getSingleton().load( anim_2.c_str(), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
Skeleton::BoneHandleMap boneHandleMap;
pSkeletonSearch->_buildMapBoneByHandle( pSkeletonSearch.getPointer(), boneHandleMap );
pSkeletonMaster->_mergeSkeletonAnimations( pSkeletonSearch.getPointer(), boneHandleMap );
SkeletonManager::getSingleton().remove( anim_2.c_str() );
//如还有多余的动画,继续合并(step.4)
//更新.mesh相应骨骼状态
tmpEnt->getSkeleton()->_refreshAnimationState( tmpEnt->getAllAnimationStates() );
通过上面的步骤,你就可以把多次导出的骨骼合并在一起,并可以简单的转换了!!
Enjoy!!!