WOW M2 文件格式学习

Header
The header has mostly the layout of number-offset pairs, containing the number of a particular record in the file, and the offset. These appear at fixed places in the header. Record sizes are not specified in the file.
The unknown blocks have (mostly arbitrary) alphabetic names until we figure out what they are.
Offset
Type
Description
0x000
char[4]
"MD20"
0x004
uint8[4]
Version (always 00 01 00 00)
0x008
uint32
model name length
0x00C
uint32
model name offset
0x010
uint32
Model type? always 0, 1 or 3 (mostly 0)
0x014
uint32
nGlobalSequences - number of global sequences 全局的时间序列,各个动画的duration
0x018
uint32
ofsGlobalSequences - offset to global sequences
0x01C
uint32
nAnimations - number of animation sequences
0x020
uint32
ofsAnimations - offset to animation sequences
0x024
uint32
nC
0x028
uint32
ofsC
0x02C
uint32
nD - always 201 or 203 depending on WoW client version
0x030
uint32
ofsD
0x034
uint32
nBones - number of bones
0x038
uint32
ofsBones - offset to bones
0x03C
uint32
nF - bone lookup table
0x040
uint32
ofsF
0x044
uint32
nVertices - number of vertices
0x048
uint32
ofsVertices - offset to vertices
0x04C
uint32
nViews - number of views (LOD versions?) 4 for every model
0x050
uint32
ofsViews - offset to views
0x054
uint32
nColors - number of color definitions    Material 的Emissive, Specular Color动画
0x058
uint32
ofsColors - offset to color definitions  
0x05C
uint32
nTextures - number of textures  全局纹理
0x060
uint32
ofsTextures - offset to texture definitions
0x064
uint32
nTransparency - number of transparency definitions   感觉这里是模型的透明度动画?
0x068
uint32
ofsTransparency - offset to transparency definitions
0x06C
uint32
nI - always 0
0x070
uint32
ofsI
0x074
uint32
nTexAnims - number of texture animations
0x078
uint32
ofsTexAnims - offset to texture animations
0x07C
uint32
nK
0x080
uint32
ofsK
0x084
uint32
nRenderFlags - number of blending mode definitions 与场景的混合方式,共有6种。
0x088
uint32
ofsRenderFlags - offset to blending mode definitions
0x08C
uint32
nY - bone lookup table
0x090
uint32
ofsY
0x094
uint32
nTexLookup - number of texture lookup table entries   全局纹理数组的查询表
0x098
uint32
ofsTexLookup - offset to texture lookup table
0x09C
uint32
nTexUnits - texture unit definitions?   子材质Sub of Material,对应一次提交(一组渲染状态)
0x0A0
uint32
ofsTexUnits
0x0A4
uint32
nTransLookup - number of transparency lookup table entries   
0x0A8
uint32
ofsTransLookup - offset to transparency lookup table
0x0AC
uint32
nTexAnimLookup - number of texture animation lookup table entries  
0x0B0
uint32
ofsTexAnimLookup - offset to texture animation lookup table
0x0B4
14 * float
float values ... ? (in range -1000...1000, mostly in -20...30)
0x0EC
uint32
nBoundingTriangles    绑定Mesh的三角形索引,用来做较精确的碰撞检测。
0x0F0
uint32
ofsBoundingTriangles    
0x0F4
uint32
nBoundingVertices    绑定Mesh的顶点数据
0x0F8
uint32
ofsBoundingVertices
0x0FC
uint32
nBoundingNormals   绑定Mesh的法向量
0x100
uint32
ofsBoundingNormals
0x104
uint32
nO
0x108
uint32
ofsO
0x10C
uint32
nP
0x110
uint32
ofsP
0x114
uint32
nQ
0x118
uint32
ofsQ
0x11C
uint32
nLights - number of lights 光源
0x120
uint32
ofsLights - offset to lights
0x124
uint32
nCameras - number of cameras
0x128
uint32
ofsCameras - offset to cameras
0x12C
uint32
nCameraLookup
0x130
uint32
ofsCameraLookup
0x134
uint32
nRibbonEmitters - number of ribbon emitters
0x138
uint32
ofsRibbonEmitters - offset to ribbon emitters
0x13C
uint32
nParticleEmitters - number of particle emitters
0x140
uint32
ofsParticleEmitters - offset to particle emitters

 

Particle emitters
nparticleEmitters records of 0x1F8 bytes starting at ofsParticleEmitters, followed by data referenced in these records.
The records have the following structure:

