设为首页收藏本站新闻投稿

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 923|回复: 2

[求助] 为虾米ms3d文件内部找不到骨骼权重信息类??有米人知道丫 [复制链接]

Rank: 2

帖子
2
精华
0
声望
61 点
金币
20 Mold
被赞许
0 次
注册时间
2011-1-30
发表于 2011-1-30 12:03:33 |显示全部楼层
最近在做读取ms3d的程序,官网找来的顶点结构是这样的
struct ms3d_vertex_t
{
        unsigned char flags;
        float vertex[3];
        char boneId;
        unsigned char referenceCount;
        char boneIds[3];
        unsigned char weights[3];
        unsigned int extra;
        float renderColor[3];
};

可是在读取的时候,发现文件内含有的信息是这样的!
struct ms3d_vertex_t
{
        unsigned char flags;
        float vertex[3];
        char boneId;
        unsigned char referenceCount;
};

为神马类???难道说文件内没有存储权重等信息?那为神马用milkshape 3d打开就有权重信息类?
神啊!!快来把瓦带出纠结的地狱吧。。。。5555555555.。。
已有 1 人评分声望 金币 收起 理由
阿发 + 50 + 10 精品文章

总评分: 声望 + 50  金币 + 10   查看全部评分

使用道具 举报

Super Moderator

此人已辞职,有事找别人.

Rank: 10Rank: 10Rank: 10

帖子
2341
精华
3
声望
9852 点
金币
3913 Mold
被赞许
-37 次
注册时间
2004-7-17

Modchina元老

发表于 2011-1-30 14:33:32 |显示全部楼层
幸会高手

请确认一下ms3d文件的版本。ms3d好像1.8x版本之后才开始引入权重的概念。

建议去用fragMotion导出一个带权重绑定的ms3d文件看看。
此号待删除,不再登陆.

使用道具 举报

Rank: 2

帖子
2
精华
0
声望
61 点
金币
20 Mold
被赞许
0 次
注册时间
2011-1-30
发表于 2011-1-30 15:02:25 |显示全部楼层
本帖最后由 space3344 于 2011-1-30 21:22 编辑

回复 阿发 的帖子

嘻嘻~~~不是高手不是高手,瓦神马都不懂的~
找了一上午,终于找到了些相关的东东,贴出来给需要的人做个参考~~

我用的是Milkshape 3D 1.8.2,1.8.5版本的格式会不太一样的哦!

ms3d文件的注释、权重等信息是放在文件的最后,ms3dV1.8.2的完整的格式是酱紫得~~~
//
// First comes the header (sizeof(ms3d_header_t) == 14)
//
typedef struct
{
    char    id[10];                                     // always "MS3D000000"
    int     version;                                    // 4
} ms3d_header_t;

//
// Then comes the number of vertices
//
word nNumVertices; // 2 bytes

//
// Then come nNumVertices times ms3d_vertex_t structs (sizeof(ms3d_vertex_t) == 15)
//
typedef struct
{
    byte    flags;                                      // SELECTED | SELECTED2 | HIDDEN
    float   vertex[3];                                  //
    char    boneId;                                     // -1 = no bone
    byte    referenceCount;
} ms3d_vertex_t;

//
// Then comes the number of **s
//
word nNum**s; // 2 bytes

//
// Then come nNum**s times ms3d_**_t structs (sizeof(ms3d_**_t) == 70)
//
typedef struct
{
    word    flags;                                      // SELECTED | SELECTED2 | HIDDEN
    word    vertexIndices[3];                           //
    float   vertexNormals[3][3];                        //
    float   s[3];                                       //
    float   t[3];                                       //
    byte    smoothingGroup;                             // 1 - 32
    byte    groupIndex;                                 //
} ms3d_**_t;

//
// Then comes the number of groups
//
word nNumGroups; // 2 bytes

//
// Then come nNumGroups times groups (the sizeof a group is dynamic, because of **Indices is num**s long)
//
typedef struct
{
    byte            flags;                              // SELECTED | HIDDEN
    char            name[32];                           //
    word            num**s;                       //
    word            **Indices[num**s];      // the groups group the **s
    char            materialIndex;                      // -1 = no material
} ms3d_group_t;

//
// number of materials
//
word nNumMaterials; // 2 bytes

//
// Then come nNumMaterials times ms3d_material_t structs (sizeof(ms3d_material_t) == 361)
//
typedef struct
{
    char            name[32];                           //
    float           ambient[4];                         //
    float           diffuse[4];                         //
    float           specular[4];                        //
    float           emissive[4];                        //
    float           shininess;                          // 0.0f - 128.0f
    float           transparency;                       // 0.0f - 1.0f
    char            mode;                               // 0, 1, 2 is unused now
    char            texture[128];                        // texture.bmp
    char            alphamap[128];                       // alpha.bmp
} ms3d_material_t;

