|
|
|
NeverwinterNights 2 的MDB格式 翻译自NWN2Wiki[http://nwn2.wikia.com/wiki/MDB_Format]
翻译者:福尔摩沙的希望骑士
注:若有翻译不顺或是看不懂请见谅
此维基是描述绝冬城之夜2里目前所理解的的MDB格式,MDB的主要用途就是游戏里的3D对象。
下載(注正體中文版):http://Knighthsuyucheng.googlepa ... ghts_MDB_Format.pdf
[1]文件标头(FileHeader)
所有的MDB档案一开始就有一个标头、特殊的签名(signature)以及版本信息,并列出有效的数据包(packets)。列出有效的数据包是用来定义文件是包含了哪些种类的数据,以及数据是位于文件的哪里。
[1.1]MDB标头(MDBHeader)
一个简单的标头区块,内含版本信息以及有效数据。
MDBHeader
| 类型
| 标签
| 描述
| char[4]
| Signature
| 档案签名 – 永远是’NWN2’
| uint16
| MajorVer
| 主要版本编号
| uint16
| MinorVer
| 次要版本编号
| uint32
| NumPackets
| 数据包的编号
| MDBPacketKey[NumPackets]
| Packets
| 数据包数组
| [1.2]MDBPacketKey
packetkey定义持有的数据包种类以及该种类所在位置
MDBPacketKey
| 类型
| 标签
| 描述
| char[4]
| Signature
| 数据包签名(Packet Signature) – RIGD, SKIN, COL2, COL3, HOOK, WALK, COLS, TRRN, HELM, HAIR
| uint32
| FileOffset
| 数据包是位于文件的哪里(利用位移量以文件起始点算)
| [2]数据包(Packets)
实际上所有有用的信息都包含在MDB文件上所纪录的数据包或是块状数据里。文件的标头(header)包含了版号、列出了有效的数据包以及数据包是位于文件的哪里。数据包是由4个字的签名所组成且就只有四个字不会超过也不会少于4个字。
[2.1]共有的(Common)
[2.1.1]MDB数据包(MDBPacket)
数据包首先会表明是何种种类的数据包以及该数据包所占的大小,此大小不包含数据包的签名与规模。
MDBPacket
| 类型
| 标签
| 描述
| char[4]
| Signature
| 数据包签名– RIGD, SKIN, COL2, COL3, HOOK, WALK, COLS, TRRN, HELM, HAIR
| uint32
| PacketSize
| 数据包大小
| [2.1.2]TRI
以三角结构表达网格(mesh)格式,以顶点索引(indicesof the vertices)来定义面的网格。
TRI – Triangle (三角形)
| 类型
| 标签
| 描述
| uint16[3]
| Verts
| 以顶点索引定义一个三角形面
| [2.2]刚体(RigidBody)
[2.2.1]RIGD
刚体大量应用在MDL格式,而且是所有静态对象的主要规格。这些对象在游戏里是无法改变形状的。任何网格(mesh)都可以输出成RIGD对象,而此对象包含了网格(mesh)、材质(materials)以及纹理(texture)贴图。顶点(vertices)数目极限为65535但顶点数最好介于1000~10000使游戏效能较好。注意:由于输出方式是包含纹理与法线,网格最终的顶点数可能比仿真模型程序所显示的顶点数还要多。
RIGD – Rigid Body (刚体)
| 类型
| 标签
| 描述
| char[4]
| Signature
| 数据包签名– 永远是 ’RIGD’
| uint32
| PacketSize
| 数据包大小
| char[32]
| Name
| 名称
| Material
| Material
| 纹理与材质的信息
| uint32
| NumVerts
| 顶点编号(Number of vertices)
| uint32
| NumFaces
| 面编号(Number of faces)
| RVert[NumVerts]
| Verts
| 刚体顶点数(Vertices)
| TRI[NumFaces]
| Faces
| 三角面的索引数(Triangle Faces Indices)
| [2.2.2]RVERT– 刚体顶点(RigidBody Vertex)
刚体顶点包含了刚体网格特定顶点(specificvertex)的所有讯息,它包含了切线位置、次切线方向以及纹理位置。
RVert – Rigid Body Vertex(刚体顶点)
| 类型
| 标签
| 描述
| Point3
| Position
| 位置
| Point3
| Normal
| 法线
| Point3
| Tangent
| 切线
| Point3
| Binormal
| 次法线(Binormal)
| Point3
| UVW
| 纹理顶点(Texture vertex)
| [2.3]皮肤物体(SkinnedBody)
皮肤物体是受操控的刚体,所以基本骨架(skeletion)移动时它就会变形。
[2.3.1]皮肤(SKIN)
皮肤对象(Skinnedobjects)如同生物的皮肤对象。它们通常和骨骼绑在一起且此结构包含了重量以及顶点的网格。(Theseare usually bound to a skeleton and this structure holds the weightsas well as the vertices for amesh.)骨架的骨骼若和动画有关的就不包含在MDB文件而在GR2文件里,GR2文件是一种规格由RedTools公司的Granny软件制作(译者注明:用户自定义的模型中,加入第二条线以识别辨认gr2骨骼文件——即模型在动画中所使用的骨骼文件。例如:如果盔甲部件属于一个男性,则骨骼写入「Skeleton=P_HHM_skel」。骨骼定义线是游戏中所有动画模型所必需的。如果任何一个盔甲部件MDB的网格中缺少这条线,则将导致MDB使游戏崩溃。想要研究gr2就打开游戏目录data文件夹里的lod-merged.zip)。
SKIN – Vertex weighted body (顶点重量物体)
| 类型
| 标签
| 描述
| char[4]
| Signature
| 文件签名 – 永远是 ’SKIN’
| uint32
| PacketSize
| 数据包大小
| char[32]
| Name
| 名称
| char[32]
| Skeleton
| 骨架名称
| Material
| Material
| 纹理与材质的信息
| uint32
| NumVerts
| 顶点编号(Number of vertices)
| uint32
| NumFaces
| 面编号(Number of faces)
| SVert[NumVerts]
| Verts
| 表皮顶点数(Skin Vertices)
| TRI[NumFaces]
| Faces
| 三角面数(Triangle Faces)
| [2.3.2]SVERT– 皮肤顶点(SkinVertex)
皮肤顶点结构就如同刚体顶点,但还具备了骨头重量、哪个骨头可以使网格变形的(bonescan deform the mesh) 。该顶点的骨头总重量需为1(译者注明:若总重量不为1则读取MDB时会使游戏崩溃。)
SVert – Skin Vertex
| 类型
| 标签
| 描述
| Point3
| Position
| 位置
| Point3
| Normal
| 法线
| float[4]
| BoneWeights
| 骨头重量(Bone Weights)
| byte[4]
| BoneIndices
| 骨头索引(Bone Indices)
| Point3
| Tangent
| 切线
| Point3
| Binormal
| 次法线
| Point3
| UVW
| 纹理顶点(Texture vertex)
| float
| BoneCount
| 骨头总数
| [2.4]碰撞网格(CollisionMesh)
皮肤物体(Skinnedbodies)是被操控的物体,当基本骨架移动时就会改变。
[2.4.1]COL2
这些碰撞网格目前我们还不详细,而且和模型不太一致。我们并不了解COL2与COL3的差异性。黑曜石(Obsidian)命名的方式是将COL3类型的网格(mesh)以_C2表示。此种命名方式有助于工具的制作者将碰撞网格输出。
材质(Materials)在此没有使用到,所以猜测这里的Material字段只是因RIGD、SKIN、COL2、COL3以及WALK数据包间共享程序代码而多出来的。
(在此猜测COL2与COL3的意义是对应2D与3D碰撞,步行的区域(walkableareas)应该是指定2D碰撞,而3D碰撞是用来检查site/scanhit)
COL2 – Collision Mesh (Type 2) (碰撞网格 类型2)
| 类型
| 标签
| 描述
| char[4]
| Signature
| 文件签名– 永远是 ’COL2’
| uint32
| PacketSize
| 数据包大小
| char[32]
| Name
| 名称
| Material
| Material
| 纹理与材质的信息
| uint32
| NumVerts
| 顶点编号(Number of vertices)
| uint32
| NumFaces
| 面编号(Number of faces)
| CVert[NumVerts]
| Verts
| 碰撞顶点数(Collision Vertices)
| TRI[NumFaces]
| Faces
| 三角面数
| [2.4.2]COL3
这些碰撞网格目前我们还不详细,而且和模型不太一致。我们并不了解COL2与COL3的差异性。黑曜石(Obsidian)命名的方式是将COL2类型的网格(mesh)以_C3表示。此种命名方式有助于工具的制作者将碰撞网格输出。
材质(Materials)在此没有使用到,所以猜测这里的Material字段只是因RIGD、SKIN、COL2、COL3以及WALK数据包间共享程序代码而多出来的。
COL3 – Collision Mesh (Type 3) (碰撞网格 类型3)
| 类型
| 标签
| 描述
| char[4]
| Signature
| 文件签名– 永远是’COL3’
| uint32
| PacketSize
| 数据包大小
| char[32]
| Name
| 名称
| Material
| Material
| 纹理与材质的信息
| uint32
| NumVerts
| 顶点编号(Number of vertices)
| uint32
| NumFaces
| 面编号(Number of faces)
| CVert[NumVerts]
| Verts
| 碰撞顶点数
| TRI[NumFaces]
| Faces
| 三角面数
| [2.4.3]CVERT
碰撞顶点(collisionvertex)有位置与法线的信息。在此Normal与UVW的字段似乎没用到。
CVert – Collision Vertex (碰撞顶点)
| 类型
| 标签
| 描述
| Point3
| Position
| 位置
| Point3
| Normal
| 法线
| Point3
| UVW
| 纹理顶点(Texture vertex)
| [2.4.4]COLS
COLS数据包似乎为表示碰撞球(collisionspheres)的动画对象(animatedobjects)。球体可以简单测试故为碰撞侦测的最佳对象。此结构似乎会参考皮肤网格(skinnedmeshes)的骨架(skeleton)里的骨头(bones)。
COLS – Collision Spheres (碰撞球)
| 类型
| 标签
| 描述
| char[4]
| Signature
| 文件签名 – 永远是 ’COLS’
| uint32
| PacketSize
| 数据包大小
| uint32
| NumItems
| 碰撞球项目的编号(Number of Collision Sphere Items)
| COLSITM[NumItems]
| Spheres
| 碰撞球数组(Collision Sphere Array)
| [2.4.5]COLSITM
碰撞球项目(CollisionSphere item)似乎是以骨头索引选择球半径映像
COLSITM – Collision Sphere Item (碰撞球项目)
| 类型
| 标签
| 描述
| uint32
| Index
| 骨头索引(Bone Index)
| Float
| Radius
| 半径(Radius)
| [2.5]走路网格(WalkMesh)
走路网格是定义人物哪里可走,哪里不能走。有部份的格式尚未了解,这可能影响人物在网格上行走时是否会有材质/声音的效果。
[2.5.1]走路(WALK)
走路网格(Walkmeshes)是用来控制你哪里可以走,哪里不可以走。
一些顶点具有不寻常的数值如-1,000,000表明连接到其他走路网格或可能是不允许通行的地形。在3dStudio Max软件里,你可能想使用Quad/Tri路径(Patches)来建立。走路网格(Walkmesh)有一个旗标(flag)是未知的,我们目前默认为0x21(十进制表示33)。此类网格的命名是以加上_w表示。
WALK – Walk Mesh (走路网格)
| 类型
| 标签
| 描述
| char[4]
| Signature
| 文件签名 – 永远是 ’WALK’
| uint32
| PacketSize
| 数据包大小
| char[32]
| Name
| 名称
| uint32
| uiFlags
| 不清楚。永远是0
| uint32
| NumVerts
| 顶点编号(Number of vertices)
| uint32
| NumFaces
| 面编号(Number of faces)
| Point3[NumVerts]
| Position of the verts
| 碰撞顶点(Collision Vertices)
| WTRI[NumFaces]
| Faces
| 走路网格三角面(Walk Mesh Triangle Faces)
| [2.5.2]WTRI
走路网格的三角结构(Walkmesh triangle structure)被当作走路网格(Walkmesh)的格式,它包含了顶点的索引,而顶点的索引是用来定义网格上的面。
WTRI – Walk mesh triangle face (走路网格三角面)
| 类型
| 标签
| 描述
| uint16
| a
| 三角顶点1(Triangle Vertex 1)
| uint16
| b
| 三角顶点2(Triangle Vertex 2)
| uint16
| c
| 三角顶点3(Triangle Vertex 3)
| uint32
| flags
| 位旗标(bit flag) –下面有详细细节
| 位旗标设置如下,请注意你不应该使用超过1个以上的材质类型(materialtype)并且不要使用保留的位(reservedbits)。
Bit settings for walk triangles (走路网格的位设定)
译者注:每个bit只能0或1,0表示不启动,1表示启动
| 类型
| 描述
| bit 0
| 是否可走位,0=不能走,1=可以走
(Walkable Bit, 0=non-walkable 1=walkable)
| bit 1-2
| 保留字(reserved)
| bit 3
| 土(dirt)
| bit 4
| 草(grass)
| bit 5
| 石头(stone)
| bit 6
| 木头(wood)
| bit 7
| 地毯(carpet)
| bit 8
| 金属(metal)
| bit 9
| 沼泽(swamp)
| bit 10
| 泥浆(mud)
| bit 11
| 叶子(leaves)
| bit 12
| 水(water)
| bit 13
| 水洼(puddles)
| bit 14-32
| 保留字(Reserved)
| [2.6]钩点(HookPoints)
钩点(Hookpoints)就是游戏里带有目的的编号。它的主要目的就是纪录门的位置、门打开时所朝的方向。
[2.6.1]HookPointSize
HookPointSize是由.NET所定义但目前对它是如何使用在MDB格式尚有疑惑,因为enumeration并没有使用.NET的代码。
enumHookPointSize : uint16
{
StandardDoor,
LargeDoor,
GateDoor
}
[2.6.2]HookPointType
HookPointType是由.NET所定义但目前对它是如何使用在MDB格式尚有疑惑,因为enumeration并没有使用.NET的代码。
enumHookPointType : uint16
{
Door,
Accessory,
None
}
[2.6.3]HOOK
钩点(Hookpoints)是1.装设门以及2.补助刚体网格。门都是朝向东,以Z轴为枢纽进行移动,故门的摆动方向是由Y轴到X轴。钩点的命名由”hp_”为开头,跟在后面的号码自1开始计数。
HOOK – Hook Point
| 类型
| 标签
| 描述
| char[4]
| Signature
| 文件签名– 永远是 ’HOOK’
| uint32
| PacketSize
| 数据包大小
| char[32]
| Name
| 名称
| HookPointType
| Type?
| Hook Point Type (? – 永远是0) (uint16)
| HookPointSize
| Size?
| Hook Point Size (? –永远是0) (uint16)
| Point3
| Position
| 位置
| RHMatrix
| Orientation
| 右手旋转矩阵(Right-handed Rotation Matrix)
| [2.7]头发与头盔点(Hairand Helm Points)
Hairand Helm points是用来控制头盔以及决定其他物品是否在穿戴时覆盖头发。
[2.7.1]MDBHairShorteningBehavior
旗标(Flag)控制头发的长短。
enumMDBHairShorteningBehavior : uint32
{
HSB_LOW,
HSB_SHORT,
HSB_PONYTAIL
}
[2.7.2]头发(HAIR)
头发显然是人物的头发性质。它不是网格(mesh)但是它有影响头发长短行为的旗标(flag)。头发位置和方向的设定似乎不困难。(译者注:头发为何有方向性??)命名方式是使用”XXM_Hair”当作名称,前两个XX是采头发的特征当名称而M表示男性头发若为女性则以F表示。
HAIR – Hair Mesh (头发网格)
| 类型
| 标签
| 描述
| char[4]
| Signature
| 文件签名 – 永远是 ’HAIR’
| uint32
| PacketSize
| 数据包大小
| char[32]
| Name
| 名称
| MDBHairShorteningBehavior
| HairFlag
| 头发旗标(Hair Flag)
| Point3
| Position
| 位置
| RHMatrix
| Orientation
| 旋转(Rotation)
| [2.7.3]MDBHelmHairHidingBehavior
enumMDBHelmHairHidingBehavior : uint32
{
HHHB_NONE_HIDDEN,
HHHB_HAIR_HIDDEN,
HHHB_PARTIAL_HAIR,
HHHB_HEAD_HIDDEN
}
[2.7.4]头盔(HELM)
头盔(Helm)就是人物的头盔。它不是网格但是它决定头发是否要隐藏的旗标头盔位置与方向的设定似乎不困难。命名方式是以”XXM_Helm”当作名称,前两个XX是以头盔的特征来命名,M表示男性头盔,女性头盔则是将M改成F。
HELM – Helmet Mesh (头盔材质)
| 类型
| 标签
| 描述
| char[4]
| Signature
| 文件签名 – 永远是 ’HELM’
| uint32
| PacketSize
| 数据包大小
| char[32]
| Name
| 名称
| MDBHelmHairHidingBehavior
| HelmFlag
| 头盔头发隐藏旗标(Helmet Hair Hiding Flag )
| Point3
| Position
| 位置
| RHMatrix
| Orientation
| 旋转(Rotation)
| [3]常见的数据类型(CommonData Types)
[3.1]Point3
一个相当标准的结构决定3维坐标(3-dimensionalcoordinates)。可能是数组(Array)或独立的x、y、z数,数值由你决定。
Point3
| 类型
| 标签
| 描述
| float[3]
| xyz
| x/y/z-坐标(x/y/z – coordinates)
| [3.2]Color3
一个相当标准的结构决定颜色,颜色的数值是在范围0到1间选择。
Color3
| 类型
| 标签
| 描述
| float[3]
| Rgb
| RGB色彩信息(rgb color information)
| [3.3]四元数(Quat)
四元数(Quaternions)是以相当紧凑的方式决定对象的旋转,且仍然具有良好的效能。所有旋转方向都是以右手为准。
Quat – Quaternion
| 类型
| 标签
| 描述
| float[4]
| Wxyz
| WXYZ数值用来存放旋转的信息(WXYZ values for storing rotation information)
| [3.4]RHMatrix
RHMatrix表示右手旋转矩阵。大规模的信息可以保存在矩阵里,但游戏目前尚未使用到。
RHMatrix
| 类型
| 标签
| 描述
| float[3][3]
| m
| 右手旋转矩阵(Right Handed Matrix )
| [3.5]材质(Material)
材质(material)的数据类型是放置关于对象的纹理贴图、颜色与发光(shininess)。大多数的网格(mesh)均被视为材质(material)不管它实际的代表意义。(像碰撞网格(collisionmeshes)。)
Material (材质)
| 类型
| 标签
| 描述
| char[32]
| DiffuseMap
| 扩散贴图(Diffuse Map)
| char[32]
| NormalMap
| 法线贴图(Normal Map)
| char[32]
| TintMap
| 地图的RGB贴图(RGB Tint Map)
| char[32]
| GlowMap
| 光辉贴图(Glow Map)
| Point3
| Kd
| 扩散颜色(Diffuse Color)
| Point3
| Ks
| 反射颜色(Specular Color)
| float
| SpecularPower
| 反射型态-发光/光泽的
(Specular Power – Shininess/Glossiness)
| float
| SpecularValue
| 反射数值-发光强度
(Specular Value – Shininess Strength in max)
| uint32
| uiFlags
| 纹理旗标(Texture Flags)
| 以下表格是介绍与使用纹理(texture)的旗标位(flagbits)。有些是猜测的,可能不正确。
Texture Flags (纹理旗标)
| 旗标名称
(Flag Name)
| 旗标代码
(Flag Code)
| 纪录
| Alpha_测试
(Alpha_Test)
| 1 (0x01)
| Alpha贴图在混合贴图的灰色低于50%下不使用。
(alpha map values from the diffuse map below 50% grey are not drawn)
| Alpha混合
(Alpha Blend)
| 2 (0x02)
| 不应使用,效能或不执行?
(Should not be used, performance or not implemented ?)
| 迭加性混合
(Additive Blend)
| 4 (0x04)
| 不应使用,效能或不执行?
Should not be used, performance or not implemented ?
| 环境贴图(Environment Mapping)
| 8 (0x08)
| 对对象创造一个镜像(Creates a mirroring effect on the object)
| Cutscene网格
(Cutscene Mesh)
| 16 (0x10)
| 可能是网格的最高分辩率仅能用于cutscenes
(Likely for highest resolution meshes only used in cutscenes)
| 光辉
(Glow)
| 32 (0x20)
| 启动照明贴图建立光辉的影响
(Enables the illumination map to create a glowing effect)
| 不蒙上阴影
(No_Cast_Shadows)
| 64 (0x40)
| 不蒙上阴影
| 预测纹理
(Projected Textures)
| 128 (0x80)
| 此预测纹理旗标是指模型接受用户接口预测的纹理如拼写定位光标。参考NWN2讨论区的设计者区块。
(The projected texture flag means that the model will accept UI projected textures such as the spell targeting cursor. Per a DEV post on NWN2 Forum)
| |
评分
-
查看全部评分
|