Offset
Type
Description
0x000
int32
id (always -1?)
0x004
int32
flags 表示粒子行为和表现的标记位,如面向摄像机的方式、属性随机的方式(光晕、武器光等),我觉得这部分可以归纳为不同的发射器,如光晕效果可以用一个环形发射器实现。
0x008
float[3]
position
0x014
int16
Bone ID
0x016
int16
Texture ID
0x018
uint32
Number of ints referenced #1
0x01C
uint32
Offset to list of ints #1
0x020
uint32
Number of ints referenced #2
0x024
uint32
Offset to list of ints #2
0x028
int16
Blending mode 与场景混合方式
0x02A
int16
Emitter type 发射器类型
0x02C
int16
Particle type 面向摄像机方式
0x02E
int16
Texture tile rotation (-1,0,1)
0x030
int16
Rows on texture  ? 使用的纹理包含纹理动画时,一行包含的动画帧数目
0x032
int16
Columns on texture  ? 一列包含的动画帧数目
0x034
AnimationBlock (float) [10]
Parameters 10 个属性的关键帧数据
0x14C
float[36]
unknown float values - more parameters?
0x14C
float
Midpoint in lifespan? (0 to 1)
0x150
uint32[3]
ARGB colors (start, mid, end) 颜色动画关键帧
0x15C
float[3]
Particle sizes (start, mid, end) 缩放关键帧
0x168
short[10]
Indices into the tiles on the texture? 如果是索引,那为什么要记录这些数据?顺序播放不成吗,难道同一个纹理动画有多种播放策略? 需要在WOW里面需求例子。
0x17C
float[3]
Unknown
0x188
float[3]
Something about particle scaling? Hm.
0x194
float
Slowdown
0x198
float
Particle rotation
0x19C
float[10]
Unknown (usually all 0)
0x1C4
float[6]
Unknown, usually (2.5, 0.7, 7, 0.9, 0, 0)
0x1DC
AnimationBlock (int)
unknown

About slowdown: for nonzero values, instead of travelling linearly the particles seem to slow down sooner. I can't work out the exact function but for a value of, say, 10, the particles pretty much stay in place. Not the same effect as gravity, though. Update: thanks to nsz for the formula. Speed is multiplied by exp( -slowdown * t )
About particle rotation: 0 for none, 1 to rotate the particle 360 degrees throughout its lifetime.

The ten animatable particle parameters are:

Number
Description
0
Emission speed 发射速度
1
Speed variation (range: 0 to 1) 速度变化
2
Spread? (range: 0 to pi) 相对发射器发射方向的扩散角度
3
 ? (range: 0 to 2*pi)
4
Gravity 重力
5
Lifespan 寿命
6
Emission rate 发射率
7
Emission area length 发射区域的长度
8
Emission area width 发射区域的宽度
9
Gravity? (much stronger) 重力

Emitter types:

