zoukankan      html  css  js  c++  java
  • 引擎设计跟踪(九.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

  • 相关阅读:
    python学习笔记——拾
    python学习笔记——玖
    Python 实现栈与队列
    Vijos1774 机器翻译 [模拟]
    Vijos1788 第K大 [模拟]
    Python 序列求和
    HDU 2102 A计划 DFS与BFS两种写法 [搜索]
    Python 多组输入
    Python 文件读写
    HDU 2068 RPG错排 [错排公式]
  • 原文地址:https://www.cnblogs.com/crazii/p/3024543.html
Copyright © 2011-2022 走看看