1. 程式人生 > >Ogre 天龍八部地形 Heightmap(高度圖)+GridInfo(地表資訊)初步結果

Ogre 天龍八部地形 Heightmap(高度圖)+GridInfo(地表資訊)初步結果

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

剛研究出的天龍八部的地形高度和GridInfo,正確的載入了高度圖和地表資訊,可以看出場景的大致樣子了:)
第一張圖是我自己載入的 明教的光明殿地形,第二張是天龍八部遊戲中的場景,可以看出差距啊:)


經過分析天龍八部場景的實現方式,我用了跟天龍八部實現方式完全相同的做法,載入了HeightMap和GridInfo檔案,並且可以解析多個版本的GridInfo結構。
以下是使用Ogre渲染出來的天龍八部的地形:
這是明教光明殿

這張是天龍寺

這張是無量山

場景裡沒有放入mesh,所以不大容易看出來 ,不過載入mesh就簡單了,我將盡快放出新版本截圖!



TerrainLiquid是用來做湖水,海水,熔岩之類效果的。最多有兩層,一層放貼圖動畫,另一層作alpah值。
天龍八部TerrainLiquid的實現實在有點那個-3-





對Model的支援只是最簡單的載入mesh,還沒有加入動畫:)

WCollision是天龍八部遊戲中用來實現“碰撞”的。下圖粉紅色區域即為WCollision資訊



橋的下面是熔漿,不允許行走的,但是可以從橋上通過,而天龍裡不是根據橋這個mesh,來實時檢測玩家所應該處的高度,而是通過WCollision裡所記錄的資訊來判斷的。
這一點很容易驗證,我們把.scene檔案裡所有的mesh刪掉,玩家依然站在了正確的高度,如下圖所示

如果把WCollision檔案刪掉,玩家就會站到熔漿裡了:)
因為地表法線算的有問題,一直沒察覺,所以燈光這部分繞了點彎路,呵呵!現在場景可漂亮多了:)

這是明教光明殿,燈光比較多

因為還沒有加入lightmap所以跟天龍八部遊戲本身的效果,還是有點差別:)

lightmap(光照圖)其實是很簡單的,加一層UV就可以了,不過由於圖片太大,不提高貼圖的取樣率就會變的很模糊,但是提高取樣率就會大大降低效率-3-,天龍八部的設定bin/System.cfg裡View_LightmapQuality估計就是做這個用的。但是陰影嘛,模糊就模糊沒什麼關係:)

還是光明殿


大理

婚禮場景


.Frame檔案是配合.Model檔案一起使用,來實現場景節點動畫的(NodeAnimationTrack)。比如鳥兒的飛行軌跡,魚群的活動路線,隨風搖曳的燈籠等等。

     是否分析天龍八部的Frame檔案格式,我醞釀了兩三天,因為推測該檔案是3DSMAX或Maya的匯出外掛匯出的(後面會給出推測的理由),其格式應該是公開的,但是Google了數次未果,只好手動分析了。

     Frame檔案開頭部分有明顯的[Serializer_v1.10]標記,顯然是使用Ogre的Serializer類儲存的,且存在很多重複的模型,比如天龍寺的鈴鐺,完全可以使用1個mesh就可以了,但是資源裡共有4個mesh,分別命名為鈴鐺1,鈴鐺2,鈴鐺3,鈴鐺4,大理派主殿就更多了,有十幾個鈴鐺。-3- 其實所有的鈴鐺,樣子都一樣,只是相對於中心點(0,0,0點)的偏移不同。這就證明了上面的推測,如果不是直接從MAX或Maya匯出的Frame動畫,而是自己做一個編輯器來製作動畫。那麼使用1個放在0,0,0點的鈴鐺就夠了。而且Frame檔案中儲存的幀的資訊不可以直接使用,還是要經過計算-3-,計算的方法完全是為了將就多個不同偏移的mesh。

     這個外掛估計跟OFusion類似,應該提供兩種版本的Frame檔案,一種是xml文字結構的,一種是Serializer二進位制結構的。(純屬猜測)

下面是截圖(動畫用截圖不好表現啊- -)
天龍寺的鈴鐺

飛翔的小鳥

遨遊的魚群

TerrainLiquid加入法線可以說是最簡單的了,所有法線一律平行y軸,連算都不用算。現在水面看起來跟遊戲裡一個德行了-3-

天龍八部的粒子特效做得非常漂亮,漂亮的背後一定有著複雜的實現:),以下是我總結的天龍對Ogre粒子系統的改動內容:

添加發射器1個
PolarEmitter

新增影響器6個
ColourFading
MeshAnimationAffector
MeshRotator
Movement
Revolution
ScaleInterpolator

新增的Renderer 2個
mesh
texcoord_billboard

