魔兽世界客户端数据研究(三)

终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这个唯一让我充过值的游戏。

这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象。 其中会有很多让人费解的地方,如果有幸被某位兄弟看见

,请勿见笑。

 

今天来说一下M2中的LOD的数据

WOW中,为了降低远处模型的渲染开销,为模型做了LOD,即远处的模型,使用更少的顶点,更粗略的材质。 比如远处的模型在渲染的时

候,面片数量减少,关闭光照,不渲染挂接的特效等等。

因此,不用证明也知道,M2中,材质是存在每一个LOD信息中的。 
哎,也就写这几句的时候顺手些,其实不用分析,也是这个结果。因为我们自己的引擎就是这样做的,何况是WOW这种大师级的作品呢。

从WMV的解析代码下手,看看它是如何解析的吧。 
首先,它使用了这样一行代码 
int16 *transLookup = (int16*)(f.getBuffer() + header.ofsTransparencyLookup); 
读取了一串用于透明值的查找数组。 不过暂时没有使用,后面材质构建的地方才会用到。 
接下来,就是读取相关数据了。 在WLK以后,所有的这些数据,被分离到了.skin文件里面,不知道是咱想的,以后再来作讨论。 但是在

WLK之前,这个数据还是被放在了一起的。

通过模型的名字我们组合上.skin,就是当前所要的渲染数据了。 
这个组合是这样的。 
假如我们一个模型是 humanmale.m2 
那么它的四个LOD数据分别就是 humanmale01.skin humanmale02.skin humanmale03.skin humanmale04.skin

当我们得到了这个数据后,就可以通过MPQFile加载想要的数据了。

OK,假设上面的过程,我们已经完全搞定了,此时,我们就得到了一个skin的数据。有了这个数据,我们就可以为所欲为了,嘿嘿。有点

夸张了。 在这个数据的最前面,肯定是数据头了。 数据头在WMV中本来一直是以xxxxHeader来定义的,不过在这里,它一改风格,定义

了一个叫ModelView的东西。

我们来看看这货的定义 
struct ModelView 

#ifdef WotLK 
    char id[4]; //巫妖王版本新增的一个标记位,必须是 'S' 'K' 'I' 'N' 
#endif 
    uint32 nIndex; //这个表示此LOD有多少个INDEX 
    uint32 ofsIndex; //这个表示此LOD的INDEX从模型的哪里开始数 
    uint32 nTris; //这个表示此LOD有多少个构建成三角形的索引 
    uint32 ofsTris;     //三角形个数 
    uint32 nProps; //额外的顶点属性 
    uint32 ofsProps; //顶点属性读取 
    uint32 nSub; //有多少个子部件 后面定义的ModelGeoset表示一个子部件,其包括了MESH数据,材质,渲染状态等内容 
    uint32 ofsSub;     // 
    uint32 nTex;  //纹理 
    uint32 ofsTex;     // ModelTexUnit, material properties/textures 
    int32 lod;                 // LOD bias?  WMV作者也打了问号。 
};

有了这个数据头以后,我们就可以无脑的先读取上面的数据,然后再进行构建。

索引数据 
uint16 *indexLookup = (uint16*)(g.getBuffer() + view->ofsIndex); 
构成三角形的顶点索引序列 
uint16 *triangles = (uint16*)(g.getBuffer() + view->ofsTris);

当前模型在渲染时候的索引数目 
nIndices = view->nTris; 
重新分配索引 
wxDELETEA(indices); 
indices = new uint16[nIndices];

将本地索引转换成全局索引 
for (size_t i = 0; i<nIndices; i++) 

        indices[i] = indexLookup[triangles[i]]; 
}

索引数据总算是完了,下面就得准备子模型和材质相关的事情。 
大家都知道,在渲染管线中,一次渲染提交只能提交具有相同渲染状态和纹理的模型。 于是,我们的模型如果具有不同的材质,就需要

先做分割处理。 这是所有WOW这样的3D MMORPG引擎都需要处理的问题。

