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 on 2007-11-27 10:46 千里马肝 阅读(658) 评论(6)  编辑 收藏

  回复  引用  查看    
2007-11-27 11:57 | ChenA      
Max的SDK就是渣到不行,文档不详细而且不知所云,函数名字起的也猜不出来是什么意思,一个函数一个函数试吧。
顺便问问稿费是多少啊?

  回复  引用  查看    
2007-11-27 23:19 | 千里马肝 [未注册用户]
不过还好的就是我有线人在AUTODESK
有问题随时能够问

唉,现在又卡在UV有flip或rotate的问题上了

稿费是编辑看你的文章的技术含量来定的。。。
上次CEGUI的我等了3个月才拿到350+
后来的C++的一篇至今没拿到。。。
所以一直没动力继续写。。。。。。

有篇文件打包的,改天花点时间写完了再去投投~
  回复  引用  查看    
2007-11-27 23:56 | ArenAK      
最近我也在想关于Ogre导出工具的问题。请问一下,在3ds Max建模时在模型上指定一个特殊点(比如人手胸前正中的点),导出时怎样导出这个特殊标记的点到文件中,想在导出的文件中保存那个点的坐标位置以便程序中使用。 谢啦:)
  回复  引用  查看    
2007-11-29 10:15 | 千里马肝 [未注册用户]
应该是想做RAID中怪物的打击点吧
你可以让美术多做一个小的cube放在该位置
取一个名字比如target point
然后输出只取其位置,或显示时跳过

  回复  引用  查看    
2007-12-08 12:56 | ArenAK      
是的,我原来也这么做的。可是那样就会多一个物体,感觉不方便。
是不是可以利用3ds max的setUserProp来添加一个属性,在导出时把这个属性也导出,程序就可以利用了。
你觉得呢?
  回复  引用  查看    
2007-12-11 08:58 | 千里马肝 [未注册用户]
我与你感觉相反
我觉得这样方便,美术可控性高
而不是通过setUserProp在现有的face上面做调整,有点过度设计

有时候最简洁的方法就是最好的
不要把简单的问题复杂化,那样最后吃苦头的还是自己

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
向地震灾区捐赠爱心
 
 
<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

与我互动

常用链接

留言簿(32)

我参与的团队

我的标签

随笔档案(288)

文章档案(1)

好友

搜索

  •  

最新评论

阅读排行榜

评论排行榜