因為我要實現場景中所使用的粒子效果,對於其它的,比如技能裡所使用的粒子則暫時不予考慮。
所以對273個場景檔案所使用粒子做了統計如下:

粒子名,使用個數
a_y_dali_05, 1
baofu, 18
caihong, 16
cangying, 11
chuansongdian_01, 1
chuansongdian_03, 11
chuansongdian_04, 10
chuansongdian_05, 1
chuansongmen_03, 14
cj_ba01_big, 10
cj_ba03, 2
cj_denglong_020, 13
cj_ghuochong, 4
cj_huo, 37
cj_kvk01, 1
cj_kvk02, 1
cj_kvk_03, 1
cj_kvkfeng01, 7
cj_xing, 11
foguang, 7
guihun_01, 5
huahuo, 35
huangsha, 110
huoba01, 2624
huoba01_big, 555
huoba02, 615
huoba03, 7
huoba04, 5
huohua_011, 9
huoxing, 1886
huoxing7mi, 6
jian01, 18
jiujiaozhengqi, 93
jiujiaozhengqi_01, 48
kuangdui01, 37
kuangdui02, 354
kuangdui03, 7
kuangdui05, 1
kuangdui_hong, 249
kuangdui_hong01, 259
kuangdui_lan, 270
kuangdui_lan01, 365
kuangdui_lv, 154
kuangdui_lv01, 68
langhua, 86
langhua01, 119
langhua02, 76
penhuo, 120
penhuo_01, 41
penjianyanjiang, 6
pubushuihua_02, 1420
pubushuihua_03, 582
rain, 23
rain_xiao, 6
shandong_01, 18
shedengguangzhu, 93
shedengguangzhu_01, 64
shedengguangzhu_02, 56
shedengguangzhu_03, 17
shedengguangzhu_04, 5
shedengguangzhu_05, 1
shidenglong_01, 167
shidenglong_010, 124
shidenglong_02, 86
shidenglong_020, 19
shuidi, 44
shuidi_01, 158
shuidi_lv_01, 1
shuimianlianyi, 156
snow, 12
sunny01, 23
sunny02, 17
sunny03, 6
sunny04, 45
taohua, 528
taohua_big, 83
wenquan, 95
wenquanzhengqi, 73
xiangluyan, 77
xiangluyan_01, 51
yan01, 96
yan01_da, 4
yanjiangshuihua_001, 46
yanjiangwuqi, 211
yanjiangzhengqi, 34
yezi, 136
yezi01, 186
yezi01_, 2
yezi01__big, 6
yezi01_big, 179
yezi01_i02, 2
yezi01_ihua_02, 20
yezi01_ngdian_04, 12
yezi_big, 24
yezihuyang01, 7
yinghuochong, 1689
yun, 717
yun001, 65
yun002, 103
yun02, 6
yun_01, 17
yun_02, 1
ziti01, 40

然後是對這102種粒子詳細資訊的統計:

發射器型別,使用個數
Box, 64
Point, 3
PolarEmitter, 4
Ring, 21

影響器型別,使用個數
ColourFading, 83
MeshAnimationAffector, 1
Movement, 39
Revolution, 11
Rotator, 71
ScaleInterpolator, 69

Render型別,使用個數
billboard, 87
mesh, 1
texcoord_billboard, 4

並不存在的粒子
cj_ba01_big
cj_ba03
cj_denglong_020
cj_ghuochong
cj_huo
cj_xing
yezi01_
yezi01__big
yezi01_i02
yezi01_ihua_02
yezi01_ngdian_04

發現場景中使用的這些粒子幾乎將天龍新增的那部分全部使用了-3-,本來還想偷懶一下呢,看來全部得實現啊!其中huoba01使用的最多,我就以這個為例子,做出來的效果和遊戲中的差不多,如下圖:
遊戲中的效果

檢視器中的效果

因為我的號級別比較低,很多特效沒有在遊戲裡看到過,做起來還是比較困難的,不過好在引數名都能比較清晰的反映它們的作用,所以猜一猜用途,大致還是能實現的,只不過可能很多細節跟遊戲中不盡相同,需要再做調整-3-


btw:餿狐在09年3月3號左右已經將all.material,all.particle等檔案加密了,真囧~~~

從TLSceneViewer中匯出,然後用TLSceneImporter匯入就可以了,哈哈,效果如下:







話說3DS MAX SDK真不討人喜歡

天龍八部的地表做法與9年前的紅警2的極為類似。都是由很多個格子(Title)組成,每個格子四個點,兩個三角形。
下面我先給出天龍八部GridInfo檔案格式,然後再簡要介紹一下實現方式。
[GridInfo file format]
DWORD     nVersion     版本號
int     nWidth          地表寬度(橫向格子數)
int     nHeight         地表高度(縱向格子數)

