OGRE实现纸娃娃系统
先站在巨人肩上看看紙娃娃。
首先是WOW
WOW中裝備有分幾種,
武器,護肩,頭盔,盾牌,箭袋是掛接在關鍵骨骼上的
OGRE的話就是用Entity::attachObjectToBone() ,這個函數實現。
沒什么難點。有個問題就是需要找到身體某個部分關鍵骨骼的名字,比如要掛接在肩部,就必須知道肩部關鍵骨骼的名字。
用WOW Model Viewer 導出的.Mesh并沒有包含關鍵骨骼的信息(所有骨骼的名稱都是按順序排列的數字),要自己找。
這里有魔獸世界M2文件的定義
http://www.madx.dk/wowdev/wiki/index.php?title=M2/WotLK#Bones
根據這個寫了個程序分析關鍵骨骼。整出一個關鍵骨骼名稱列表。
下面是女血精靈的:
一個27個關鍵骨骼
骨骼含義 關鍵骨骼名稱
ArmL 28
ArmR 29
ShoulderL 19
ShoulderR 22
SpineLow 2
Waist 3
Head 27
Jaw 41
IndexFingerR 72
MiddleFingerR 73
PinkyFingerR 75
RingFingerR 74
ThumbR 71
IndexFingerL 67
MiddleFingerL 68
PinkyFingerL 70
RingFingerL 69
ThumbL 66
$BTH 140
$CSR 154
$CSL 153
_Breath 139
_Name 86
_NameMount 89
$CHD 141
$CCH 133
Root 1
如果要把武器掛接到手上,代碼如下
Ogre::TagPoint* tag = mEntity->attachObjectToBone("75", entity);
mEntity是人物模型實體,entity是武器模型實體,"75"是無名指的骨骼名稱。
Ogre::TagPoint 繼承自Ogre::Node,對tag進行操作就可以對掛接到物體進行位移,旋轉。
WOW中其他裝備都是用貼圖實現。
如圖,長筒靴對人物小腿的幾何形狀有影響。
每個人物模型針對長筒靴,手套這類裝備都做了額外一些模型,當發現是長筒靴時,小腿的模型就會切換成長筒靴模型,然后對小腿進行貼圖。
現在分析天龍八部和火炬之光,
天龍八部和火炬之光的avatar系統與WOW不同,畢竟用來OGRE,一些方法都是貼近OGRE。
天龍八部中武器也是掛接在關鍵骨骼上,而頭盔,衣服則是做了額外的模型,然后與人物模型共享骨骼。
用OGRE::shareSkeletonInstanceWith()這個函數實現。
shareSkeletonInstanceWith并不會改變你模型的坐標,美工導出時模型坐標是什么,顯示時坐標是什么。所以導出模型時就必須對裝備的坐標進行調整,帽子就要調整到頭部的高度。
這種方法有個缺點,如果人物從成人變成一個蘿莉,裝備的坐標就不相符了。
最后是RealXtend的Avatar系統。
針對上面所說的缺點,realXtend 中的 Avatar系統提供了一個比較好的解決方案。
Ogre::TagPoint* weaponTag = mEntity->attachObjectToBone("75", weaponEntity);
以上我們掛接武器的方法。
clothEntity->shareSkeletonInstanceWith(humanEntity);
以上是裝備共享骨骼的方法。
由于Ogre::TagPoint繼承自Node,而Ogre::SceneNode也繼承自Node。
因此定義一個Node* 的列表
std::vector<Node*> attachmentNodes
sceneNode->attachObject(clothEntity)
attachmentNodes->push_back(sceneNode)
attachmentNodes->push_back(weaponTag)
以上步驟,將武器和裝備都添加到attachmentNodes列表中。
通過對attachmentNodes操作即可對所有掛接到模型上的物體進行位移,旋轉,或者縮放。
最終成果
Avatar系統完善以后再發布代碼
總結
以上是生活随笔為你收集整理的OGRE实现纸娃娃系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: The Shapes of CSS
- 下一篇: x01.wos: 纸娃娃系统