換裝系統(tǒng)是每款網(wǎng)游中都必須實(shí)現(xiàn)的東西,原理說(shuō)白了也很簡(jiǎn)單,就是把裝備(通常是Mesh)掛接到人物的骨骼上,根據(jù)角色需要可選擇不同的裝備替換,Ogre中的骨骼動(dòng)畫(huà)系統(tǒng)中可以直接把一個(gè)Object掛接到骨骼上,但問(wèn)題是Ogre中一個(gè)Object只能掛到一塊骨骼上去,對(duì)于一些覆蓋面廣的裝備(如衣服)則不那么適用,所以O(shè)gre中不能通過(guò)這種直接的方式實(shí)現(xiàn)換裝,目前一般用以下幾種方法實(shí)現(xiàn).
一.對(duì)于可選裝備比較少的游戲,用這種方式實(shí)現(xiàn)非常簡(jiǎn)單實(shí)用:一開(kāi)始做人物模型的時(shí)候就把所有可能的裝備都跟人物一起導(dǎo)出為一個(gè)模型(所有裝備的骨骼權(quán)重都已調(diào)好),然后就可以通過(guò)SubEntity::setVisible函數(shù)設(shè)置需要的裝備可見(jiàn),不需要的裝備則隱去,這樣就實(shí)現(xiàn)了換裝的效果,這種方式對(duì)于裝備少的游戲比較適用,需要做的事情也很少,但如果你有成百上千的裝備要替換,這顯然不是個(gè)好辦法.
二.如果你裝備很多,那你就該考慮這種方法了:首先你必須把裝備導(dǎo)出為一個(gè)獨(dú)立的模型,這個(gè)模型還必須帶有骨骼,然后你就可以在代碼中通過(guò)調(diào)用Entity::shareSkeletonInstanceWith(Entity* entity)函數(shù)與人物共享骨骼,這里有幾個(gè)需要注意的地方,首先調(diào)用shareSkeletonInstanceWith函數(shù)要求共享骨骼的兩個(gè)Entity有相同的Skeleton,否則會(huì)拋出異常,也就是每個(gè)裝備都必須有一副跟主角一樣的骨骼,我們當(dāng)然不可能要求美工為每個(gè)裝備模型都做一副骨骼,所以只能在程序中手動(dòng)設(shè)置裝備的Skeleton跟主角的一樣,Ogre中提供了這個(gè)函數(shù):void Mesh::_notifySkeleton(SkeletonPtr& pSkel)可完成此操作,之后就可以調(diào)用shareSkeletonInstanceWith函數(shù)了.然后第二點(diǎn)需要注意的是裝備頂點(diǎn)權(quán)重問(wèn)題,我們必須具體指定此裝備跟哪幾根骨骼有關(guān),以及權(quán)重的分布,由于裝備擁有跟主角一樣的一套完整骨骼,因此不能影響到此裝備骨骼的權(quán)重必須設(shè)為0,否則裝備會(huì)散架,設(shè)置頂點(diǎn)權(quán)重可以調(diào)用void SubMesh::addBoneAssignment(const VertexBoneAssignment& vertBoneAssign)函數(shù).
似乎還有種方法是通過(guò)刪除人物帶的想更換的裝備SubMesh的iterator,之后再換上新的裝備SubMesh并重建SubEntityList來(lái)實(shí)現(xiàn)換裝的方法,但個(gè)人不推薦這種方法,太暴力了,而且頻繁的刪除重建操作也會(huì)造成效率低下.
通過(guò)共享骨骼的方式實(shí)現(xiàn),下面的盒子跟人物肩膀處的兩跟骨骼有關(guān)
2010.6.1 補(bǔ)充:本人對(duì)閱讀本文引起的任何直接或間接的后果概不負(fù)責(zé),覺(jué)得不對(duì)可以不看,任何疑問(wèn)請(qǐng)自行解決,也別找我要代碼,因?yàn)槲乙矝](méi)有了