魔兽世界角色换装

转载自“小文的自家田地”,向作者致敬!

基于WowModelView的代码分析魔兽的换装流程,给程序包括美术提示avatar换装思路。

魔兽角色系统设计原则:

1.一套模型多套纹理贴图
2.某一角色只有一个模型, 该模型包含了各种服装搭配所需的Mesh, 是该角色网格全集. 当用户换装时,会动态显示、隐藏一些网格细节。
比如发型:有短发、中发、长发;37开、辫子等。这些都是已经做好跟Skin一起导出。只是运行时根据用户配置决定显示具体发型对应的网格。
3.基本角色模型不包括头盔、肩甲、盾牌等装饰品。

举HumanFemale角色为例:
1.一个HumanFemale Model,包括了所有服装配件用到的网格。
2. 总共有62部分组成。
3.为了提高效率,角色贴图只使用一张;服装配件用贴图叠加混合到基本身体贴图。
4.魔兽在贴图制作上都只用了半边,用镜像方式节省资源。
5.没有调整Material,皮肤及脸、发型等颜色的变化用更换纹理实现。这样做比较细腻。

HumanFemal角色纹理制作细节分析, 
1.角色纹理制作规则,分两大类:
   a.每个基本角色都有自己一套基本纹理资源目录。具体纹理资源分类见HumanFemal例子。
   b.所有角色共用的纹理资源。比如外衣、腰带、护腕等用到的纹理贴图。

2.HumanFemale特有的一套资源目录:
    Skin                    // 256*256, 10张(对应不同皮肤颜色)
    Face Style            // 
    Hair Style
    Hair Color
    Facial Feature
    Facial Color
    Skin是基本纹理(Tex0),其他所有纹理都要跟其混合。
    命名规则:HumanFemaleSkin00_00.blp …HumanFemaleSkin00_09.blp

3.Face Style 魔兽分成两部分FaceUpper、FaceLower
   FaceLower  128×64  张数=FaceStyleCount×SkinCount=14×10=140
   FaceUpper  128×32  张数=FaceStyleCount×SkinCount=14×10=140
   命名规则:HumanFemaleFaceLower00_00.blp …HumanFemaleFaceLower14_09.blp

4.Hair Style、Hair Color
   Hair Style:对应的是网格。有11种发型。也就是HumanFemale需制作11种发型网格,并跟角色一起导出。
   HairColor:HairMesh对应的纹理。有3种发型贴图:直发、微卷、卷。有10种颜色。
   HairColor纹理张数=HairColorCount×3=10×3=30;
   命名规则:Hair00_00.blp  …  Hair03..09.blp
   注意:Hair纹理Human男女共用。

5.Facial Feature、Facial Color
   Facial Feature用于表现角色脸部局部细节特征,如女性的耳环、闭环,男性的粗眉毛、胡子等。
   Facial Feature 用于决定哪些角色装饰网格可视。
   Facial Color 是Facial Feature对应的纹理。
   Facial Color纹理张数=FacialFeatureCount×9=7×9=63;
   命名规则:Facial00_00.blp  …  Facial06..09.blp

6.由以上统计,HumanFemale角色特有的纹理需 10+140+140+30+63 = 383张。

7.角色区域坐标(Skin0-Skin9纹理区域划分)
const CharRegionCoords regions[NUM_REGIONS] =
{
    {0, 0, 256, 256},    // base
    {0, 0, 128, 64},    // arm upper
    {0, 64, 128, 64},    // arm lower
    {0, 128, 128, 32},    // hand
    {0, 160, 128, 32},    // face upper
    {0, 192, 128, 64},    // face lower
    {128, 0, 128, 64},    // torso upper
    {128, 64, 128, 32},    // torso lower
    {128, 96, 128, 64}, // pelvis upper
    {128, 160, 128, 64},// pelvis lower
    {128, 224, 128, 32}    // foot
};

装备系统分析
1.魔兽世界有八种角色、每种角色分男女性别。
2.这里的装备不仅仅指刀剑等武器,还包括手套、盔甲、长袍等。
3.装备分类,部分装备每个角色各做一套,比如头盔做了16套。
4.部分装备,所有角色共用同一纹理。比如长袍、护腕等。
5.一套装备类型对应所有角色。也就是说下面的装备枚举类型适用所有角色。不存在特殊角色独有的装备。
    enum eCharSlots     // Character Equipment Slot
    {
        CS_HEAD,
        CS_NECK,
        CS_SHOULDER,
        CS_BOOTS,
        CS_BELT,
        CS_SHIRT,
        CS_PANTS,
        CS_CHEST,
        CS_BRACERS,
        CS_GLOVES,
        CS_HAND_RIGHT,
        CS_HAND_LEFT,
        CS_CAPE,
        CS_TABARD,
        CS_QUIVER,

        NUM_CHAR_SLOTS
    };
