引擎设计跟踪(九.2) 3DS MAX 导出插件 继续
先分享一个autodesk的导出教程文档
http://images.autodesk.com/adsk/files/3ds_max_game_export_programming_guide.doc
记录一下遇到的几个问题:
1.导出空间的问题.
IGameMesh::GetVertex() 可以选择导出对象空间还是世界空间的坐标.
本来以为对象空间是正确的选择.
后来发现,"对象空间"是指单个Node的对象空间,所以渲染出来的身体部件散乱分部在原点附近...
2.UV坐标的问题.
//coordinates IGameConversionManager* cm = GetConversionManager(); //Blade uses right handed coordinates, like OGL cm->SetCoordSystem( IGameConversionManager::IGAME_OGL );
本来使用如上方式(OGL的坐标系),但是发现V坐标反了,突然想起我的UV坐标系是DX的坐标系, (另外向量为行向量,矩阵为行主矩阵,旋转系是右手系)
但使用的是右手系, 只能通过UserCoord手动定义了,
////despite right handed coordinates, ////Blade uses consistent Direc3D style UV(texture coordinates) (images are flipped if needed) //UserCoord uc; //uc.rotation = 1;//right handed //uc.xAxis = 1; //right //uc.yAxis = 2; //up //uc.zAxis = 5; //out //uc.uAxis = 1; //right //uc.vAxis = 1; //down //cm->SetCoordSystem(IGameConversionManager::IGAME_USER); //cm->SetUserCoordSystem(uc);
结果发现uv坐标V值仍然是反向的. 甚至尝试直接用D3D坐标系,仍然如此.
最后只能手动修改V = 1.0 - v...
for(int ch = 0; ch < maxChannel; ++ch) { DWORD mapIndex[3]; mesh->GetMapFaceIndex(texMaps[ch], face->meshFaceIndex, mapIndex); Point3 uvw = mesh->GetMapVertex(texMaps[ch], mapIndex[k]); v.uv[ch] = Vector2(uvw.x, 1.0f - uvw.y); }
是我对Max SDK理解有误? 还是取UV的方法错了(还有一个方法是GetTexVertex() )? 但我的用法跟IGame的一样啊...
搞了一天没有任何收获,目前暂时的解决办法是: OGL坐标系+手动取反, 这样也勉强跟我的坐标系完全匹配.
3.导出贴图的问题
如果一个特定的Map直接包含对应的bitmap,这样导出没有问题,但是如果改Map有子Map,Max导出需要跳过去,
因为GetBitMapFileName返回的是乱字符串,这个之前没发现,后来参考MaxSDK的IGame的sample, 调用IsEntitySupported()即可.
但是目前包含子贴图的这个贴图项无法导出(暂时不做这个,没仔细研究, 可能需要跳过IGame,访问Max对象获取子贴图).
比如有一个max模型,材质中的NormalBump不是一个真正的贴图,点开后包含两项:Normal和Bump,Normal项才真正包含bitmap,目前处理方法是在Max里手动把子Map覆盖到父Map,这样可以导出.
4. 切空间计算的问题: 需要注意的是,同样需要翻转V纹理坐标.
还有一个问题,之前说的按UV镜像,把顶点分组的问题, 问题就是法线不能分组,分了以后焊接处的顶点有两个不同的法线,所以仍然有缝.
应该是焊接点处的顶点有唯一法线,而有不同的切线和副切线.
还有UV镜像相关的切空间问题.
虽然已经UV的镜像值,已经保存在quaternion的w分量中,而且导出过程中确实发现有uv镜像,但发现最后shader中的向量不需要按镜像取反.
因为模型和贴图是从别处获得的,而且目前不怎么懂3DS Max,所以猜测可能是法线贴图已经做了处理? 这个后面会继续研究下.
5.其他.
因为在准备写导出插件的时候,根本没有模型系统.所以其实是一边设计模型系统(文件格式,查看器,渲染管线集成等),一边做相关的导出插件.
没有骨骼动画的模型相对来说还是很好导出的,后面有空会继续研究骨骼动画的导出.
最后贴张导出后的渲染截图(diffuse+normal):
原始max模型在这里下载: http://www.cgmodel.cn/forum.php?mod=viewthread&tid=113044&highlight=%B4%BA%C0%F6