3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 3161|回复: 4
打印 上一主题 下一主题

[资料] [文件翻譯]Neverwinter Nights 2 的MDB格式

[复制链接]

0

主题

134

帖子

290

积分

高级玩家

Rank: 4

贡献度
39
金元
1343
积分
290
精华
0
注册时间
2006-10-21
跳转到指定楼层
主题
发表于 2008-12-20 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Neverwinter Nights 2 的MDB格式
翻译自 NWN2Wiki[http://nwn2.wikia.com/wiki/MDB_Format]
翻译者:福尔摩沙的希望骑士
注:若有翻译不顺或是看不懂请见谅
此维基是描述绝冬城之夜2里目前所理解的的MDB格式,MDB的主要用途就是游戏里的3D对象。

有表格的PDF版(正體中文)下載處:
http://Knighthsuyucheng.googlepages.com/NeverwinterNights_MDB_Format.pdf

内容
[1]文件標頭(File Header) 1
[1.1]MDB標頭(MDBHeader) 1
[1.2]MDBPacketKey 1
[2]數據包(Packets) 2
[2.1] 共有的(Common) 2
[2.1.1]MDB數據包(MDBPacket) 2
[2.1.2] TRI 2
[2.2]剛體(Rigid Body) 3
[2.2.1]RIGD 3
[2.2.2]RVERT – 剛體頂點(Rigid Body Vertex) 4
[2.3]皮膚物體(Skinned Body) 4
[2.3.1]皮膚(SKIN) 4
[2.3.2]SVERT – 皮膚頂點(Skin Vertex) 5
[2.4] 碰撞網格(Collision Mesh) 6
[2.4.1]COL2 6
[2.4.2]COL3 6
[2.4.3] CVERT 7
[2.4.4] COLS 8
[2.4.5]COLSITM 8
[2.5]走路網格(Walk Mesh) 8
[2.5.1] 走路(WALK) 8
[2.5.2]WTRI 9
[2.6] 鉤點(Hook Points) 10
[2.6.1]HookPointSize 11
[2.6.2] HookPointType 11
[2.6.3]HOOK 11
[2.7]頭髮與頭盔點(Hair and Helm Points) 12
[2.7.1]MDBHairShorteningBehavior 12
[2.7.2]頭髮(HAIR) 13
[2.7.3]MDBHelmHairHidingBehavior 13
[2.7.4]頭盔(HELM) 14
[3]常見的數據類型(Common Data Types) 14
[3.1]Point3 14
[3.2]Color3 14
[3.3]四元數(Quat) 15
[3.4]RHMatrix 15
[3.5] 材質(Material) 15


[1]文件标头(File Header)
所有的MDB档案一开始就有一个标头、特殊的签名(signature)以及版本信息,并列出有效的数据包(packets)。列出有效的数据包是用来定义文件是包含了哪些种类的数据,以及数据是位于文件的哪里。
[1.1]MDB标头(MDBHeader)
一个简单的标头区块,内含版本信息以及有效数据。
MDBHeader
类型 标签 描述
char[4] Signature 档案签名 – 永远是’NWN2’
uint16 MajorVer 主要版本编号
uint16 MinorVer 次要版本编号
uint32 NumPackets 数据包的编号
MDBPacketKey[NumPackets] Packets 数据包数组
[1.2]MDBPacketKey
packet key定义持有的数据包种类以及该种类所在位置
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)格式,以顶点索引(indices of the vertices)来定义面的网格。
TRI – Triangle (三角形)
类型 标签 描述
uint16[3] Verts 以顶点索引定义一个三角形面
[2.2]刚体(Rigid Body)
[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 – 刚体顶点(Rigid Body Vertex)
刚体顶点包含了刚体网格特定顶点(specific vertex)的所有讯息,它包含了切线位置、次切线方向以及纹理位置。
RVert – Rigid Body Vertex(刚体顶点)
类型 标签 描述
Point3 Position 位置
Point3 Normal 法线
Point3 Tangent 切线
Point3 Binormal 次法线(Binormal)
Point3 UVW 纹理顶点(Texture vertex)
[2.3]皮肤物体(Skinned Body)
皮肤物体是受操控的刚体,所以基本骨架(skeletion)移动时它就会变形。
[2.3.1]皮肤(SKIN)
皮肤对象(Skinned objects)如同生物的皮肤对象。 它们通常和骨骼绑在一起且此结构包含了重量以及顶点的网格。(These are usually bound to a skeleton and this structure holds the weights as well as the vertices for a mesh.)骨架的骨骼若和动画有关的就不包含在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 – 皮肤顶点(Skin Vertex)
皮肤顶点结构就如同刚体顶点,但还具备了骨头重量、哪个骨头可以使网格变形的(bones can 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] 碰撞网格(Collision Mesh)
皮肤物体(Skinned bodies)是被操控的物体,当基本骨架移动时就会改变。
[2.4.1]COL2
这些碰撞网格目前我们还不详细,而且和模型不太一致。我们并不了解COL2与COL3的差异性。黑曜石(Obsidian)命名的方式是将COL3类型的网格(mesh)以_C2表示。此种命名方式有助于工具的制作者将碰撞网格输出。
材质(Materials)在此没有使用到,所以猜测这里的Material字段只是因RIGD、SKIN、COL2、COL3以及WALK数据包间共享程序代码而多出来的。
(在此猜测COL2与COL3的意义是对应2D与3D碰撞,步行的区域(walkable areas)应该是指定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
碰撞顶点(collision vertex)有位置与法线的信息。 在此Normal与UVW的字段似乎没用到。
CVert – Collision Vertex (碰撞顶点)
类型 标签 描述
Point3 Position 位置
Point3 Normal 法线
Point3 UVW 纹理顶点(Texture vertex)
[2.4.4] COLS
COLS 数据包似乎为表示碰撞球(collision spheres)的动画对象(animated objects)。球体可以简单测试故为碰撞侦测的最佳对象。此结构似乎会参考皮肤网格(skinned meshes)的骨架(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
碰撞球项目(Collision Sphere item)似乎是以骨头索引选择球半径映像
COLSITM – Collision Sphere Item (碰撞球项目)
类型 标签 描述
uint32 Index 骨头索引(Bone Index)
Float Radius 半径(Radius)
[2.5]走路网格(Walk Mesh)
走路网格是定义人物哪里可走,哪里不能走。有部份的格式尚未了解,这可能影响人物在网格上行走时是否会有材质/声音的效果。
[2.5.1] 走路(WALK)
走路网格(Walk meshes)是用来控制你哪里可以走,哪里不可以走。
一些顶点具有不寻常的数值如-1,000,000表明连接到其他走路网格或可能是不允许通行的地形。在3d Studio Max软件里,你可能想使用Quad/Tri路径(Patches)来建立。 走路网格(Walk mesh)有一个旗标(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
走路网格的三角结构(Walk mesh triangle structure)被当作走路网格(Walk mesh)的格式,它包含了顶点的索引,而顶点的索引是用来定义网格上的面。
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个以上的材质类型(material type)并且不要使用保留的位(reserved bits)。
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] 钩点(Hook Points)
钩点(Hook points)就是游戏里带有目的的编号。它的主要目的就是纪录门的位置、门打开时所朝的方向。
[2.6.1]HookPointSize
HookPointSize是由.NET所定义但目前对它是如何使用在MDB格式尚有疑惑,因为enumeration并没有使用.NET的代码。
enum HookPointSize : uint16
{
StandardDoor,
LargeDoor,
GateDoor
}
[2.6.2] HookPointType
HookPointType是由.NET所定义但目前对它是如何使用在MDB格式尚有疑惑,因为enumeration并没有使用.NET的代码。
enum HookPointType : uint16
{
Door,
Accessory,
None
}
[2.6.3]HOOK
钩点(Hook points) 是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]头发与头盔点(Hair and Helm Points)
Hair and Helm points是用来控制头盔以及决定其他物品是否在穿戴时覆盖头发。
[2.7.1]MDBHairShorteningBehavior
旗标(Flag)控制头发的长短。
enum MDBHairShorteningBehavior : 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
enum MDBHelmHairHidingBehavior : 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]常见的数据类型(Common Data Types)
[3.1]Point3
一个相当标准的结构决定3维坐标(3-dimensional coordinates)。可能是数组(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)不管它实际的代表意义。(像碰撞网格(collision meshes)。)
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)的旗标位(flag bits)。有些是猜测的,可能不正确。
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)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-3-31 21:34 , Processed in 0.028237 second(s), 15 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表