6.部分装备的纹理贴图要跟角色模型的纹理混合。
   比如Belt腰带就要混合到角色256*256贴图的CR_LEG_UPPER部分。
   比如Bracers护腕就要混合到角色256*256贴图的CR_ARM_LOWER部分。
   比如Cheat、Shirt装备就要跟角色多个区域混合。
7.简单装备用一张贴图,如护腕、腰带。复杂装备会用到多张贴图,如Shirt就要四张(用于跟角色纹理四个区域混合CR_ARM_UPPER、CR_ARM_LOWER、CR_TORSO_UPPER、CR_TORSO_LOWER)。


角色信息DB
魔兽使用dbc数据表形式存储各种信息配置。包括了角色基本纹理区域划分信息,装备跟纹理的对应信息。
ChrRaces.dbc
CharHairGeosets.dbc
CharSections.dbc
CharacterFacialHairStyles.dbc
HelmetGeosetVisData.dbc
ItemDisplayInfo.dbc
ItemVisuals.dbc
ItemVisualEffects.dbc
ItemSet.dbc
ItemClass.dbc
ItemSubClass.dbc
CharStartOutfit.dbc
SpellVisualEffectName.dbc

Q: 在自己的程序中使用wow的资源的方法
A: 有两种方法,一种是自己直接利用已有的mpq文件解析方法加上读取相应的角色或场景格式,可以参考wowmodelviewer、wowmapviewer。另一种是用现成的wow导出插件,生成max文件,再转为自己的文件格式
 

3D游戏人物模型系统设计概要

1.多种发型,胡须,特征(耳朵,嘴巴等)的几何Chunk集成在一个人物模型文件内部.

2.多种手腕护甲,腿护甲,鞋子,披风的几何Chunk集成在一个人物模型文件内部.

3.集成的模型块(GeoChunk)按数值区域进行分类,如设发型块的标识范围为1-100,胡须101-200,耳朵701-800,大腿1301-1400,小腿501-600.在各自的取值范围内,不同值代表不同的几何形状风格,如1:光头,2:冲天发等等.

4.手腕护甲,腿护甲,鞋子,披风物品应该有数据表明自己影响了哪些集成模型块(GeoChunk),如长筒靴影响了小腿的几何形状风格.每样物品均能影响身体的各个部位,若各个物品影响出现重叠,取影响优先高的物体.如靴子影响小腿是最高优先的,其他的影响被冲消.

5.武器,护甲,盾牌作为外部模型连接到身体的某块骨骼,以之为根骨骼进行骨骼矩阵运作.每个人物模型定义了其使用各种武器,盾牌时的动作.每个人物模型定义了各部位的物品接入点标识和坐标,如1:右手心,2左手心,并且定义接入的骨骼ID.

6.每样物品,鞋子,披风,武器,护甲,盾牌除几何形状外,有数据定义各自的纹理,极其复杂.一个物品应该有左右模型文件,左右纹理文件,以及对身体各部位影响的几何形状风格和对应的纹理.

7.头发的颜色使用不同的纹理来表达,但毛发纹理不仅表达颜色,还表达毛发的外观风格,如辫子,四披头,长发等不同发质,数据组织极其复杂,分性别,种族,发型,颜色值等等.

8.人物模型分块应该以Material为基本标准,兼顾几何形状(GeoChunk)分布,Material在存储时要预排序.1个Materail可以影响多个几何Mesh,一个Mesh可以受多个Material影响(多重纹理).

9.1个Materail用Flags(1个或多个DWORD)表达自己的Shader,这样使用Flags就可以排序优化模型渲染队列.基本有:BLEND_NONE,BLEND_TRANSPARENT,BLEND_MERGE,BLEND_ADDITIVE,BLEND_ADDITIVE_ALPHA,BLEND_SRC_DEST等等.甚至可以是一个VS,PS的Shader ID.

10.Refer to http://www.cnitblog.com/linghuye/archive/2005/08/14/1903.aspx 


原创  基于骨骼动画的生物拼接和人物动作系统设计

 

 基于骨骼动画的生物拼接和人物动作系统设计

 

