我所遭遇过的中间件--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.使用合并工具,将线条和地面进行合并成为一个物 ...
随机推荐
- 高仿360界面的实现(用纯XML和脚本实现)
源码下载:360UI 本项目XML的桌面渲染依赖GQT开源项目(请感兴趣的朋友加入QQ讨论群:101189702,在群共享文件里下载GQT源码),以下是360界面实现的全部XML代码,所有的代码都在3 ...
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- 一、redis系列之基础知识与centos下环境搭建
1. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的ke ...
- python opencv3 向图像里写字
git:https://github.com/linyi0604/Computer-Vision # coding:utf-8 import cv2 img = cv2.imread(".. ...
- CentOS7.4 关闭firewall防火墙,改用iptables
1.关闭默认的firewall防火墙 systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service ...
- 2018-2019-2 20162318《网络对抗技术》Exp3 免杀原理与实践
一.实验内容 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion),加壳工具),使用shellcode编程 2.通过组合应用各种技术实现恶意代码免杀(如果成 ...
- [HihoCoder1596]Beautiful Sequence
题目大意: \(n(n\le60)\)个数\(A_{1\sim n}\),将这些数随机打乱,问最后构成的数列满足对于所有的\(2\le i\le n-1\),都有\(2A_i\le A_{i-1}+A ...
- python调用matlab
官网链接: https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python ...
- python开发_tkinter_单选菜单_不可用菜单操作
在之前的blog中有提到python的tkinter中的菜单操作 python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 python开发_tkinter_窗口控件_自 ...
- 数据表-java类的映射
1.一个数据表对应一个java类 2.数据表的字段对应java类的属性 3.一对多的数据表关系 一方用一个java对象表示 多方用一个java对象数组表示 4.多对多的数据表关系:采用中间表,将多对多 ...