//
// save some keyframer data
//
float fAnimationFPS; // 4 bytes
float fCurrentTime; // 4 bytes
int iTotalFrames; // 4 bytes

//
// number of joints
//
word nNumJoints; // 2 bytes

//
// Then come nNumJoints joints (the size of joints are dynamic, because each joint has a differnt count of keys
//
typedef struct // 16 bytes
{
    float           time;                               // time in seconds
    float           rotation[3];                        // x, y, z angles
} ms3d_keyframe_rot_t;

typedef struct // 16 bytes
{
    float           time;                               // time in seconds
    float           position[3];                        // local position
} ms3d_keyframe_pos_t;

typedef struct
{
    byte            flags;                              // SELECTED | DIRTY
    char            name[32];                           //
    char            parentName[32];                     //
    float           rotation[3];                        // local reference matrix
    float           position[3];

    word            numKeyFramesRot;                    //
    word            numKeyFramesTrans;                  //

    ms3d_keyframe_rot_t keyFramesRot[numKeyFramesRot];      // local animation matrices
    ms3d_keyframe_pos_t keyFramesTrans[numKeyFramesTrans];  // local animation matrices
} ms3d_joint_t;

//
// Then comes the subVersion of the comments part, which is not available in older files
//
int subVersion; // subVersion is = 1, 4 bytes

// Then comes the numer of group comments
unsigned int nNumGroupComments; // 4 bytes

//
// Then come nNumGroupComments times group comments, which are dynamic, because the comment can be any length
//
typedef struct
{
        int index;                // index of group, material or joint
        int commentLength;                // length of comment (terminating '\0' is not saved), "MC" has comment length of 2 (not 3)
        char comment[commentLength];                // comment
} ms3d_comment_t;

// Then comes the number of material comments
int nNumMaterialComments; // 4 bytes

//
// Then come nNumMaterialComments times material comments, which are dynamic, because the comment can be any length
//

// Then comes the number of joint comments
int nNumJointComments; // 4 bytes

//
// Then come nNumJointComments times joint comments, which are dynamic, because the comment can be any length
//

// Then comes the number of model comments, which is always 0 or 1
int nHasModelComment; // 4 bytes

//
// Then come nHasModelComment times model comments, which are dynamic, because the comment can be any length
//


// Then comes the subversion of the vertex extra information like bone weights, extra etc.
int subVersion;                // subVersion is = 2, 4 bytes

// ms3d_vertex_ex_t for subVersion == 1
typedef struct
{
        char boneIds[3];        // index of joint or -1, if -1, then that weight is ignored, since subVersion 1
        byte weights[3];        // vertex weight ranging from 0 - 255, last weight is computed by 1.0 - sum(all weights), since subVersion 1
        // weight[0] is the weight for boneId in ms3d_vertex_t
        // weight is the weight for boneIds[0]
        // weight[2] is the weight for boneIds
        // 1.0f - weight[0] - weight - weight[2] is the weight for boneIds[2]
} ms3d_vertex_ex_t;

// ms3d_vertex_ex_t for subVersion == 2
typedef struct
{
        char boneIds[3];        // index of joint or -1, if -1, then that weight is ignored, since subVersion 1
        byte weights[3];                // vertex weight ranging from 0 - 100, last weight is computed by 1.0 - sum(all weights), since subVersion 1
        // weight[0] is the weight for boneId in ms3d_vertex_t
        // weight[1] is the weight for boneIds[0]
        // weight[2] is the weight for boneIds[1]
        // 1.0f - weight[0] - weight[1] - weight[2] is the weight for boneIds[2]
        unsigned int extra;        // vertex extra, which can be used as color or anything else, since subVersion 2
} ms3d_vertex_ex_t;

// Then comes nNumVertices times ms3d_vertex_ex_t structs (sizeof(ms3d_vertex_ex_t) == 10)

// Then comes the subversion of the joint extra information like color etc.
int subVersion;                // subVersion is = 2, 4 bytes

// ms3d_joint_ex_t for subVersion == 1
typedef struct
{
        float color[3];        // joint color, since subVersion == 1
} ms3d_joint_ex_t;

// Then comes nNumJoints times ms3d_joint_ex_t structs (sizeof(ms3d_joint_ex_t) == 12)

// Then comes the subversion of the model extra information
int subVersion;                // subVersion is = 1, 4 bytes

// ms3d_model_ex_t for subVersion == 1
typedef struct
{
        float jointSize;        // joint size, since subVersion == 1
        int transparencyMode; // 0 = simple, 1 = depth buffered with alpha ref, 2 = depth sorted **s, since subVersion == 1
        float alphaRef; // alpha reference value for transparencyMode = 1, since subVersion == 1
} ms3d_model_ex_t;

之前是有参考《Focus on 3D Models》这本书,书中并没有读取权重等扩展信息。。。所以,有需要的童鞋们,千万表忘记读取最后的信息哦~~~

使用道具 举报

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

回顶部