说明1:模型既指Mesh,又指Entity. 对于美工方面就是Mesh,对于程序方面就是Entity。文中会根据内容的不同交替使用“模型”和“实体”。

 

1、生物拼接规则
     1.1、生物组成划分

      为了美术资源复用,将一个人物分为若干部分,比如头/身/手/腿。人物由装备组成,一件装备对应一个或多个部分。美术制作人物也就变成了制作装备。将生物划分为若干部分,是实现换装的关键。

     1.2、美术制作

     美术首先制作一个完整的人物模型,然后按照之前的划分规则,将模型进行切割。所有的部分都应该保持相对位置不变动,这样在这些实体attach到节点上时,才能精确一致。(拼接规则一) 

2、基于骨骼动画的动作和骨骼组织策略。

      2.1、动作划分规则

      动作需要分类,比如走、跑、跳等。动作类型是抽象概念,适用于程序、策划、和美术三方。骨骼文件中的动作数量在原则上应该和动作类别的数量一致。当出现2边不对应的情况(一般是动画数量少于动作类别数量)就会使用标准肢势。 

      2.2、主骨骼

      在量产模型之前,应该先将骨骼制作出来。根据具体需求不同,可以制作多副骨骼,以后所有的模型,都应该根据这些骨骼进行制作。这一类骨骼,叫做主骨骼。即使2个主骨骼的体型完全不一样,也应该对之前划分的所有动作类型都制作相应的动作。这样在程序内部,就不需要根据不同的主骨骼进行动画名称查找了(当然,也可以根据骨骼名称和动作类型进行双主键的动画数据查找)不同体型的骨骼具有同样的动画集名称,这是实现多骨骼模型拼接的关键。

       2.3、独立骨骼

      和主骨骼相对的,存在一类模型对象,它们不使用主骨骼进行建摸,而是单独另外制作骨骼,比如翅膀、条带、披风等物件,这类骨骼,叫做独立骨骼。这些东西基本上都是中后期美术人手充足时添加上去的。这些附属物种类繁多,如果将这些部位附加到主骨骼上,将产生大量的冗余,并且会对后续主骨骼的动作开发产生很严重的影响。独立骨骼在制作动作的时候,也需要实现动作分类中的所有动作。  

       2.4、主实体和独立实体

      使用主骨骼的模型叫做主实体(PrimaryEntity),使用独立骨骼的实体叫做独立实体(AloneEntity)。多个主实体直接的拼接由拼接规则一来保证。独立实体在制作的时候,独立实体只需要以自己的根节点为标准进行制作,一般来说是原点。主骨骼需要设置一组连接点(LinkNode),这些连接点用来attach独立实体。比如在人物组成的“身体”部分设置一个“背”的连接点,这些连接点都是主骨骼的组成部分。独立实体需要知道自己往哪个连接点attach。(拼接规则二)

 3、动作的处理策略
     3.1、骨骼实例的混合

     一个生物在创建组成自己各个部分的实体后,进行共享骨骼实例操作。规则是以身体实体所使用的骨骼实力为主骨骼实例,将其他主实体共享该骨骼实例。(骨骼混合规则一)根据2.3和2.4的描述,装备是有可能不使用主骨骼的,对于独立实体,处理策略是一致的,对于使用同一独立骨骼的独立实体,以第1个加载的独立实体的骨骼实例作为这些实体的主骨骼实例。(骨骼混合规则二)之后出现的实体都参照以上2条骨骼混合规则。

     3.2、骨骼动画的存储和更新

     因为通过实体来操作骨骼实例,所以需要根据骨骼种类的数量(等同于经过骨骼实例混合后剩下的骨骼实例的数量),建立骨骼实例--实体对应关系表。在进行对象更新的时候,遍例该表,取出骨骼实例的动画集,根据2.1中定义的动作类别,步进对应的动画集。
     3.3、动作淡入淡出策略
     为了平滑2个动作的衔接过程,可以利用权重实现动作淡入淡出。这个时候需要建立2个列表:正在淡入的列表 FadeIn 和 正在淡出的列表 FadeOut. 假设综合权重为1,那么当一个动作淡入时,必然有一个动作淡出,2个动作的混合权重需要保持1。 根据不同的策略进行动作集之间的权重调整,可以采用时间累积,也可以采用不同的动作对应不同的混合时间。



PS : 本文写的很飘渺,比较适合寻求动作系统实现方案的朋友阅读。

 
原文地址:https://www.cnblogs.com/lai3d/p/1581748.html