引擎设计跟踪(九.2) 3DS MAX 导出插件 继续
先分享一个autodesk的导出教程文档
http://images.autodesk.com/adsk/files/3ds_max_game_export_programming_guide.doc
记录一下遇到的几个问题:
1.导出空间的问题.
IGameMesh::GetVertex() 可以选择导出对象空间还是世界空间的坐标.
本来以为对象空间是正确的选择.
后来发现,"对象空间"是指单个Node的对象空间,所以渲染出来的身体部件散乱分部在原点附近...
2.UV坐标的问题.
//coordinatesIGameConversionManager* cm = GetConversionManager();//Blade uses right handed coordinates, like OGLcm->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
转载于:https://www.cnblogs.com/crazii/archive/2013/04/18/3024543.html
引擎设计跟踪(九.2) 3DS MAX 导出插件 继续相关推荐
- 引擎设计跟踪(九.14.2i) Android GLES 3.0 完善
最近把渲染设备对应的GLES的API填上了. 主要有IRenderDevice/IShader/ITexture/IGraphicsResourceManager/IIndexBuffer/IVert ...
- 引擎设计跟踪(九.6) 地形最近更新
1.FastDXT 前两天没事profiling了一下,发现squish的DXT压缩速度很慢,单块压缩速度是解压的10倍... 网上搜了一个用SSE intrinsics优化的DXT压缩库(好像Id ...
- 引擎设计跟踪(九.8) Gizmo helper实现与多国语言
最近把gizmo helper的绘制做好了. 1.为了复用代码,写了utility来创建sphere, cube, cylinder, plane, ring(line), circle(solid) ...
- 3D MAX导出插件编写
文章版权归博客园 BigCoder所有,转载请于明显位置标明原文作者及出处,以示尊重!! 原文出处:http://www.cnblogs.com/csyisong/archive/2009/09/01 ...
- 3D MAX导出插件编写I
3D MAX导出插件编写I 想想研究3D MAX 的SDK已经有了不短的时间,真正算起来也有两个月了吧,但是讲到收获,确实不大.作为一个3D MAX二次开发的学习者,我首先学习了导出插件的编写,网上有 ...
- D5周报|第8期:D5画质优化版本即将上线;3Ds Max 工作流插件重构内测、Revit 工作流教程
地产营销动画丨作者:闪电 作者:JJJ-YS02 Araroaca + 大楼|作者:dnmorato 盘山公路|作者:LINK 盘山公路|作者:dreamboxdesignstudio 该场景由 @曲 ...
- 3ds max导出fbx模型出现破裂
自己做的模型在3ds max中模型动作显示正常,导出fbx后模型莫名其妙破裂了,如下图 为此找了好几种方法,都无法解决,最后瞎试 层次面板,仅影响轴,重置轴,再导出fbx格式,就解决了.具体为什么可以 ...
- 3DS MAX导出M3G动画
1.用3D Studio Max或者Maya的插件h3texporter导出的文件格式是.h3t的文件..h3t的文件是一个文本文件,可以用记事本,写字板或者其他的文本编辑工具打开..h3t文件描述了 ...
- 3ds Max导出带贴图的obj模型
先找一块大理石地板的贴图 接着在3ds Max中画一个最简单的立方体,要薄一点像地板 点击菜单栏中的渲染,选择精简材质编辑器 在材质编辑器面板里随便点一个球,然后按照下图所示的1和2步骤分别点击漫反射 ...
- 关于Max导出插件的七七八八
介绍几个东西,如何在Max插件里使用.net来做界面,怎么为插件增加maxScript的脚本接口以及命令行参数来直接测试导出插件. 先说第一个,首先是visualstudio的项目设置里开启clr的支 ...
最新文章
- 为什么indexOf在数组IE8上不起作用?
- SAP实战中Submit的常见用法-调用标准程序
- java方法6_6. java 方法
- java第一章Java语言概述和入门程序
- android ColorDrawable的使用
- canvas简单五子棋
- 从一个简单的Java单例示例谈谈并发
- Druid 配置及内置监控,Web页面查看监控内容 【我改】
- ActiveMQ 权限
- java图片色差_java – JPEG图像的颜色错误
- pythonclass使用教程_【Python 1-15】Python手把手教程之——详解类Class以及类的使用...
- 计算机模拟的实例,计算机模拟实例模拟的概念-read.ppt
- 压缩软件Bandizip
- 餐厅预订APP多少钱一套?餐厅预订APP如何收费?
- 每周一品 · 扬声器(喇叭)中的磁性材料
- 百度目前开放的AI平台
- Lecture 07 08 RNN---Hinton课程
- 把超星阅览器的文件转换为PDF文件
- java 文件打包下载
- Kubernetes - Kubernetes 组件