• 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

  • 相关阅读:
    浏览器渲染原理
    React Router
    链式 add 函数
    函数防抖和函数节流
    242. 有效的字母异位词
    faker 生成模拟数据
    A 第五课 二叉树与图
    使用递归解决问题
    A 第四课 递归_回溯_分治
    A 第三课 贪心算法
  • 原文地址:https://www.cnblogs.com/oiramario/p/973722.html
Copyright © 2020-2023  润新知