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

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2532|回复: 15

mdl切换子模型的重大发现与pev_body对应算法原型[AMXX]     [复制链接]

Super Moderator

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

Rank: 10Rank: 10Rank: 10

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

Modchina元老

发表于 2011-1-6 20:23:21 |显示全部楼层
首先感谢Martin在对HLsdk的研究中发现了这个话题并和我讨论,让我能够正确理解pev_body的概念和用法。

本贴主要内容分为以下几个部分,请根据个人情况有针对性地进行阅读。

1。重大意义与应用前景
我们可以随意切换和组合mdl的子模型了!
pev_body02.jpg

pev_body03.jpg

例如CSOL那种圣诞帽什么的
我想到的一些可能的应用前景:
· 可以进行简单的换装 Martin说这叫纸娃娃系统
· 可以进行复杂的bodyparts组合 而是可以通过不同的bodygroup 调用不同的bodyparts组成一个完整的角色
· 可以对高模人物用新的方式进行构造  高模smd将不仅仅局限于studio一个body中
· 可以用多个bodyparts拼合出整套衣装 人物变装将更为彻底和华丽
· 可以进行模型的合并 实现单mdl复用 减少缓存资源的数量 缓和512limit限制问题
· 可以增强模型与插件的紧密联系 提高模型构建和应用的复杂程度 使模型与插件的盗用、篡改等变得更为复杂 棘手 和缺乏意义


2。正确理解pev_body
打个比方来说 每个bodygroup就像是一个数字位 多个数字位有序排列组成一个数字 而多个bodygroup在qc中有序排列 共同组成了一个mdl
如同每个数字位有多种可能的数字一样 每个bodygroup都可以有若干种bodypart(下文开始简称body),只不过各个bodygroup分别含有的body数并不要求一致 这点和数制有很大区别 n进制是表示个十百位可能的数字数都为n 但bodygroup包含的body数却无所谓
然后我们要考虑不同body的组合 但是要先注意一下bodygroup的排序
bodygroup是有序的 其排序由它在mdl编译的位置决定 即qc中bodygroup排在前面的序号较小 它们也将成为各种排列遍历计数的较低位
让我们用一个简单的例子来说明这些概念与关系:
一个简单的mdl 一个有3个bodygroup:body0(0,1,2),body1(0,1,2,3),body2(0,1)的mdl
pev_body.rar (3.11 KB, 下载次数: 12) 例mdl(含mdl+bmp+qc+smd)
其qc文件的部分内容:
  1. $bodygroup body0
  2. {
  3. studio "00"
  4. studio "01"
  5. studio "02" //3个
  6. }
  7. $bodygroup body1
  8. {
  9. studio "10"
  10. studio "11"
  11. studio "12"
  12. studio "13" //4个
  13. }
  14. $bodygroup body2
  15. {
  16. studio "20"
  17. studio "21" //2个
  18. }
复制代码
pev_body就像数数计数从低位向高位进位一样,从序号较低的bodygroup向序号较高的逐一数数
下面列出其pev_body的遍历取值与其对应的各bodygroup的body序号:
pev_body01.jpg

另外pev_body的变量类型为Byte 取值范围0~255 若超出此值则数据溢出 执行用插件执行set_pev无效


3。mdl切换BodyGroup与pev_body对应算法原型
pev_body09.jpg

此段代码是针对于上例的mdl
对于不同的mdl仅需修改常量和全局变量定义 对其正确初始化即可 具有一定的通用性

  1. #define MAX_GROUP_NUM 3 //该mdl含有的bodygroup数
  2. new g_byBodyGroupNum[MAX_GROUP_NUM]={3,4,2};//各bodygroup组的body数数组
  3. stock fn_get_byBody(ent,byBodyGroup)//根据pev_body获取byBodyGroup组中的body代号
  4. {        //if(byBodyGroup>=MAX_GROUP_NUM)return -1;
  5.         static tempBodyGroup,tempPevBody;
  6.         for(tempBodyGroup=0,tempPevBody=pev(ent,pev_body);tempBodyGroup<byBodyGroup;)
  7.                 tempPevBody=(tempPevBody/g_byBodyGroupNum[tempBodyGroup++]);
  8.         return tempPevBody-(tempPevBody/g_byBodyGroupNum[byBodyGroup])*g_byBodyGroupNum[byBodyGroup];
  9. }
  10. stock fn_set_pevbody(ent,setBodyGroup[])//根据数组setBodyGroup设置pev_body
  11. {
  12.         static temp_BodyGroup,temp_PevBody,temp_CurrentByte,temp_setBodyGroup[MAX_GROUP_NUM];
  13.         for(temp_BodyGroup=temp_PevBody=0;temp_BodyGroup<MAX_GROUP_NUM;)
  14.         {
  15.                 temp_setBodyGroup[temp_BodyGroup]=setBodyGroup[temp_BodyGroup];
  16.                 for(temp_CurrentByte=1;temp_CurrentByte<=temp_BodyGroup;)
  17.                         temp_setBodyGroup[temp_BodyGroup]*=g_byBodyGroupNum[temp_CurrentByte++-1];
  18.                 temp_PevBody+=temp_setBodyGroup[temp_BodyGroup++];
  19.         }
  20.         set_pev(ent,pev_body,temp_PevBody);
  21. }
