转自:http://blog.csdn.net/trcj1/article/details/6607209
Ogre换装系统
角色换装作为游戏里一个古老而不可或缺的系统,各个引擎都有完备支持,Ogre也不例外。
尽管网上一些讨论把Ogre换装说得讳莫如深,实际上它还是很简单的。早在05年提及这个问题时,sinbad也只是说了一句“use Entity::shareSkeletonInstanceWith”。
游戏里的换装大致分为三类,下面逐一介绍其Ogre实现。
一、更换纹理。这算是最简单的一类,顾名思义,更换材质的贴图即可。它在Ogre中的调用可能是这样的:
- body->getMaterial()->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("clothTexture");
更换纹理实现更换衣服
二、挂接物体。此类应用多是将刚性、无形变的物体挂接到某个骨骼节点上,最常见的就是将武器挂接到手部骨骼,实现持握的效果。Ogre中调用如下:
- body->attachObjectToBone("handBone", weapon);
挂接物体实现手持武器
三、共享骨骼。这是最常被讨论的一个,要求模型共享一套骨骼。以戴手套为例,手套模型需要共享裸模的骨骼,任何时候都做一样的动作,如此表现为二者契合,以实现穿戴的效果。Ogre中使用如下调用:
- glove->shareSkeletonInstanceWith(body);
这类换装要求美术人员做绑定时使用同一套骨骼,最终导出的各个模型也应尽量指向相同的骨骼文件。如果美术指向了名字不同的骨骼,在共享前你得费心调用Mesh:: setSkeletonName()重新指定,始终保证两个模型使用的骨骼一致。这里不推荐使用_notifySkeleton(),略显暴力了。
共享骨骼实现手套、靴子与角色契合
如果你碰巧也使用《火炬之光》的资源做实验,会发现有些手套模型竟然包含有身体,这样做的原因很多,防止两个模型契合处有明显接缝是其中之一。这时你需要在整合后隐藏那些多余的SubEntity,这并不困难,尝试过你便会明白。
美好的事物理应简单。