Value
Description
1
Plane (rectangle)
2
Sphere
3
(Spline? can't be bothered to find one)

Particle types:

Value
Description
0
"normal" particle
1
large quad from the particle's origin to its position (used in Moonwell water effects)
2
seems to be the same as 0 (found some in the Deeprun Tram blinky-lights-sign thing)

Flags:

Value
Description
0x1000
do not billboard (used for some water wake ripple effects)

相关推荐
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 下面是一个FreeMarker模板的例子,包含了以上所说的4个部分 <html><br> <head><br> <title>Welcome!</title><br> </head><br> <body><br> <#-- 注释部分 --><br> <#-- 下面使用插值 --> <h1>Welcome ${user} !</h1><br> <p>We have these animals:<br> <u1><br> <#-- 使用FTL指令 --> <#list animals as being><br> <li>${being.name} for ${being.price} Euros<br> <#list><br> <u1><br> </body><br> </html> 1, FTL指令规则 在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的. 1,开始标签:<#directivename parameter> 2,结束标签:</#directivename> 3,空标签:<#directivename parameter/> 实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号. 用户指令用@ 使用FTL标签时, 应该有正确的嵌套,而不是交叉使用,这和XML标签的用法完全一样.如果全用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不允许有空白字符. 2, 插值规则 FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format} 2.1 通用插值 对于通用插值,又可以分为以下4种情况: 1,插值结果为字符串值:直接输出表达式结果 2,插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子: <#settion number_format="currency"/> <#assign answer=42/> ${answer} ${answer?string} <#-- the same as ${answer} --> ${answer?string.number} ${answer?string.currency} ${answer?string.percent} ${answer} 输出结果是: $42.00 $42.00 42 $42.00 4,200% 3,插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子: ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastUpdated?string("EEE, MMM d, ''yy")} ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} 输出结果是: 2008-04-08 08:08:08 Pacific Daylight Time Tue, Apr 8, '03 Tuesday, April 08, 2003, 08:08:08 PM (PDT) 4,插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子: <#assign foo=true/> ${foo?string("yes", "no")} 输出结果是: yes 2.2 数字格式化插值 数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是: mX:小数部分最小X位 MX:小数部分最大X位 如下面的例子: <#assign x=2.582/> <#assign y=4/> #{x; M2} <#-- 输出2.58 --> #{y; M2} <#-- 输出4 --> #{x; m1} <#-- 输出2.6 --> #{y; m1} <#-- 输出4.0 --> #{x; m1M2} <#-- 输出2.58 --> #{x; m1M2} <#-- 输出4.0 --> 3, 表达式 表达式是FreeMarker模板的核心功能,表达式放置在插值语法${}之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker 标签结合,用于控制输出.实际上FreeMarker的表达式功能非常强大,它不仅支持直接指定值,输出变量值,也支持字符串格式化输出和集合访问等功能. 3.1 直接指定值 使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和MAP对象. 1,字符串 直接指定字符串值使用单引号或双引号限定,如果字符串值中包含特殊字符需要转义,看下面的例子: ${"我的文件保存在C:\\盘"} ${'我名字是\"annlee\"'} 输出结果是: 我的文件保存在C:\盘 我名字是"annlee" FreeMarker支持如下转义字符: \";双引号(u0022) \';单引号(u0027) \\;反斜杠(u005C) \n;换行(u000A) \r;回车(u000D) \t;Tab(u0009) \b;退格键(u0008) \f;Form feed(u000C) \l;< \g;> \a;& \{;{ \xCode;直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符. 如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式:可以在指定字符串内容的引号前增加r标记,在r标记后的文件将会直接输出.看如下代码: ${r"${foo}"} ${r"C:\foo\bar"} 输出结果是: ${foo} C:\foo\bar 2,数值 表达式中的数值直接输出,不需要引号.小数点使用"."分隔,不能使用分组","符号.FreeMarker目前还不支持科学计数法,所以"1E3"是错误的.在FreeMarker表达式中使用数值需要注意以下几点: 1,数值不能省略小数点前面的0,所以".5"是错误的写法 2,数值8 , +8 , 8.00都是相同的 3,布尔值 直接使用true和false,不使用引号. 4,集合 集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子: <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x> ${x} </#list> 输出结果是: 星期一 星期二 星期三 星期四 星期五 星期六 星期天 除此之外,集合元素也可以是表达式,例子如下: [2 + 2, [1, 2, 3, 4], "whatnot"] 还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2 5,Map对象 Map对象使用花括号包括,Map中的key-value对之间以英文冒号":"分隔,多组key-value对之间以英文逗号","分隔.下面是一个例子: {"语文":78, "数学":80} Map对象的key和value都是表达式,但是key必须是字符串 3.2 输出变量值 FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.下面分别讨论这些情况 1,顶层变量 所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型: Map root = new HashMap(); //创建数据模型 root.put("name","annlee"); //name是一个顶层变量 对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法: ${name} 2,输出集合元素 如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引: ["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,如果需要输出星期三,则可以使用如下语法: ${week[2]} //输出第三个集合元素 此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法: week[3..5] //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素 3,输出Map元素 这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型: Map root = new HashMap(); Book book = new Book(); Author author = new Author(); author.setName("annlee"); author.setAddress("gz"); book.setName("struts2"); book.setAuthor(author); root.put("info","struts"); root.put("book", book); 书有作者, 为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法: book.author.name //全部使用点语法 book["author"].name book.author["name"] //混合使用点语法和方括号语法 book["author"]["name"] //全部使用方括号语法 使用点语法时,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字可以是任意表达式的结果. Map?keys这个map当中所有的key的列表 Map?values这个map当中所有的value的列表 3.3, 字符串操作 FreeMarker的表达式对字符串操作非常灵活,可以将字符串常量和变量连接起来,也可以返回字符串的子串等. 字符串连接有两种语法: 1,使用${..}或#{..}在字符串常量部分插入表达式的值,从而完成字符串连接. 2,直接使用连接运算符+来连接字符串 例如有如下数据模型: Map root = new HashMap(); root.put("user","annlee"); 下面将user变量和常量连接起来: ${"hello, ${user}!"} //使用第一种语法来连接 ${"hello, " + user + "!"} //使用+号来连接 上面的输出字符串都是hello,annlee!,可以看出这两种语法的效果完全一样. 值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的: <#if ${isBig}>Wow!</#if> <#if "${isBig}">Wow!</#if> 应该写成:<#if isBig>Wow!</#if> 截取子串可以根据字符串的索引来进行,截取子串时如果只指定了一个索引值,则用于取得字符串中指定索引所对应的字符;如果指定两个索引值,则返回两个索引中间的字符串子串.假如有如下数据模型: Map root = new HashMap(); root.put("book","struts2,freemarker"); 可以通过如下语法来截取子串: ${book[0]}${book[4]} //结果是su ${book[1..4]} //结果是tru
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页