游戏开发论坛

 找回密码
 立即注册
搜索
查看: 21286|回复: 11

玩转mdl文件之迷

[复制链接]

3

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2004-1-2 16:41:00 | 显示全部楼层 |阅读模式
元旦憋足一天,终于把mdl文件格式搞出来了,
可顺利打开各个版本的mdl,而且各个版本之间可以实现相互转换.

14

主题

251

帖子

251

积分

中级会员

Rank: 3Rank: 3

积分
251
发表于 2004-1-4 10:30:00 | 显示全部楼层

Re:玩转mdl文件之迷

介绍一下

3

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
 楼主| 发表于 2004-1-7 17:10:00 | 显示全部楼层

Re:玩转mdl文件之迷

现在创建mdl模型文件已经易如反掌,正在打造自己的地图.
当然,1.3G的资源没有必要浪费,不过运行起来和BETA版一样会有bug,
目前正在逐步清除中...以便在春节期间能够过把瘾.
许多代码就象长篇诗歌,让人如痴似醉,妙不可言...
用代码渲染出来的大规模场景和物件造型,更是处处让人芳心寸动...
由于改动比较散乱,实在没有时间进行文档整理.
不过本人仍然愿意无私奉献给大家,重点说明一下mdl文件36和37版的区别,
mstudiohdr_t中在numseq前增加4个int字节,是针对骨骼和动画的,
其数值不影响实际渲染,可以不必理睬.在mstudioseqdesc_t中,去掉anim[][]的定义,
原来是怎样的,我已经忘记了,不过我修改后是这样:
        Vector        bbmin;                // per sequence bounding box
        Vector        bbmax;               
        int        numblends;
        int        blendindex;        // [blend] float array for blended movement
        inline  unsigned short *pBlend( int i ) const
        {
                return (unsigned short *)(((byte *)this) + blendindex) + i;
        };
        int        seqgroup;        // sequence group for demand loading
        int        groupsize[2];
        int        paramindex[2];        // X, Y, Z, XR, YR, ZR
        float        paramstart[2];        // local (0..1) starting value
        float        paramend[2];        // local (0..1) ending value
        int        paramparent;
修改完后,编译会报错,针对报错的地方,对game_shared\bonesetup.cpp进行修改即可.
如果仍然不明白,我可以把相关文件一并发给你.
初步设想是游戏规则仍然太少,不知道能不能够把规则提炼出来,并且可以根据需要增加,
如此一来,便可以更快地实现虚拟现实,当然,还有更多的游戏...我的时间不多,希望
更多更专业的人员在前进,加快技术进步的步伐.

8

主题

71

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2004-1-10 16:51:00 | 显示全部楼层

Re:玩转mdl文件之迷

能否提供源代码?

3

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
 楼主| 发表于 2004-1-12 15:55:00 | 显示全部楼层

Re: 玩转mdl文件之迷

提供源代码文件,替换game_shared下的bone_setup.cpp;
修改的地方有说明,只是消除了修改者名称。且仅限于36版到37版的转换,
如果要顺利打开37版的mdl文件,还需要在studio.h中把版本号修改为37,
以及去除对函数Studio_ConvertStudioHdrToNewVersion的调用,因为该函数是把低版本的转换到36版的,如果规划到37后,该函数失去作用.
转换成功后,应该可以调用1.3G的资源,但我记得声音文件缓存数太低,
如果你遇到关于声音文件的报错时,把它改大一倍即可.


考虑到说明文档的重要性,本人以后会提供详细文档,稍后会发布bsp文件格式及详细说明.

sf_2004112155555.rar

17.35 KB, 下载次数:

3

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
 楼主| 发表于 2004-1-12 16:12:00 | 显示全部楼层

Re: 玩转mdl文件之迷

顺便把studio.h也放上,用此文件覆盖public\下的同文件即可.
修改的地方也有说明,也仅限36到37的转换.
避免大家再辛苦的去边查看边修改了

sf_2004112161256.rar

10.87 KB, 下载次数:

15

主题

155

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2004-1-14 10:17:00 | 显示全部楼层

Re:玩转mdl文件之迷

有一个问题,多个动画文件是怎么解决的,也就是numseqgroups>1是怎么解决的

3

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
 楼主| 发表于 2004-1-15 17:38:00 | 显示全部楼层

Re: 玩转mdl文件之迷

很高兴看到你提出的这个问题,本人上面发布的源码是只支持seqgroup等于1的情况下的.
当seqgroup大于1时,还需要进一步修改代码.不过改动也并不多.提示如下:
在studiohdr_t结构中新增的4个int结构中(其实为2组,每组2个int),第一组描述的是
动画信息,其内部结构很简单,为2个int结构,第一个为seqgroup号,第二个为动画描述
所在的索引号.因此,在bone_setup.cpp中获得动画描述时,我采取的方法是增加了一个函数:
mstudioanimdesc_t *GetAnimDesc( const studiohdr_t *pStudioHdr, const int anim )
{
        int group = (pStudioHdr->pAnimNum( anim ))->group;
        int value = (pStudioHdr->pAnimNum( anim ))->value;

        if (group == 0)
                return pStudioHdr->pAnimdesc(value);
        // note:pSeqgroup函数是在studiohdr_t中增加的
        studiosharehdr_t *phdr = (studiosharehdr_t *)((pStudioHdr->pSeqgroup(group))->cache);

        return phdr->pAnimdesc(value);
}
用该函数替换以前的直接获得动画描述.
之所以采用多文件的模式,我认为是想把一些公用的信息提炼出来,从而减小了文件的大小.比如人的动作,
很多是相同的.因此涉及到如动作描述等公用信息时,多文件模式情况下需要从多个文件中进行提取.而这些
公用文件的结构也比较简单,并没有studiohdr_t结构那样多信息.我把它的文件结构定义为:
struct studiosharehdr_t
{
        int        id;
        int        version;
        char        name[64];
        int        length;
        int        data;

        int        numbones;        // bones
        int        boneindex;
        inline  mstudiobonedesc_t *pBone( int i ) const
        {
                return (mstudiobonedesc_t *)(((byte *)this) + boneindex) + i;
        };

        int        numanim;        // animations/poses
        int        animdescindex;        // animation descriptions
        inline  mstudioanimdesc_t  *pAnimdesc( int i ) const
        {
                return (mstudioanimdesc_t *)(((byte *)this) + animdescindex) + i;
        };
};
其中mstudiobonedesc_t结构是新增加的,见上面以前发布的mstudiotest_t结构,是一样的.
读出多文件后,我采取的方法是将其文件内容的buffer指针存储到结构mstudioseqgroup_t中的cache中.
所以获取信息时,(见最上面函数),我是从cache中取得的.
相信你一试即知.如果仍有疑问,可以与我联系.如果你觉得非常麻烦,我可以把源代码整理后发给你.
非常乐意与你交流.

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-5-11 15:22:00 | 显示全部楼层

Re:玩转mdl文件之迷

1.3G的代码哪里有?谢谢!

21

主题

53

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2005-7-26 17:34:00 | 显示全部楼层

Re:玩转mdl文件之迷

干脆把完整的源代码奉献出来算了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-9 09:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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