3DMax插件和它的3DXI接口

3DXI是3DMax提供给游戏开发者的一套数据读取接口,之前它被称作为IGame。

最近一直在搞Ogre的插件
相关的文档都很少
我相信搞这个的人很多,但是有时间整理拿出来共享的资料实在是太少
Ogre自带的maxExplorer只是xml格式,二进制数据的导出竟然未完成,汗一个
Lexi的搞得很复杂,还绑上了Ogre本身,通过Ogre的mesh接口导出,阅读和使用上很麻烦

我的方法很土
用oFusion导出,然后通过Ogre的序列化接口跟踪
参考mesh的format文件头描述信息,编写自己的格式导出

遇到的问题很多
像是3DXI本身的接口说明就不太清晰
例如一个TexCoord就有几种方式可以读取,却没有注明,当GetActiveMapChannelNum().Count() == 1时应该用GetTexVertex,否则应该用GetMapFaceIndex或GetMapVertex
带来了不小的困扰
另外,3DXI只负责收集数据,当遇到MultiMaterial时,手动拆分和复制vertices的工作还是要自行解决
google到的资料上,前辈们都说自从有了3DXI,挺对得起这张脸,俺没有之前旧接口的切身体验,么有感觉

总的来说,Ogre本身对于plugin的资料不是太多,加上3DXI SDK的说明中还存在有少量的BUG,所以走了不少弯路

大家有空可以看看现在max9 sdk里 Programmer's Guide里 Programming with 3dxi里的IGameMesh有一段代码

//gm is a pointer to IGameMesh
if(exportMappingChannel)
{
    Tab<int> mapNums = gm->GetActiveMapChannelNum();
    int mapCount = mapNums.Count();
 
    for(int i=0;i < mapCount;i++)
        int vCount = gm->GetNumberOfMapVerts(mapNums[i]);
    buf.printf("%d",vCount);
    for(int j=0;j<vCount;j++)
    {
        vert = NULL;
        Point3 v;
        if(gm->GetMapVertex(mapNums[i],j,v))
        {
            //use data here
        }
    }
    int fCount = gm->GetNumberOfFaces();
 
    for(int k=0;k<fCount;k++)
    {
        DWORD v[3];
        gm->GetMapFaceIndex(mapNums[i],k,v);
        //use data here
    }
}

这一段是从之前老的SDK中同样地方的一段代码

 

 //gm is a pointer to IGameMesh

 if(exportMappingChannel)

 {

  Tab<int> mapNums = gm->GetActiveMapChannelNum();

  int mapCount = mapNums.Count();

  

  for(int i=0;i < mapCount;i++)

  {

      

   int vCount = gm->GetNumberOfMapVerts(mapNums[i]);

   buf.printf("%d",vCount);

   for(int j=0;j<vCount;j++)

   {

    vert = NULL;

    Point3 v;

    if(gm->GetMapVertex(mapNums[i],j,v))

    {

     //use data here

    }

  

   }

   int fCount = gm->GetNumberOfFaces();

  

   for(int k=0;k<fCount;k++)

   {

    DWORD  v[3];

    gm->GetMapFaceIndex(mapNums[i],k,v);

    //use data here

   }

  }

 }


大家来找岔~

目前我的插件中,关于mesh这边的导出工作基本上已经完成
1. position, diffuse, normal, texcoordx的导出
2. multi material的处理
3. 最小化vertex复制/拆分
4. material及sub-material数据导出
5. texture自动复制

接下来准备做mesh关键帧动画和骨骼动画这一块
待完成后我会抽时间写篇文章出来共大家共享
或者先提交给《游戏创造》骗点稿费过来花花也未尝不是一个好主意^_^Y

posted @ 2007-11-27 10:46  千里马肝  阅读(2896)  评论(6编辑  收藏  举报