在使用maya导出插件多次失败之后,对导出插件存在的问题进行了一下总结:
MayaOGRE导出插件存在的问题:在模型制作过程中为了调节动画的方便,动画师往往会把一个模型分成多个部分进行操作,当模型分组后如一个人脸模型由眼睛、牙齿、口腔等部分构成,分别给上材质,直接使用Maya-OGRE导出插件导出会报错,使得导出的模型文件 *.mesh 中的动画不能直接在ogre中使用,如果强行控制动画会导致程序奔溃。其原因在于OGRE中的*.material文件描述的纹理与模型的对应关系混乱了,同时OGRE中的pose动画无法找到模型不同组之间的动画对应关系。对于如何解决上面的问题,我还在寻找答案中。
因为我程序中是使用maya2013建立的模型,而导出插件貌似只支持maya2011。因此,需要将2013的文件导入maya2011中,并保存成*.ma文件,再次打开保存好的文件,使用中的Ogre选项。
具体使用流程如下:
在OutPut Directory中输入“输出路径”
File Basename 输入你要生成的文件名称
然后点击一下
导出插件界面其他地方需要勾上的选项如图:
如果你的模型中除了顶点动画之外还有骨骼信息,就可以勾上
中的 Export skeleton
同时在
中勾上对应选项。
所有需要的选项都勾选上之后点击
点击上面图标之后maya就会产生相应的模型导出成功与否的信息如下图:
这个是maya的插件使用输出信息,当导出模型中含有动画信息的时候,上面的输出信息中有ERROR的话。在OGRE中使用就会导致程序奔溃。
当模型导出成功之后就可以再OGRE 中直接使用了。
将maya-ogre导出的文件分别对应放在如下文件夹中
OgreSDK_vc10_v1-7-4\media\models (*.mesh文件),
OgreSDK_vc10_v1-7-4\media\materials\scripts (*.material文件),
OgreSDK_vc10_v1-7-4\media\materials\textures (纹理文件如: jpg,bmp,png等等)
放好文件之后加载动画模型以及动画的流程如下:
1) 加载mesh纹理
2) 创建动画 createAnimation
3) 创建顶点轨迹跟踪 createVertexTrack
4) 创建顶点姿势关键帧 createVertexPoseKeyFrame, 只用了一个帧
5) 增加所有的姿势关联 addPoseReference
6) 关键帧的更新姿势关联 updatePoseReference
7) 调用动画状态的父通知来更新动画 getParent()->_notifyDirty();
在OGRE的FacialAnimation例子中,setupContent函数中一般进行各种初始化。
void setupContent(void)
{
// setup some basic lighting for our scene
mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
mSceneMgr->createLight()->setPosition(40, 100, 50);
//步骤1:
//mHeadMesh 是一个MeshPtr对象,用来后面创建mesh动画用. mHeadMesh = MeshManager::getSingleton().load("face.mesh", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
// 步骤2: createAnimation("Manual", 0);创建动画将其命名为Manual,并将长度初始化为0;
// 步骤3: createVertexTrack(1, VAT_POSE); 创建顶点动画迹(Track),这里只有针对索引值为0的Pose动画,故第一个参数为1[1], // 这些动画pose被定义在<poses>标签中,可以查看.mesh文件中的<poses>标签对应的内容
// 步骤4:createVertexPoseKeyFrame(0);创建手动动画,并将关键帧起始位置置为0
// *************************************
mManualKeyFrame = mHeadMesh->createAnimation("Manual", 0)->createVertexTrack(1, VAT_POSE)->createVertexPoseKeyFrame(0);
//mManualKeyFrame中添加自己定制的N个动画,个数不能超过定义的动画个数,那么界面上将出现相应数量的slider,
//步骤5:
//当前的人脸有7个动画
for (unsigned int i = 0; i <7; i++) mManualKeyFrame->addPoseReference(i, 0);
//创建模型实例
Entity* head = mSceneMgr->createEntity("Head", "face.mesh");
mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(0, -10, 0))->attachObject(head);
//从mesh中得到名为Manual的动画参数
mManualAnimState = head->getAnimationState("Manual"); Node *mNode = head->getParentNode();
//setYawPitchDist函数只有在CS_ORBIT模式下有效。
mCameraMan->setStyle(CS_ORBIT);
mCameraMan->setYawPitchDist(Radian(0), Radian(0), 130);
mTrayMgr->showCursor();
mFacialContral = new FacialContral(mManualKeyFrame,mManualAnimState,mNode);
mFacialContral->initKinect();
mPlayAnimation = false; // by default, the speaking animation is enabled
setupControls();
}
下面是步骤6和7:
void sliderMoved(OgreBites::Slider * slider)
{
// update the pose reference controlled by this slider
//步骤6:
mManualKeyFrame->updatePoseReference(StringConverter::parseInt(slider->getName().substr(4)), slider->getValue());
// dirty animation state since we're fudging this manually
//步骤7:
mManualAnimState->getParent()->_notifyDirty();
}
到这里为止 动画的导入就完成了。
当然,如果你还要使用kinect里面的动画单元(AU)对模型进行控制的话,你还需要建立与kinect人脸跟踪API提供的AU相对应的动画模型。
下面是SDK文档里面对它提供的表情动画单元的描述
AU Name and Value | Avatar Illustration | AU Value Interpretation |
Neutral Face (all AUs 0) |
|
|
AU0 – Upper Lip Raiser (In Candid3 this is AU10) |
| 0=neutral, covering teeth 1=showing teeth fully -1=maximal possible pushed down lip |
AU1 – Jaw Lowerer (In Candid3 this is AU26/27) |
| 0=closed 1=fully open -1= closed, like 0 |
AU2 – Lip Stretcher (In Candid3 this is AU20) |
| 0=neutral 1=fully stretched (joker’s smile) -0.5=rounded (pout) -1=fully rounded (kissing mouth) |
AU3 – Brow Lowerer (In Candid3 this is AU4) |
| 0=neutral -1=raised almost all the way +1=fully lowered (to the limit of the eyes) |
AU4 – Lip Corner Depressor (In Candid3 this is AU13/15) |
| 0=neutral -1=very happy smile +1=very sad frown |
AU5 – Outer Brow Raiser (In Candid3 this is AU2) |
| 0=neutral -1=fully lowered as a very sad face +1=raised as in an expression of deep surprise |
下面show一下自己做的结果。
上图做了一下嘴巴张开程度的对比
上图做了一下眉毛运动的对比
上图为嘴角的运动范围对比。