复制代码
测试效果:
fn_get_byBody函数
pev_body04.jpg

fn_set_pevbody函数
pev_body05.jpg
pev_body07.jpg

pev_body06.jpg
pev_body08.jpg






4。应用中的现实问题
我想现在我们有了足够多的自由 但可能就是因为太自由了 我们以前习惯的一些设计方法不能够适应用pev_body进行复杂应用开发的要求
·首先是对modders的要求 以往做模型和插件的相互独立 写插件的可以对mdl不求甚解 做mdl的可以不懂amx 但是要想用pev_body做出NB的东西来 必须要求modder模型和插件都要有足够的了解,包括pev_body的概念 pev变量的应用修改机制与效果 以及mdl的基本构成 qc写法等等
·然后就是开发中的构建问题 需要设计好mdl有哪些部位可更换 有怎样的组合 模型提供的可能组合和插件要调用的有效组合之间要协调一致起来
·对于CS中de_模式里T得到和失去C4,CT得到和失去拆弹器的情况 需要了解mod的算法 进行特别的修正
·这个发现意义重大 然而来得实在太晚 我们已经错失了很多机会 比如说我曾设想制作某些支持换装类3D游戏的移植mod(如3D定制少女、Pencil Royale等)以及有很多服装和变装可能的人物 我们已经做出来并且它们只有两个bodygroup 我想一般人也不太愿意去把那些东西全部重做一遍 因为设计安排和实现复杂变装是非常繁琐和耗时的 虽然能做到很多 但可能真正推广实践起来会感到心有余而力不足 不能够适应这种工作量 不利于推广应用
此号待删除,不再登陆.

使用道具 举报

Rank: 5Rank: 5

帖子
425
精华
3
声望
1192 点
金币
226 Mold
被赞许
30 次
注册时间
2010-10-22
发表于 2011-1-6 21:47:31 |显示全部楼层
不知道在一个人物模型里作出多个bodypart,在选人时每个部分随机选择其中一种这样的能不能做到
就比如说在一个人物模型里有多种样式的脸,多种样式的发型,多种样式的衣服,在选人时或选人后随机选择其中一样组合成一个人的外观,这样即使所有人都选一个人,他们看上去也有所区别
不知道这种功能能否实现
初来乍到,请多指教

使用道具 举报

Super Moderator

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

Rank: 10Rank: 10Rank: 10

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

Modchina元老

发表于 2011-1-6 21:49:20 |显示全部楼层
回复 2# RichardZ


    当然可以了!!!
此号待删除,不再登陆.

使用道具 举报

Rank: 5Rank: 5

帖子
425
精华
3
声望
1192 点
金币
226 Mold
被赞许
30 次
注册时间
2010-10-22
发表于 2011-1-6 21:51:36 |显示全部楼层
回复 3# 阿发


    但是从未看见有人实现过呢...我感觉这是件复杂的事
唔我是编程小白,对这些一无所知
初来乍到,请多指教

使用道具 举报

Super Moderator

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

Rank: 10Rank: 10Rank: 10

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

Modchina元老

发表于 2011-1-6 21:53:02 |显示全部楼层
回复 4# RichardZ


    那当然了 就我所了解的人中 Martin是第一个也是唯一一个对pev_body概念认识正确的人
此号待删除,不再登陆.

使用道具 举报

Rank: 2

帖子
27
精华
0
声望
209 点
金币
15 Mold
被赞许
0 次
注册时间
2010-8-7
发表于 2011-1-6 21:53:34 |显示全部楼层
中國CS的又一里程碑= =?
=m=

使用道具 举报

Rank: 7Rank: 7Rank: 7

帖子
74
精华
2
声望
1758 点
金币
10075 Mold
被赞许
5 次
注册时间
2007-12-16
发表于 2011-1-6 22:09:34 |显示全部楼层
用P当帽子用的路过……
“这个发现意义重大 然而来得实在太晚”

使用道具 举报

Super Moderator

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

Rank: 10Rank: 10Rank: 10

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

Modchina元老

发表于 2011-1-6 22:15:47 |显示全部楼层
本帖最后由 阿发 于 2011-1-9 12:16 编辑

回复 7# goodman3


    p模也可单文件复用 实现多样
921536副本.png
此号待删除,不再登陆.

使用道具 举报

Rank: 5Rank: 5

帖子
131
精华
0
声望
867 点
金币
133 Mold
被赞许
10 次
注册时间
2010-12-31
发表于 2011-1-6 23:15:01 |显示全部楼层
插件基于引擎,SDK确实是编插件最重要的东西
很好的教程贴,学习了
I am the bone of my Scripts,
So I pray, Unlimited Code Works.

使用道具 举报

Rank: 5Rank: 5

帖子
741
精华
0
声望
1580 点
金币
163 Mold
被赞许
2 次
注册时间
2009-7-29

可爱小猫

发表于 2011-1-6 23:58:53 |显示全部楼层
可能因為cs的模型大家比較專研在槍模上
而很少人去研究人模且人模也比槍模複雜些 然而才那麼晚發現吧..

話說 2樓的點子的確很不錯

使用道具 举报

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

回顶部