关于.rsm文件的解析网上有很多资料,本身数据没有错,但是,大家应该知道,素材数据破解只是第一步,还有更重要的一步是如何使用这些数据。.rsm文件令人头疼的是,它自身带有一些变换矩阵,而且其自身模型原点也未知,要想把它渲染到我们3D引擎的坐标系下,必须把这些变换矩阵的用途及顺序搞清楚,还要把它的模型原点猜准。本文主要就是讨论这2点。
在往下之前,我想特别感谢下Borf(http://www.borf.info/ ),关注RO客户端破解的肯定知道他吧,他发布了首个RO地图编辑器BrowEdit,很强大的东西,造福了N多私服搭建者,可惜它并没有开源。上周,抱着尝试的心态给他写了封邮件,没想到他Gtalk马上跟我聊起来了。。非常Nice的一个GG,聊了很多,大家有空可以去玩玩他写的一个网页网游:http://sagramore.com/main.html 。最后他很乐意的给了我BrowEdit渲染rsm的.cpp/.h文件,激动万分,马上开始尝试,结果发现更是头大,他的矩阵变换变得复杂得多了。而且是OpenGL的,我应用到自己的D3D下,错误反而更多了。郁闷了,接下来的1个多星期都是寝食难安状态,程序员都是这样,有一个BUG没搞定,那在搞定之前他肯定是焦虑的。
然后我意识到这个只能靠自己了,重新研究了.rsm文件各个版本的格式,查资料更详细的了解了OPenGL与D3D的差异,然后就是一个个的比较各个.rsm文件的差异性并作出合理的假设(这个很重要,搞破解的无一例外都是这样的思路)还好总算是出成果了,我目前敢99.9%保证这就是RO原客户端rsm的矩阵变换。而且这也是目前最简单,最明了的矩阵变换。虽然browedit也是完美渲染,但是他的矩阵变换绕了很大一圈,明显是暴力尝试出来的。好了,开始切入正题了。
首先,把一个3d model 文件渲染到3D世界里,通常的做法是:
(模型文件)---解析--->(3D Model)-----矩阵变换---->(世界坐标)
这没有什么问题,但是模型文件可以用多种编辑器设计,其自身坐标系有差异,如果把这种差异性提取出来保存在模型文件中,那么这种事交给美工就行了,程序员不需要改动代码。而且多了一层变换,以后维护肯定更方便。所以一种更好的办法是:
(模型文件)-----解析&&矩阵变换1---->(3D Model)-----矩阵变换2---->(世界坐标)
RO正是采用的第2种方法,不过矩阵变换2保存在.rsw文件里的,因为矩阵变换2是与地图编辑器相关的,与模型编辑器无关。
我们来看看rsm文件里每个节点都保存了哪些矩阵变换:
offsetMT 48
pos 12
rotangle 4
rotaxis 12
scale 12
好了,接下来我们看看只有一个节点的情况,整个矩阵变换是什么
矩阵变换1 = Mat(offsetMT) * Mat(scale) * Mat(rotangle&&rotaxis) * Mat(pos)
【囧,补充一点,本人疏忽,Mat(rotangle&&rotaxis)矩阵,当该节点有RotFrame时,Mat(rotangle&&rotaxis)应该为Mat(RotFrame)】
渲染时,我们只需要矩阵变换1 * 矩阵变换2就行了么?并不是的,RO渲染还需要计算BoundingBox。
BoundingBox很好计算,就是把所有顶点*矩阵变换1,然后得到。
然后根据BoundingBox得到另一个偏移向量:posCenter,该向量 = BoundingBox顶面的中心坐标取负。
所以最终的渲染变换是:矩阵变换1 * Mat(posCenter) * 矩阵变换2。
以上是只有一个节点的情况,多个节点时,子节点还需要父节点的变换矩阵。
这时,我们需要多定义一个:
ParentMat = Mat(scale) * Mat(rotangle&&rotaxis) * Mat(pos) 这些向量都是父节点的哈。
所以,此时:
矩阵变换1 = Mat(offsetMT) * Mat(scale) * Mat(rotangle&&rotaxis) * Mat(pos) * ParentMat 。
注意此时的BoundingBox也变了,但是计算并不难,用矩阵变换1求出所有子节点的BoundingBox后,再把这些BoundingBox合并为一个BoundingBox,再求出Mat(posCenter),注意此时父节点的Mat(posCenter) 也要修订为这个。
然后自然也得出子节点的渲染变换了:矩阵变换1 * Mat(posCenter) * 矩阵变换2。注意它的矩阵变换1 是参考了父节点的矩阵变换哈,公式在上面。
Over了,依然没有源码参考,不过快了,作者在继续完善中。
总之,希望对一些开发者有帮助,因为RO这个.rsm文件的确是个头疼的东西,网上开源资料全有错误,而且那些矩阵变换看着你肯定会头晕。所以分享了自己这个比较标准点的参考资料。