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) 编辑 收藏
评论
Max的SDK就是渣到不行,文档不详细而且不知所云,函数名字起的也猜不出来是什么意思,一个函数一个函数试吧。
顺便问问稿费是多少啊?
不过还好的就是我有线人在AUTODESK
有问题随时能够问
唉,现在又卡在UV有flip或rotate的问题上了
稿费是编辑看你的文章的技术含量来定的。。。
上次CEGUI的我等了3个月才拿到350+
后来的C++的一篇至今没拿到。。。
所以一直没动力继续写。。。。。。
有篇文件打包的,改天花点时间写完了再去投投~
最近我也在想关于Ogre导出工具的问题。请问一下,在3ds Max建模时在模型上指定一个特殊点(比如人手胸前正中的点),导出时怎样导出这个特殊标记的点到文件中,想在导出的文件中保存那个点的坐标位置以便程序中使用。 谢啦:)
应该是想做RAID中怪物的打击点吧
你可以让美术多做一个小的cube放在该位置
取一个名字比如target point
然后输出只取其位置,或显示时跳过
是的,我原来也这么做的。可是那样就会多一个物体,感觉不方便。
是不是可以利用3ds max的setUserProp来添加一个属性,在导出时把这个属性也导出,程序就可以利用了。
你觉得呢?
我与你感觉相反
我觉得这样方便,美术可控性高
而不是通过setUserProp在现有的face上面做调整,有点过度设计
有时候最简洁的方法就是最好的
不要把简单的问题复杂化,那样最后吃苦头的还是自己