您的位置:首页 > 产品设计 > 产品经理

PMD格式(头文件)

2015-11-29 22:57 579 查看
                写在前面:很久之前的东东了,现在基本也没有用了,但是查看模型源文件能够用于帮助自己理解3D模型。最近在赶项目,虽然有的Demo已经整理出来了但是没时间写Orz。月末转一篇,期待以后能够补上,做到月更,见证自己成长。

#define MODEL_NAME_LENGTH 20
#define COMMENT_LENGTH 256
#define ELEMENT_NAME_LENGTH 20 #define UVMAP_NAME "Texture"
#define NORMALMAP_NAME "PMDNormal"
#define EDGELINE_NAME "PMDEdgeLine" 

#define PTAG_PMDB LWID_('P','M','D','B') // bone param
// "%hd %hu %u %hu", boneElement[].parentIdx, boneElement[].tipIdx, boneElement[].type, boneElement[].refIdx
#define PTAG_PMDK LWID_('P','M','D','K') // ik param
// "%hu %hu %u %hu %f", ikElement[].rootBoneIdx, ikElement[].tipBoneIdx, ikElement[].boneNum, ikElement[].param, ikElement[].paramF
#define PTAG_PMDI LWID_('P','M','D','I') // ik chain boneIdxList(16进)
// "%04X ...", ikElement[].boneIdxs
,...
#define PTAG_PMDX LWID_('P','M','D','X') // lw pol index(16进) lw侧管カー用
// "%04X", boneIndex #define BTYPE_ROT 0 // 通常(回サモ)
#define BTYPE_MOV 1 // 通常(回サモ/移动)
#define BTYPE_CTL 2 // IK Ctl(回サモ/移动)
#define BTYPE_SEL 3 // 非表示/选ユス可
#define BTYPE_CHAIN 4 // IK Chain(回サモ)
#define BTYPE_REF 5 // 回サモ参矮(Refer Indexユ・墲、)
#define BTYPE_GOAL 6 // IK Goal
#define BTYPE_UNSEL 7 // 非表示/选ユス不可

