先站在巨人肩上看看纸娃娃。
首先是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
sceneNode->attachObject(clothEntity)
attachmentNodes->push_back(sceneNode)
attachmentNodes->push_back(weaponTag)
以上步骤,将武器和装备都添加到attachmentNodes列表中。
通过对attachmentNodes操作即可对所有挂接到模型上的物体进行位移,旋转,或者缩放。
最终成果
Avatar系统完善以后再发布代码