我所遭遇过的中间件--3D MAX SDK
搞图形的人都知道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的更多相关文章
- 我所遭遇过的中间件--VTK
我所遭遇过的中间件--VTK Vtk是我接触的第一款软件开发包,它引导我对图形学的入门.我是先学的VTK,后学的OpenGL和D3D.VTK是专为图形学开发,特点是接口清晰,好上手,又含有大量的图像处 ...
- 3D MAX在立方体的使用
3D MAX不会“复用”立方体的顶点-----它直接计算该立方体需要12个三角面,每个三角面需要3个顶点,这样一共是36个顶点-----其实有大量顶点的位置是相同的,但3D MAX不管这些.它认为 ...
- 3d max export for unity3d
3d max export for unity3d @by 广州小龙 1.单位问题 建模的时候,设置unity的Units Setup的单位是Meters,导出FBX文件的时候,单位为厘米(Centi ...
- 3D MAX脚本教程1
本文转载自http://jiurong995294.blog.163.com/blog/static/195133243201192531546490/ 方便以后须要时候使用 为什么要学习3D MAX ...
- 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 ...
- 转:3d max 2013 安装教程,凭着一种互联网精神提供给广大朋友
看到有人在ps区咨询如何安装3d max教程,当你进行第一步之前,请先断开网络连接第一步:运行安装程序 第二步:接受安装协议,点击下一步会提示输入序列号 第三步:你会看到已经安装完成了的界面 第四部: ...
- 3D max导出的设置选项
一3D max导出的设置选项
- 在3D Max中查看模型引用的贴图
需求 假如在Max中有一个模型,想查看贴图 操作步骤 1.右上角点击 2.在弹出材质编辑器中 点击吸管 3.把吸管点击在角色模型上,然后点击M 4.点击查看图像 5.就能查看到模型使用的贴图
- 3d max地形建造
这里来记录一下max里面建造一个地形. 1.创建一个平面,调节平面的属性,包括长宽,和分段 2.然后建造一个道路 然后选择样条线工具,调节线条的轮廓. 3.使用合并工具,将线条和地面进行合并成为一个物 ...
随机推荐
- mysql proxy代理安装和配置
mysql proxy代理安装和配置 服务器说明: 192.168.1.219 mysql主库(主从复制) 192.168.1.177 mysql从库(主从复制) 192.168.1.202 ...
- 【*】Redis常见问题汇总
1.什么是Redis? Redis是一个开源.高性能.基于键值对的缓存与存储系统. 2.Redis相比memcached有哪些优势? 劣势:Redis是单线程,Memcached是多线程,在多核服务器 ...
- JFinal 3.3 学习 -- JFinalConfig (配置web项目)
开篇 概述 基于JFinal的web项目需要创建一个继承自JFinalConfig类的子类,该类用于对整个web项目进行配置. JFinalConfig子类需要实现六个抽象方法,如下所示: publ ...
- [java] java中的初始化顺序
先看程序: package init_cls; class A{ {System.out.println("i am in the class A!");} static { Sy ...
- github安装k8s
转:https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/#23镜像版本怎么整 一.环境准备 首先环境还是三台虚拟机,虚拟机 ...
- 洛谷.4525.[模板]自适应辛普森法1(Simpson积分)
题目链接 Simpson积分公式:\[\int_a^bf(x)dx\approx\frac{b-a}{6}\left[f(a)+f(b)+4f(\frac{a+b}{2})\right]\] 推导过程 ...
- 【初识】KMP算法入门
举个例子 模式串S:a s d a s d a s d f a s d 匹配串T:a s d a s d f 如果使用朴素匹配算法—— 1 2 3 4 5 6 8 9 a s d a s d a s ...
- python开发_tkinter_小球完全弹性碰撞游戏_源码下载
完成这个小球的完全弹性碰撞游戏灵感来自于: 下面是我花了一周下班时间所编写的一个小球完全弹性碰撞游戏: 游戏初始化状态: 最下面的游标和修改小球的移动速度 ====================== ...
- 可变参数模拟printf()函数实现一个my_print()函数以及调用可变参数需注意的陷阱
入栈规则 可变参数函数的实现与函数调用的栈帧结构是密切相关的.所以在我们实现可变参数之前,先得搞清楚 栈是怎样传参的. 正常情况下,C的函数参数入栈遵照__stdcall规则, 它是从右到左的,即函数 ...
- MAX II Device Compatibility with 5.0-V CMOS Devices
http://www.altera.com/literature/hb/max2/max2_mii51009.pdf The open-drain pin never drives high, onl ...