// ===============================================================
#pragma pack(1) // ヌ聘アイメント禁止 #define PNT_ELEMENT_SIZE 38
typedef struct _pntElement{ // 38 byte 固定
float pos[3]; // 顶点座标
float norm[3]; // 顶点ノーオアル
float uv[2]; // リu
u_short boneIdx[2]; // ボーンindex
u_char wgt; // boneIdx[0]ヤロルヘェイト値
u_char eFlag; // エッニヘルアイン描画フルアグ(0:有り,1:无し)
} pntElement; // polElement は u_shortヤロノ缨・ #define SURF_ELEMENT_SIZE 70
typedef struct _surfElement{ // 70 byte 固定
float colrVal[3]; // 基本色
float tranVal; // 不ツァ明度
float glosVal; // グセ。ス
float specVal[3]; // スペルンュルアカルアー
float ambiVal[3]; // ヌ繝鸨ロエントカルアー
u_char shade_No; // シェールヌィング用イメーニヘNo.
u_char edgeLine; // エッニヘルアイン描画フルアグ(0:无し,1:有り)。1ユ・ナ定しpntElement.eFlagでヤロ指定を推奨


u_int nPols; // 割り当てるメレルュヌネン数(三角メレルュでヤロエッニヘ数イ狯ロで1/3するとメレルュヌネン数ユ・烽・
char textFileName[20]; // イメーニヘストクスチャ名
} surfElement; #define BONE_ELEMENT_SIZE 39
typedef struct _boneElement{ // 39 byte 固定
char name[ELEMENT_NAME_LENGTH]; // 名前
short parentIdx; // 亲index(-1:无し) (tag:PMDB)
u_short tipIdx; // 先端座标ユ・烽驿{ーンindex(tag:PMDB)
u_char type; // ボーンホアイプ (tag:PMDB)
u_short refIdx; // 参矮ボーンindex (tag:PMDB)
float pos[3];
} boneElement; #define IK_ELEMENT_SIZE 11
typedef struct _ikElement{ // 11 byte+ 不定
u_short rootBoneIdx; // 制御用ボーンindex (tag:PMDK)
u_short tipBoneIdx; // IKヌネールボーンindex (tag:PMDK)
u_char boneNum; // IKチェーンヤロ构成ボーン数 (tag:PMDK)
u_short param; // パルアメーホア (tag:PMDK)
float paramF; // パルアメーホア (tag:PMDK)
u_short *boneIdxs; // IKチェーンを构成するボーンindex (tag:PMDI)
} ikElement; #define SKINPNT_ELEMENT_SIZE 16
typedef struct _skinPntElement{ // 16 byte 固定
u_int destPntIdx; // 顶点index("base"时はpntElement[]ユ・ホするindex。他はskinElement[0].skinPntElm[]ユ・ホするindex)
float pos[3]; // 顶点座标("base"时はpntElement[].pos。他はpntElement[].posユ・ホする相対値。)
} skinPntElement; #define SKIN_ELEMENT_SIZE 25
typedef struct _skinElement{ // 25 byte+ 不定
char name[ELEMENT_NAME_LENGTH]; // モーフ名称(モーフが有る场合、skinElement[0]は"base"が予约)
u_int pntNum; // 対象顶点数
u_char grp; // UI上ヤログループNo.(0:予约、1-4)
skinPntElement *skinPntElm;
} skinElement; // treeSkinIndexs は u_shortヤロノ缨・ #define TREE_R_ELEMENT_SIZE 50
typedef struct _treeRootElement{ // 50 byte
char name[TREE_R_ELEMENT_SIZE]; // UI上ヤロルュストシロュー用亲阶层文字列
} treeRootElement; #define TREE_C_ELEMENT_SIZE 3
typedef struct _treeChildElement{ // 3 byte
u_short boneIdx; // boneElementヤロindex
u_char treeRootIdx; // treeRootElement[]ヤロindex
} treeChildElement; typedef struct _Pmd_Header{ // 283(3 + 4 + 20 + 256) byte
char head[3]; // ヘッダ"Pmd"
float version; // バーニヘョン(1.0)
char modelName[MODEL_NAME_LENGTH]; // モルヌル名
char comment[COMMENT_LENGTH]; // コメント
} Pmd_Header; #pragma pack() // ヌ聘アイメント禁止解除  
struct _Pmd_Data{
pntElement *pntElm; // 顶点要素
u_short *polElm; // メレルュヌネン要素
surfElement *surfElm; // 材质要素
boneElement *boneElm; // ボーン要素
ikElement *ikElm; // IK要素
skinElement *skinElm; // モーフ要素
u_short *treeSkinIdxs; // Tree表示用、モーフindex
treeRootElement *treeRootNames; // Tree表示用、亲阶层名
treeChildElement *treeChildElm; // Tree表示用、ボーンindex
u_int pntElmNum; // 顶点数
u_int polElmNum; // メレルュヌネン数(三角メレルュでヤロエッニヘ数イ狯ロで1/3するとメレルュヌネン数ユ・烽・
u_int surfElmNum; // 材质数
u_int treeChildNum; // Tree表示用、ボーン数
u_short boneElmNum; // ボーン数
u_short ikElmNum; // IKチェーン数
u_short skinElmNum; // モーフ数(无い场合は0、有る场合ユ・K要ユ・烽・base"も数ユ・ワむ)
u_char treeSkinNum; // Tree表示用、表情としてルュストする数
u_char treeRootNum; // Tree表示用、亲阶层数
} Pmd_Data;

// ===============================================================
// ===============================================================
#define MODEL_NAME_LENGTH 20
#define COMMENT_LENGTH 256
#define ELEMENT_NAME_LENGTH 20 #define UVMAP_NAME "Texture"
#define NORMALMAP_NAME "PMDNormal"
#define EDGELINE_NAME "PMDEdgeLine" #define PTAG_PMDB LWID_('P','M','D','B') // bone param
// "%hd %hu %u %hu", boneElement[].parentIdx, boneElement[].tipIdx, boneElement[].type, boneElement[].refIdx
#define PTAG_PMDK LWID_('P','M','D','K') // ik param
// "%hu %hu %u %hu %f", ikElement[].rootBoneIdx, ikElement[].tipBoneIdx, ikElement[].boneNum, ikElement[].param, ikElement[].paramF
#define PTAG_PMDI LWID_('P','M','D','I') // ik chain boneIdxList(16进)
// "%04X ...", ikElement[].boneIdxs
,...
#define PTAG_PMDX LWID_('P','M','D','X') // lw pol index(16进) lw侧管カー用
// "%04X", boneIndex #define BTYPE_ROT 0 // 通常(回サモ)
#define BTYPE_MOV 1 // 通常(回サモ/移动)
#define BTYPE_CTL 2 // IK Ctl(回サモ/移动)
#define BTYPE_SEL 3 // 非表示/选ユス可
#define BTYPE_CHAIN 4 // IK Chain(回サモ)
#define BTYPE_REF 5 // 回サモ参矮(Refer Indexユ・墲、)
#define BTYPE_GOAL 6 // IK Goal
#define BTYPE_UNSEL 7 // 非表示/选ユス不可 

