[SheRO].rsm模型文件完美渲染

關於.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
offsetMT:節點自身的最初變換矩陣,包括翻轉與平移
pos :平移向量
rotangle:繞任意向量旋轉的角度
rotaxis:旋轉向量
scale:比例變換向量
 

好了,接下來我們看看只有一個節點的情況,整個矩陣變換是什麼

矩陣變換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文件的確是個頭疼的東西,網上開源資料全有錯誤,而且那些矩陣變換看着你肯定會頭暈。所以分享了自己這個比較標準點的參考資料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章