转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 系统软件 >> 正文
3ds Max Exporter------Skin Bone Animation         

3ds Max Exporter------Skin Bone Animation

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2034 更新时间:2009/4/25 0:44:42

//Frist processing bone weights
BOOL ProcessingBoneWeights(INode* pNode,INode* pRoot,BoneData* BD)
{
 if((!pNode)||(!IsMesh(pNode)))
  return FALSE;
 Modifier* pmf=GetPhysiqueMod(pNode);
 if(pmf)
  GetPhysiqueWeights(pNode, pRoot, pmf, BD);
 else
 { 
  pmf = GetSkinMod(pNode);
  if (pmf)
   GetSkinWeights(pNode,pMeshIdx,pRoot, pmf, BD);
  }
 int num=pNode->NumberOfChildren();
 for(int n=0;n<num;n++)
 {
  ProcessingBoneWeights(pNode->GetChildNode(n),pRoot,BD);
 }
 return TRUE;
}
//here just take with Physique and Skin Modify .... 
static Modifier* GetPhysiqueMod(INode* pNode)
{
 Object* pObj=pNode->GetObjectRef();
 if(!pObj)
  return NULL;
 while(pObj->SuperClassID()==GEN_DERIVOB_CLASS_ID)
 {
  IDerivedObject* pDerivedObj = static_cast<IDerivedObject*>(pObj);
  int  modStackIndex=0;
  while(modStackIndex<pDerivedObj->NumModifiers())
  {
   Modifier* mod=pDerivedObj->GetModifier(modStackIndex);
   if(mod->ClassID()==Class_ID(PHYSIQUE_CLASS_ID_A, PHYSIQUE_CLASS_ID_B))
    return mod;
   modStackIndex++;
  }
  pObj=pDerivedObj->GetObjRef();
 }
 return NULL;
}
static Modifier* GetSkinMod(INode* pNode)
{
 Object* pObj=pNode->GetObjectRef();
 if(!pObj)
  return NULL;
 while(pObj->SuperClassID()==GEN_DERIVOB_CLASS_ID)
 {
  IDerivedObject* pDerivedObj = static_cast<IDerivedObject*>(pObj);
  int  modStackIndex=0;
  while(modStackIndex<pDerivedObj->NumModifiers())
  {
   Modifier* mod=pDerivedObj->GetModifier(modStackIndex);
   if(mod->ClassID()==SKIN_CLASSID)
    return mod;
   modStackIndex++;
  }
  pObj=pDerivedObj->GetObjRef();
 }
 return NULL;
}
// Get an index from a node pointer
int GetBoneIndex(INode *pRoot, INode *pNode)
{
 if(!IsBone(pNode))
  return -1;

 int boneCount = 0;
 return RecursiveGetBoneIndex(pRoot, pNode, boneCount);
}
//if there is more than one mesh ,we will use pMeshIdx  
BOOL GetSkinWeights(INode* pNode,int* pMeshIdx,INode* pRoot,Modifier* pMod,BoneData* BD)
{
 ISkin* skin = (ISkin*)pMod->GetInterface(I_SKIN);
 if(skin)
 {
  ISkinContextData* skincontext = skin->GetContextInterface(pNode);
  if(skincontext)
  {
   int numVert=skincontext->GetNumPoints();
   for(int i=0;i<numVert;i++)
   {
    int numBones=skincontext->GetNumAssignedBones(i);
    for(int j=0;j<numBones;j++)
    {
     INode* bone=skin->GetBone(skincontext->GetAssignedBone(i,j));//do not use j,but use GetAssignedBone(i,j)
     int boneIdx;
     if(bone)
     { 
      boneIdx=GetBoneIndex(pRoot, bone);
      if(boneIdx==-1)
       continue;
     }
     else
      continue;
      
     BoneWeight_hdr wData;
     wData.meshIdx=*pMeshIdx;
     wData.vertIdx=i;
     wData.weight=skincontext->GetBoneWeight(i,j);
     bool notfound = true;  
     for(int v=0;notfound&&v<BD[boneIdx].weightVect.size();v++)
     {
      if(BD[boneIdx].weightVect[v].vertIdx==wData.vertIdx&&BD[boneIdx].weightVect[v].meshIdx==wData.meshIdx)
      {
       BD[boneIdx].weightVect[v].weight += wData.weight;
       notfound = false;
      }
     }
     if(notfound)
     {
      BD[boneIdx].weightVect.push_back(wData);
      BD[boneIdx].boneHdr.vertexCnt=BD[boneIdx].weightVect.size();
     } 
    }
   }
    
  }
  pMod->ReleaseInterface(I_SKIN, skin);
 }
 return TRUE;
}
BOOL GetPhysiqueWeights(INode *pNode, int* pMeshIdx,INode *pRoot, Modifier *pMod, BoneData *BD)
{
 IPhysiqueExport* phyInterface=(IPhysiqueExport*)pMod->GetInterface(I_PHYINTERFACE);
 if(phyInterface)
 {
  // create a ModContext Export Interface for the specific node of the Physique Modifier
  IPhyContextExport *modContextInt = (IPhyContextExport*)phyInterface->GetContextInterface(pNode);
  // needed by vertex interface (only Rigid one supported for now)
  modContextInt->ConvertToRigid(TRUE);
  // more than a single bone per vertex
  modContextInt->AllowBlending(TRUE);
  if(modContextInt)
  {
   int totalVtx=modContextInt->GetNumberVertices();
   for(int i=0;i<totalVtx;i++)
   {
    IPhyVertexExport* vtxInterface=(IPhyVertexExport*)modContextInt->GetVertexInterface(i);
    if(vtxInterface)
    {
     int vertType=vtxInterface->GetVertexType();
     if(vertType==RIGID_TYPE)
     {
      INode* boneNode=((IPhyRigidVertex*)vtxInterface)->GetNode();
      int boneIdx=GetBoneIndex(pRoot, boneNode);
      BoneWeight_hdr wData;
      wData.meshIdx=*pMeshIdx;
      wData.vertIdx=i;
      wData.weight=1.0f;
      BD[boneIdx].weightVect.push_back(wData);
      BD[boneIdx].boneHdr.vertexCnt=BD[boneIdx].weightVect.size();
     } 
     else if(vertType==RIGID_BLENDED_TYPE)
     {
      IPhyBlendedRigidVertex *vtxBlendedInt = (IPhyBlendedRigidVertex*)vtxInterface;
      for(int j=0;j<vtxBlendedInt->GetNumberNodes();j++)
      {
       INode* boneNode=vtxBlendedInt->GetNode(j);
       int boneIdx=GetBoneIndex(pRoot, boneNode);
       BoneWeight_hdr wData;
       wData.meshIdx=*pMeshIdx;
      

[1] [2]  下一页


[MySql]mysql max 版本如何修改默认字符集。  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台