OGRE中表情动画导入存在的问题

来源:互联网 发布:淘宝上卖盗版书的店铺 编辑:程序博客网 时间:2024/06/06 14:06

在使用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 scenemSceneMgr->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 enabledsetupControls();}

                下面是步骤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一下自己做的结果。

 

       上图做了一下嘴巴张开程度的对比

 

        上图做了一下眉毛运动的对比

        上图为嘴角的运动范围对比。