转载请注明出处,这样小编会很有成就感
作者:bilibili->墨色小风 (点个关注不迷路)
本文中的描述术语可能不专业,但更贴近中文理解。方便初学者简单清晰的理解。
*.pmx 文件是 mmd(MikuMIkuDance)的专用模型文件,其中包括 独立3D物体模型的全部信息。
可以存放3d物体与人物模型,以及模型的物理运动规则。
PMX文件的详细数据可以用 PmxEditor 软件来进行编辑查看
具体数据模块按照解析顺序有:
1.模型顶点信息
2.三角形面信息
3.贴图文件引用
4.材料数据信息
5.骨骼数据信息
6.表情数据信息
7.框架数据信息
8.刚体数据信息
9.关节数据信息
最后可能还有柔体信息,但我没用到,没研究
整个PMX模型文件在程序中的运行逻辑模型大概是
根据 1~4 模块组的数据模块来进行图形渲染,
根据 5 之后的数据信息来进行模型物理移动的计算
对于想要读取模型数据的小伙伴来说
前面几项比较重要,后面的比较复杂,
笔者没有详细使用的地方只简单讲讲,
不过数据变量名与PmxEditor软件能够对应,
具体可以学习MMD模型制作与PmxEditor软件使用相关教程。
如果日后详细用到可能会发新文补充。
如有想要详细学习的小伙伴可自行研究交流探讨,
在看过下文的数据结构的简单讲解之后自行研究应该不是什么难事。
对于数据类型的描述,我习惯以类似这样的方式描述:
byte1 : 1字节整数
byte2 : 2字节整数
byte4 : 4字节整数
byte8 : 8字节整数
byte.4 : 4字节小数(浮点数)
byte.8 : 8字节小数(浮点数)
byte4text : 4字节整数记录后续文本的字节数
下面按文件地址数据顺序一个一个进行解析
目录
首先打开一个 PMX文件
首先是文件头
{
byte4 文件标头 = "PMX "; // 通常固定
byte.4 版本号 = 2; // 通常为2
byte1 数据列字节尺寸 = 8; // 通常固定
byte1 编码方式 = ?; // 0:UTF-16LE 或 1:UTF-8
byte1 UV追加 = ?; // (1.模型顶点信息)中用到
byte1 顶点Index尺寸 = ?; // 2或4,寻址单元字节大小
byte1 纹理Index尺寸 = ?; // 2或4,寻址单元字节大小
byte1 材料Index大小 = ?; // 2或4,寻址单元字节大小
byte1 骨骼Index大小 = ?; // 2或4,寻址单元字节大小
byte1 形态Index大小 = ?; // 2或4,寻址单元字节大小
byte1 刚体Index大小 = ?; // 2或4,寻址单元字节大小
byte4text 模型名;
byte4text 模型名(英语);
byte4text 打开时提示;
byte4text 打开时提示(英语);
// 之后的文件数据 是 1~9 具体的数据模块按照解析顺序有:
byte4 模型顶点信息个数;
模型顶点信息[模型顶点信息个数];
byte4 三角形面信息个数;
三角形面信息[三角形面信息个数/3]; // 这里要除3
byte4 贴图文件个数;
贴图文件引用[贴图文件个数];
byte4 材料数据信息个数;
材料数据信息[材料数据信息个数];
byte4 骨骼数据信息个数;
骨骼数据信息[骨骼数据信息个数];
byte4 表情数据信息个数;
表情数据信息[表情数据信息个数];
byte4 框架数据信息个数;
框架数据信息[框架数据信息个数];
byte4 刚体数据信息个数;
刚体数据信息[刚体数据信息个数];
byte4 关节数据信息个数;
关节数据信息[关节数据信息个数];
byte4 柔体数据信息个数;
柔体数据信息[柔体数据信息个数];
...
}
通常情况下 PMX文件标头会以4字节 "PMX " 开头
有的版本好像略有差别
版本号=2,感觉不会变了,因为大家用习惯了,2.0版本的数据结构也较为合理,没有太多改进的必要。
数据列字节尺寸 应该必须=8
编码方式:记录着文件中所有的文本数据的编码方式,当前文件中的文本都要以这样的方式显示
=0时 按 UTF-16LE 字体编码格式存储文本
=1时 按 UTF-8 字体编码格式存储文本
其他值可以自定义,其他软件有可能不支持
UV追加 : (1.模型顶点信息)中用到
之后的6个变量记录的是对于寻址是 寻址单元的字节大小。
就是变量类型占用的字节数。
这样做是为了节省文件体积,
列如顶点个数小于65535,顶点下标可以用2字节整数表示
每个面记录3个顶点下标就能比4字节下标节省 3*(4-2)=6byte 数据