// ===============================================================
#pragma pack(1) // ヌ聘アイメント禁止 #define PNT_ELEMENT_SIZE 38
typedef struct _pntElement{ // 38 byte 固定
float pos[3]; // 顶点座标
float norm[3]; // 顶点ノーオアル
float uv[2]; // リu
u_short boneIdx[2]; // ボーンindex
u_char wgt; // boneIdx[0]ヤロルヘェイト値 u_char eFlag; // エッニヘルアイン描画フルアグ(0:有り,1:无し)
} pntElement; // polElement は u_shortヤロノ缨・ #define SURF_ELEMENT_SIZE 70
typedef struct _surfElement{ // 70 byte 固定
float colrVal[3]; // 基本色
float tranVal; // 不ツァ明度
float glosVal; // グセ。ス
float specVal[3]; // スペルンュルアカルアー
float ambiVal[3]; // ヌ繝鸨ロエントカルアー
u_char shade_No; // シェールヌィング用イメーニヘNo.
u_char edgeLine; // エッニヘルアイン描画フルアグ(0:无し,1:有り)。1ユ・ナ定しpntElement.eFlagでヤロ指定を推奨
u_int nPols; // 割り当てるメレルュヌネン数(三角メレルュでヤロエッニヘ数イ狯ロで1/3するとメレルュヌネン数ユ・烽・
char textFileName[20]; // イメーニヘストクスチャ名
} surfElement;

#define BONE_ELEMENT_SIZE 39
typedef struct _boneElement{ // 39 byte 固定
char name[ELEMENT_NAME_LENGTH]; // 名前
short parentIdx; // 亲index(-1:无し) (tag:PMDB)
u_short tipIdx; // 先端座标ユ・烽驿{ーンindex(tag:PMDB)
u_char type; // ボーンホアイプ (tag:PMDB)
u_short refIdx; // 参矮ボーンindex (tag:PMDB)
float pos[3];
} boneElement; #define IK_ELEMENT_SIZE 11
typedef struct _ikElement{ // 11 byte+ 不定
u_short rootBoneIdx; // 制御用ボーンindex (tag:PMDK)
u_short tipBoneIdx; // IKヌネールボーンindex (tag:PMDK)
u_char boneNum; // IKチェーンヤロ构成ボーン数 (tag:PMDK)
u_short param; // パルアメーホア (tag:PMDK) float paramF; // パルアメーホア (tag:PMDK)
u_short *boneIdxs; // IKチェーンを构成するボーンindex (tag:PMDI)
} ikElement; #define SKINPNT_ELEMENT_SIZE 16
typedef struct _skinPntElement{ // 16 byte 固定
u_int destPntIdx; // 顶点index("base"时はpntElement[]ユ・ホするindex。他はskinElement[0].skinPntElm[]ユ・ホするindex)
struct _Pmd_Data{
pntElement *pntElm; // 顶点要素
u_short *polElm; // メレルュヌネン要素
surfElement *surfElm; // 材质要素
boneElement *boneElm; // ボーン要素
ikElement *ikElm; // IK要素
skinElement *skinElm; // モーフ要素
u_short *treeSkinIdxs; // Tree表示用、モーフindex
treeRootElement *treeRootNames; // Tree表示用、亲阶层名
treeChildElement *treeChildElm; // Tree表示用、ボーンindex
u_int pntElmNum; // 顶点数
u_int polElmNum; // メレルュヌネン数(三角メレルュでヤロエッニヘ数イ狯ロで1/3するとメレルュヌネン数ユ・烽・
u_int surfElmNum; // 材质数
u_int treeChildNum; // Tree表示用、ボーン数
u_short boneElmNum; // ボーン数
u_short ikElmNum; // IKチェーン数
u_short skinElmNum; // モーフ数(无い场合は0、有る场合ユ・K要ユ・烽・base"も数ユ・ワむ)
u_char treeSkinNum; // Tree表示用、表情としてルュストする数
u_char treeRootNum; // Tree表示用、亲阶层数
} Pmd_Data; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  3d