如果版本號大於0x00100002則後面跟一個bool型資料,否則不存在這個bool型資料
bool     bLarge         GridInfo是否為7位元組型別

如果bLarge存在並且值為1,則其後跟的是7位元組版本否則為5位元組版本
[GridInfo 5位元組版本]
BYTE     nFirstLayer     該值即為pixelmap的索引(第幾個pixelmap)
BYTE     nFirstLayerOp     對nFirstLayer的操作,可能取值如下:
     0 不變
     1 水平翻轉
     2 垂直翻轉
     4 向左旋轉90度
     8 對角線映象
     注意:這些值之間是可以取和的,比如9=1+8說明圖片需要水平翻轉和對角線映象

BYTE     nSecondLayer     該值為pixelmap的索引
     天龍八部的地表最多可以兩層融合,說白了就是每個點裡有兩層UV,這裡為第二層pixelmap的索引
BYTE     nSecondLayerOp     對nSecondLayer的操作,取值同nFirstLayerOp

BYTE     IndexOrder     對格子的三角形的操作,可能取值如下
     0正常三角形索引
     1不同於正常的三角形索引
     如下圖,該值主要用在水池啊一類的地方,如果三角形索引不變的話,水池四個角中的兩個角就不對了。



本文出自www.MobileGameBase.com
[GridInfo 7位元組版本]
short     nFirstLayer
     讀取後需交換高8位與低8位的值,需做如下操作
     nFirstLayer = (nFirstLayer<<8)|(nFirstLayer>>8)
BYTE     nFirstLayerOp
short     nSecondLayer
     同nFirstLayer,需交換高8位與低8位的值
BYTE     nSecondLayerOp
BYTE     IndexOrder

實現方式:
想象一下如果你設好每個點的位置,UV,法線,材質,整個場景不就出來了嘛。
現在的問題是如何操作這些VertexData和IndexData,其實Ogre本身就有大量的類直接這兩者,比如Mesh,StaticGeometry,ManualObject等等。不過前陣子突然發現有位朋友寫了個魔獸3地形的例子,使用Ogre實現的,寫得非常好,呵呵,我就借花獻佛推薦大家看這個例子吧,相信你應該有點感覺:)

btw:據說《成吉思汗OL》是用Ogre做的,而且還是在《天龍八部OL》的基礎上改的,場景方面做的更好。因為成吉思汗的製作人就是原來天龍八部的製作人,呵呵,國內遊戲圈這麼小,訊息渠道我多少有一點。有興趣的朋友研究下吧:)

Ogre場景編輯器基本功能已經完成:)
1.類似於3DSMAX的攝像機,非常方便美術操作
2.動態重新整理素材資源
3.支援所有操作任意步撤消
4.可以匯入並編輯天龍八部的地表(通過TLSceneViewer匯出)
5.可以輕鬆繪製特定圖案,繪製時自動融合

6.可以對地表應用特定格式(Word的格式畫刷)
7.多種方式調整地表高度,製作斜坡,懸崖等非常方便

8.支援動態光源,以及光源的特定變化
9.可以很方便的擺放物體,通過快捷鍵和滑鼠既可以直觀的調整物體位置、旋轉、縮放,也可以在場景元件介面裡做特定調整

10.可以自動很快速的生成非常優化的導航網格(Navigation Mesh, Navmesh)

生成的導航網格與天龍八部類似,已經非常優化了。
天龍八部很早就已經放棄Region的方式尋路,改用了.path檔案,也就是導航網格,同時繼續沿用WCollision,但是WCollision僅只是用來調整人物高度的,並沒有參與尋路。

僅做了一點修改:匯入後自動顯示貼圖。3DSMAX SDK比我想象中的麻煩,所以耽擱了兩天:)
OgreImporter使用例項 將《天龍八部Online》的模型匯入到3DS MAX中就可以自由編輯了。

另外介紹一下如何檢視MAX裡的材質,如下圖:)


注:OgreImporter不是僅可以匯入天龍八部的模型,任何Ogre的mesh檔案都可以匯入。
龍八部場景匯入外掛(TLSceneImporter)可以將天龍八部的場景匯入到3DSMAX中。匯入後場景就可以自由編輯了:)

使用方法:
1.解壓到3DSMAX9的安裝目錄。
2.用天龍八部場景檢視器將需要的場景檔案匯出成.pxa檔案。
3.執行3DSMAX,選擇“File->Import...”,檔案型別選擇“TLBB Scene Pack (*PAX)”,再選擇之前匯出的.pxa檔案,點選“開啟”。
4.設定介面中“Output Folder”是指貼圖的輸出目錄,確定後等待進度條完成,場景即匯入成功。




 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述