Ogre换装系统

角色换装作为游戏里一个古老而不可或缺的系统,各个引擎都有完备支持,Ogre也不例外。

         尽管网上一些讨论把Ogre换装说得讳莫如深,实际上它还是很简单的。早在05年提及这个问题时,sinbad也只是说了一句“use Entity::shareSkeletonInstanceWith”。

         游戏里的换装大致分为三类,下面逐一介绍其Ogre实现。

         一、更换纹理。这算是最简单的一类,顾名思义,更换材质的贴图即可。它在Ogre中的调用可能是这样的:

 

[cpp]  view plain copy
  1. body->getMaterial()->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("clothTexture");  

Ogre换装系统_第1张图片

更换纹理实现更换衣服

         二、挂接物体。此类应用多是将刚性、无形变的物体挂接到某个骨骼节点上,最常见的就是将武器挂接到手部骨骼,实现持握的效果。Ogre中调用如下:

 

[cpp]  view plain copy
  1. body->attachObjectToBone("handBone", weapon);  

 

挂接物体实现手持武器

         三、共享骨骼。这是最常被讨论的一个,要求模型共享一套骨骼。以戴手套为例,手套模型需要共享裸模的骨骼,任何时候都做一样的动作,如此表现为二者契合,以实现穿戴的效果。Ogre中使用如下调用:

 

[cpp]  view plain copy
  1. glove->shareSkeletonInstanceWith(body);  

 

         这类换装要求美术人员做绑定时使用同一套骨骼,最终导出的各个模型也应尽量指向相同的骨骼文件。如果美术指向了名字不同的骨骼,在共享前你得费心调用Mesh:: setSkeletonName()重新指定,始终保证两个模型使用的骨骼一致。这里不推荐使用_notifySkeleton(),略显暴力了。

 

共享骨骼实现手套、靴子与角色契合

         如果你碰巧也使用《火炬之光》的资源做实验,会发现有些手套模型竟然包含有身体,这样做的原因很多,防止两个模型契合处有明显接缝是其中之一。这时你需要在整合后隐藏那些多余的SubEntity,这并不困难,尝试过你便会明白。

         美好的事物理应简单。

 Ogre换装系统_第2张图片

你可能感兴趣的:(Ogre换装系统)