在WMV中,模型渲染状态相关的数据,使用了ModelGeoset来表示,纹理相关的,使用了ModelTexUnit来表示 
先看看ModelGeoset的定义 
/// Lod part, One material + render operation 
struct ModelGeoset 

    uint32 id;        // mesh part id? 
    uint16 vstart;    // first vertex, Starting vertex number. 
    uint16 vcount;    // num vertices, Number of vertices. 
    uint16 istart;    // first index, Starting triangle index (that's 3* the number of triangles drawn so far). 
    uint16 icount;    // num indices, Number of triangle indices. 
    uint16 nSkinnedBones;    // number of bone indices, Number of elements in the bone lookup table. 
    uint16 StartBones;        // ? always 1 to 4, Starting index in the bone lookup table. 
    uint16 rootBone;        // root bone? 
    uint16 nBones;        // 
    Vec3D BoundingBox[2]; 
    float radius; 
};

由上可知,它定义了渲染相关的顶点,以及骨骼,和包围盒信息,最后一个是作为构建包围球用的。

/// Lod part, A texture unit (sub of material) 
struct ModelTexUnit 

    // probably the texture units 
    // size always >=number of materials it seems 
    uint16 flags;        // Usually 16 for static textures, and 0 for animated textures. 
    uint16 shading;        // If set to 0x8000: shaders. Used in skyboxes to ditch the need for depth buffering.

See below. 
    uint16 op;            // Material this texture is part of (index into mat) 
    uint16 op2;            // Always same as above? 
    int16 colorIndex;    // A Color out of the Colors-Block or -1 if none. 
    uint16 flagsIndex;    // RenderFlags (index into render flags, TexFlags) 
    uint16 texunit;        // Index into the texture unit lookup table. 
    uint16 mode;        // See below. 
    uint16 textureid;    // Index into Texture lookup table 
    uint16 texunit2;    // copy of texture unit value? 
    uint16 transid;        // Index into transparency lookup table. 
    uint16 texanimid;    // Index into uvanimation lookup table. 
}; 
而上面这个结构,是纹理相关的信息。

上面的信息,都是一些索引和ID值,真正的数据是放在全局信息中的。

读取完上面的数据后,LOD信息基本上就大功造成了。 而这些索引是如何使用的,只有下一次再研究了。今天又很晚了。

由此可知,WOW中的数据组织和一般的引擎没有太多区别。 即HEADER信息用于分割数据区域。 
整个模型要使用的数据,放在了最上层,然后,不同的LOD和子MESH要使用数据的时候,只需要保存一些索引值,再到全局数据里去查询就可以了。

暂时到此吧,下次继续。。。。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2013/04/26/3043890.html

时间: 2024-08-04 08:07:24

魔兽世界客户端数据研究(三)的相关文章

魔兽世界客户端数据研究(一)

