搞图形的人都知道3D MAX,而3D MAX SDK就是在该软件基础上的一套软件开发包.至于该不该将3D MAX SDK归纳为中间件,不要在意这细节了,反正我觉得SDK和中间件就差不多是一个东西.实际上我看网上有些文章将中间件与插件混为一谈.在我看来,中间件是用于做软件开发的,插件则是已经开发好的软件产品.对于插件我们经常听到的是浏览器插件,OCX插件.游戏外挂也属于插件的一种.插件嵌入到另外的执行程序中,或扩展其功能,或篡改其功能,或进行恶意破坏.一般情况下,插件并不好写,它需要其宿主程序提供一套接口支持.例如我写的软件:WhyEngine游戏合集就有点插件的思想.

扯了些插件,貌似有点跑题了.其实我使用3D MAX SDK所做的事件就是写MAX导出插件.MAX导出插件只是其插件的一种类型,有导出也就会有导入插件.我感觉很多MAX自身的功能也是用插件写的.3D MAX SDK是一套博大精深的开发包.我虽然搞过很长时间的MAX导出插件,但却不敢说自己熟悉MAX SDK,甚至不敢说了解.只要看过MAXSDK的文档就会发现,这东西是个硕大的坑.我之所以将MAX SDK放到"我所遭遇过的中间件"这个系列文章的最后,又之所以迟迟没有写它,就是因为这个原因.

使用中间件是件苦逼的事情,写插件也是件苦逼的事情,那么最苦逼的事情莫过于使用MAX SDK写MAX插件了.你想:使用中间件是软件开发的底层一头被堵住了,插件是软件运行的一头被堵住了,那么使用MAX SDK写MAX插件绝对是件两头堵的事情.写的时侯总是处处受限,有数不尽的潜规则要注意,有数不尽的坑要去躲避,总会有莫名其妙又难以调试的BUG出现.有没有比写MAX插件更苦逼的事情?有,是维护一套已经开发好的,架构十分混乱的MAX插件.这就是我刚入行时干的事情.

话说这套MAX导出插件的历史可以追溯到十年前,期间有若干个人接手.给我的感觉是每当来了新人之后,就将它转交给新人去打理,当新人上手后,就迫不急待地交给更新的人去打理.而我运气不太好,前前后后维护了它两年多.这套代码给我的感觉就是,维护性极差,每次要修改功能,添加功能什么的,都非常费事.就连查找一个具体功能的代码都要找很久.在我维护的期间经历了无数次的BUG修改,无数次的功能添加,无数次与美术的扯皮.期间也无数次的想将其完全重构一遍,但始终没能实现.2012年的时候,重写引擎特效模块,于是也顺代着新写了一个特效导出的MAX插件,也算是给自己一个交待.这个特效导出的MAX插件是个很全面的东西,包括MESH模型导出,骨骼动画,材质动画,BILBOARD,刀光,拖尾,帖地.

与MAX SDK相应的还有一套MAX脚本系统.给我的感觉是MAX SDK能做的事情,MAX脚本全能做.同样可以使用MAX脚本写MAX导出插件.有些事情使用MAX脚本更合适,比如写一套文件批量导出的逻辑,还有MAX脚本的属性是可以保存到.max文件中的.当模型后在导出时需要设置一些选项,在没有使用MAX脚本之前,美术人员每次导出时都需要设置一遍导出配置,而使用了MAX脚本便可以将这些配置保存到max文件中.

最后写点对大家有用的东西:

(1)

MAX插件的界面不能使用: #include <afxwin.h>  而是使用: #include <atlwin.h> 也就是对话框对象的类定义为: class CDlgColorSet : public CDialogImpl<CDlgColorSet>而不是: class CDlgColorSet : public CDialog. 至于为什么,我也不知道,我写的MFC的程序也不多,总之就当它是龟腚吧.

(2)
     MAX中的数据组成为NODE的树形结构,遍历其数据元素时,从根结点开始,写个递归一层层的处理.而MAX提供给用户两套访问其数据的接口,一套是早期的,另一套是以IGame开头的.我印象中两套接口返回的数据可能会有不同,具体什么情况记不清了.我记得MAX8版本中IGame的返回切线副法线数据的接口是错的,之后的版本就好了.

(3)
      MAX骨骼动作建模.从MAX中拖BIP角色其骨骼的父子关系有几根是错的.如果动作文件中不记录每一帧的骨骼位移数据,则会出现错误.比如两个肩膀的父骨骼应该是胸,而MAX却给的是脖子.腰部的父子关系也不对,这个不容易发现.这个问题的解决办法是写一个简单的MAX脚本,重设这几根骨骼的父子关系.当然也可以在导出插件中用程序写死.

(4)

MAX中为Z轴向上的右手坐标系,而通常游戏中使用Y轴向上的左手坐标系,所以在导出文件要做坐标系变换.
      MAX的导出的骨骼其本地坐标系是左手还是右手?这个让我觉得很混乱,因为我发现导出的骨骼有左手坐标系的,也有右手坐标系的.因为这个问题不影响其对蒙皮的渲染,所以我也没去深究.

