搞图形的人都知道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. 美团外卖iOS App冷启动治理

    一.背景 冷启动时长是App性能的重要指标,作为用户体验的第一道“门”,直接决定着用户对App的第一印象.美团外卖iOS客户端从2013年11月开始,历经几十个版本的迭代开发,产品形态不断完善,业务功 ...

  2. Oracle win32_11gR2_client.zip

    先将下载下来的ZIP文件解压,并运行setup.exe文件. 第一步:选择管理员(0MB)(A),然后点击下一步 第二步:选择语言,点击下一步 第三步:选择安装的路径,然后点击下一步 第四步:执行到第 ...

  3. Atcoder681 Typical DP Contest E.数 数位dp

    写什么递归....非递归多好写 令$f[i][j]$表示前$i$位的和在模$d$意义下为$j$的方案数,然后转移即可 复杂度$O(10000 * 100 * 10)$ 注意非递归建议高位摆第$n$位. ...

  4. [BZOJ5287][HNOI2018]毒瘤(虚树DP)

    暴力枚举非树边取值做DP可得75. 注意到每次枚举出一个容斥状态的时候,都要做大量重复操作. 建立虚树,预处理出虚树上两点间的转移系数.也可动态DP解决. 树上倍增.动态DP.虚树DP似乎是这种问题的 ...

  5. 转 TCP/IP的三次握手与四次挥手详解

    TCP((Transmission Control Protocol)传输控制协议,是一个面向连接的协议.在运用此协议进行数据传输前都会进行连接的建立工作(三次握手):当数据传输完毕,连接的双方都会通 ...

  6. Apache之.htaccess备忘录(二)

    博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助的可以关注我. 转载请注明"深蓝的镰刀" 书接上回,<Apache之.htaccess备忘录(一)& ...

  7. elasticsearch 亿级数据检索案例与原理

    版权说明: 本文章版权归本人及博客园共同所有,转载请标明原文出处( https://www.cnblogs.com/mikevictor07/p/10006553.html ),以下内容为个人理解,仅 ...

  8. HDU 5694 BD String 迭代

    BD String 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5694 Description Problem Description 众所周知, ...

  9. 使用TensorFlow低级别的API进行编程

    Tensorflow的低级API要使用张量(Tensor).图(Graph).会话(Session)等来进行编程.虽然从一定程度上来看使用低级的API非常的繁重,但是它能够帮助我们更好的理解Tenso ...

  10. Matlab 常用绘图指令(二维图形)

    使用matlab的时候常常会忘掉一些指令,每次都要重新查找,挺麻烦的,这里收集一些常用的绘图指令,供自己和大家以后方便查找和使用. 1.例子-包含了常用绘图命令 clear clc %%数据准备 x ...