终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这个唯一让我充过值的游戏. 这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象. 其中会有很多让人费解的地方,如果有幸被某位兄弟看见,请勿见笑. 我们从读取模型数据开始...  下面是这是顶点结构体 这是wow model viewer中的定义  struct ModelVertex  {      Vec3D pos; //顶点位置      uint8 weights[4]

魔兽世界客户端数据研究(四):M2文件头分析

终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这个唯一让我充过值的游戏. 这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象. 其中会有很多让人费解的地方,如果有幸被某位兄弟看见 ,请勿见笑. 这都是第四篇关于M2文件格式的文章了,但是,对MD2文件格式的理解却还是九牛一毛,冰山一角. 仔细思考了一下,发现是不是自己一 开始走的路不对,因为是从半腰上分析的. 今天决定把文件头补上. 因为文件头可以大概看出一个文件是如何组织

魔兽世界客户端数据研究(二)

终于决定,还是通过wow model viewer起手,研究一下WOW的数据类型,从另一个角度,体验一把这 个唯一让我充过值的游戏. 这将是一系列随笔,即在读代码的时候,顺便记录,以理清思路和加深映象. 其中会有很多让人费 解的地方,如果有幸被某位兄弟看见,请勿见笑.   上次弄到nAttachLookup就不行了,这次继续弄.  最近四川地震了,所以弄得比较慢. 好吧,我们接着nAttachLookup说.  读完挂接数据后,我们接着读了堆nAttachLookup个的uint16数据.这串数

大数据研究常用软件工具与应用场景

如今,大数据日益成为研究行业的重要研究目标.面对其高数据量.多维度与异构化的特点,以及分析方法思路的扩展,传统统计工具已经难以应对. 工欲善其事,必先利其器.众多新的软件分析工具作为深入大数据洞察研究的重要助力, 也成为数据科学家所必须掌握的知识技能. 然而,现实情况的复杂性决定了并不存在解决一切问题的终极工具.实际研究过程中,需要根据实际情况灵活选择最合适的工具(甚至多种工具组合使用),才能更好的完成研究探索. 为此,本文针对研究人员(非技术人员)的实际情况,介绍当前大数据研究涉及的一些主要工

tcp协议 udp协议-C#服务端请求客户端数据

问题描述 C#服务端请求客户端数据 我想在客户端安装一个服务后,能够向客户端请求数据,返回数据给服务器,这样用什么协议要好,socket行吗?服务端怎么发起这个请求,麻烦各位大神帮帮忙? 我不清楚的地方,如果用socket,保存客户端连接后,我要请求客户端数据,只能是客户端请求服务端,而我换成服务端请求客户端好像只能是客户端请求后服务端回复. 如果是UDP的话好定义请求和回复问题吗? 解决方案 ok,既然是.net,就有.net的最佳做法,wcf双工通讯或signalr.我在论坛都分享过例子.

法律大数据研究与应用六大展望

<中华人民共和国国民经济和社会发展第十三个五年规划纲要>明确地把大数据战略提升为国家战略.大数据成为国家"基础性战略资源",对于推动着国家治理体系和治理能力走向现代化有着重要与深远的意义.<纲要>指出,把大数据作为基础性战略资源,全面实施促进大数据发展行动,加快推动数据资源共享开放和开发应用,助力产业转型升级和社会治理创新.国家将统筹布局建设国家大数据平台.数据中心等基础设施.研究制定数据开放.保护等法律法规,制定政府信息资源管理办法. 对于法学研究来说,大数据

数据研究在交互设计中的应用

交互设计师一大宝贵财富就是他的经验和直觉,在大多数需要对当前设计作出迅速判断的情况中,交互设计师所依赖的就是他的经验和直觉.在互联网的世界中,最有价值的可能就是数据了.google靠数据一举奠定江湖地位:twitter靠数据开始逐渐走向成熟:每一个交互设计师也能用数据来弥补依靠经验和直觉来设计的不足.本篇网志从一个很小的设计案例来描述除了经验和直觉之外,http://www.aliyun.com/zixun/aggregation/13083.html">数据研究也可以验证.修正.甚至颠覆

教育大数据研究综述

教育大数据不仅仅是大数据在教育领域应用,而且通过教育领域反向驱动大数据技术分化为独立的分支,从而带来了对传统教育技术领域长期研究问题解决的新途径,甚至可以跨越传统个性化学习的精确逻辑推理过程而直接分析全样本学习者特征.这样来促进教育管理科学化变革.促进教学模式改革.促进个性化教育变革.促进教育评价体系改革.促进科学研究变革等.这些主要依托于教育大数据的两项关键技术:教育数据挖掘和学习分析.但是我国的教育大数据研究与应用尚处于起步阶段,缺乏前期的规范化和系统化顶层设计,面临许多层次的挑战,如应用挑

美国的《联邦大数据研究与开发战略计划》

大数据有可能从根本上改善所有美国人的生活.为了从资源丰富的大数据中获得最大的效益,奥巴马政府于2012年3月29日推出了"大数据研究与开发计划".在此基础上,美国又于2016年5月发布了<联邦大数据研究与开发战略计划>(以下简称"计划"),其目标是对联邦机构的大数据相关项目和投资进行指导.该"计划"主要围绕代表大数据研发关键领域的七个战略进行,包括促进人类对科学.医学和安全所有分支的认识;确保美国在研发领域继续发挥领导作用;通过研发来