(5)
      从IGame接口获得一个MESH顶点的法线,切线,副法线.这三个是正交的吗?不是,我的测试发现,只有切线,副法线是正交的.一直觉得可以将顶点数据的副法线删去,但始终没办法删除.

(6)
      骨骼动作帧的导出,调用MAX的接口,是做采样,通常每秒采样30帧.游戏中对采样出的动作通常做线性插值处理,而在MAX中动作的变换为非线性的,所有总有人说游戏中的动作没有MAX的有力度,反正我是看不出来.这是个很难搞的问题,曾经纠结过很久,最后也不了了之.

我所遭遇过的中间件--3D MAX SDK的更多相关文章

  1. 我所遭遇过的中间件--VTK

    我所遭遇过的中间件--VTK Vtk是我接触的第一款软件开发包,它引导我对图形学的入门.我是先学的VTK,后学的OpenGL和D3D.VTK是专为图形学开发,特点是接口清晰,好上手,又含有大量的图像处 ...

  2. 3D MAX在立方体的使用

    3D  MAX不会“复用”立方体的顶点-----它直接计算该立方体需要12个三角面,每个三角面需要3个顶点,这样一共是36个顶点-----其实有大量顶点的位置是相同的,但3D  MAX不管这些.它认为 ...

  3. 3d max export for unity3d

    3d max export for unity3d @by 广州小龙 1.单位问题 建模的时候,设置unity的Units Setup的单位是Meters,导出FBX文件的时候,单位为厘米(Centi ...

  4. 3D MAX脚本教程1

    本文转载自http://jiurong995294.blog.163.com/blog/static/195133243201192531546490/ 方便以后须要时候使用 为什么要学习3D MAX ...

  5. 3d角色模型 制作 全过程 。3d max 。3d role model making process.3d Max

    3d角色模型 制作 全过程 .3d max 3d role model making process.3 d Max 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134 ...

  6. 转:3d max 2013 安装教程,凭着一种互联网精神提供给广大朋友

    看到有人在ps区咨询如何安装3d max教程,当你进行第一步之前,请先断开网络连接第一步:运行安装程序 第二步:接受安装协议,点击下一步会提示输入序列号 第三步:你会看到已经安装完成了的界面 第四部: ...

  7. 3D max导出的设置选项

    一3D max导出的设置选项

  8. 在3D Max中查看模型引用的贴图

    需求 假如在Max中有一个模型,想查看贴图 操作步骤 1.右上角点击 2.在弹出材质编辑器中 点击吸管 3.把吸管点击在角色模型上,然后点击M 4.点击查看图像 5.就能查看到模型使用的贴图

  9. 3d max地形建造

    这里来记录一下max里面建造一个地形. 1.创建一个平面,调节平面的属性,包括长宽,和分段 2.然后建造一个道路 然后选择样条线工具,调节线条的轮廓. 3.使用合并工具,将线条和地面进行合并成为一个物 ...

随机推荐

  1. 基于 Laravel 开发博客应用系列 —— 设置 Windows 本地开发环境

    1.安装原生PHP 下载/解压 PHP 到 PHP 下载页下载最新版本的 PHP(如果使用 Laravel 5.1 的话需要 PHP 5.5.9+ 版本),解压下载的zip格式压缩文件到本地目录,比如 ...

  2. R语言实战(六)重抽样与自助法

    本文对应<R语言实战>第12章:重抽样与自助法 之前学习的基本统计分析.回归分析.方差分析,是假定观测数据抽样自正态分布或者其他性质较好的理论分布,进而进行的假设检验和总体参数的置信区间估 ...

  3. Java 中的定时任务(一)

    定时任务简单来说就是在指定时间,指定的频率来执行一个方法,而在 Java 中我们又该如何实现呢? 想来主要有 3 种方式,最原始的方式肯定是开启一个线程,让它睡一会跑一次睡一会跑一次这也就达到了定频率 ...

  4. Stream中reduce()使用记录

    一.reduce()使用1.第一个参数是我们给出的初值,2.第二个参数是累加器,可以自己用实现接口完成想要的操作,这里使用Bigdecimal的add方法 3.最后reduce会返回计算后的结果 Bi ...

  5. http远程调用原生get、post模板

    一.get方法 package lq.httpclient.method; import java.io.BufferedReader; import java.io.IOException; imp ...

  6. 用 Python 实现一个大数据搜索引擎

    搜索是大数据领域里常见的需求.Splunk和ELK分别是该领域在非开源和开源领域里的领导者.本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理. 布隆过滤器 ...

  7. touchscreem

    <触摸屏种类> 常见 电阻式触摸屏 电容式触摸屏 不常见 红外线技术触摸屏 表面声波触摸屏 适量压力传感触摸屏 <原理分析> 电阻式触摸屏 如图所示,在屏幕的上下和左右加上一个 ...

  8. POI2018

    [BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...

  9. PAT甲级1111. Online Map

    PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...

  10. List常用子类的特点

    ArrayList:    底层数据结构是数组,查询快,增删慢   线程不安全, 效率较高 Vector   底层数据结构是数组,查询快,增删慢   线程安全, 效率较低 LinkedList   底 ...