3DMax插件和它的3DXI接口
最近一直在搞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