古人云:君子生非异也,善假于物也
数据导出是一个繁琐的工作,于是,有了IGame这个解脱程序员的东西:
关于IGame
IGame是Max提供给游戏开发的一个用于导入导出的接口。在Max的help里面这个东西叫做3ds Max Data Ex
如果有经历过用MAX SDK导出关键帧动画以及骨骼动画,Skin,Modifier等等的经历的话,我想肯定会记忆深刻。IGame的作用就是把复杂的Max的概念简化,封装。
建立IGame:
IGameScene * m_pIgame= GetIGameInterface()
坐标系:
前面我提到的导出的文章都没有提这个问题,所有的坐标都是用的MAX本身的坐标系,及Z轴向上。在游戏中坐标系可能千奇百怪,IGame考虑到这点提供了指定坐标系的功能:
IGameConversionManager * cm = GetConversionManager();
cm->SetCoordSystem(IGameConversionManager::IGAME_D3D);
m_pIgame->InitialiseIGame(true);
其中IGAME_D3D就是指定的坐标系,同样也可以自定义坐标系:
UserCoord WhackySystem = {
1, //Right Handed
1, //X axis goes right
4, //Y Axis goes in
3, //Z Axis goes down.
0, //U
1, //V
};
IGameConversionManager * cm = GetConversionManager();
cm->SetUserCoordSystem(WhackySystem);
IGame要点:
GetTopLevelNodeCount:获得顶级的Node数目,不包括Root。
GetRootMaterialCount:获得所有的材质数目
GetTopLevelNode(i):获得指定Node
GetIGameObject():获得Node中包含的Object
GetLocalTM():获得Node的矩阵
IGameMesh ::GetVertex(i):获得顶点
IGameMesh ::GetFace(i);获得面
IGameMesh ::GetNormal(i):获得法线
至于其他就依次类推了,从函数的命名,到概念的简化,无疑都比原始的MAXSDK进步了很多。有了IGame接口,大大减轻了程序员的负担,我相信没有哪个愿意把大把的时间花在数据的导入导出上。
花了几十分钟简单的试用了一下IGame写了个小小的导出插件,只导出了顶点,面,材质,法线以及矩阵,感觉基本上没什么阻碍。不过IGame最大的功能还是用在骨骼动画,关键帧动画上面,仅仅只是简单的几何体导出并不能体现出IGame的功效。
最后还是附上代码和工程吧。不得不提示一下,由于种种曲折的原因,我这个工程是在MAX8 SDK和 MAX8下 完成的,其间省略上千字曲折的经历,不过在MAX9下应该可以通过编译。编译完成后,记得在Max 中选择Export Selected而不是试用Export。
DownLoad Source