对hbox,骨骼和模型限制的探索与发现
首先我提出了下面的假设:
1.hbox只是qc用来显示打击范围的一个区域,实际这个区域由代码决定。
2.骨骼对模型有限制,和hbox没有关系。
3.在qc中没有对骨骼定义hbox的情况下,只要骨骼上绑定的点相对坐标超过一定的值,编译的时候自动产生hbox。
4.骨骼的限制区域是由代码决定的。只要骨骼所绑的点都在这个骨骼的限制范围内,这个模型就能过游戏认证。对于自创的骨骼也是有限定范围的。
下面我对每一个假设通过试验,测试的方法来验证它。
1.相信很多朋友都在qc中改过hbox的值,甚至删除过hbox,但是编译以后还是产生了hbox,在游戏中没有任何变化。所以我想很多朋友会和我有一样的观点,hbox是代码决定的。
2.我觉得可以这样理解,如果说hbox就是限制模型的根本所在,那就表明只要模型有超过hbox的部分就是超过了这个限制,游戏就不能认证通过,这个显然是错的。
还有一种理解既然hbox是代码决定的,那hbox的范围究竟是怎样的范围我们其实不知道,所以不能光靠hlmv中观察到的范围来判断它的真实范围。所以hbox就是限制模型的根本所在这种说法还不能被否决。
大家请看我做的爱莉爱莉斯模型,
很显然辫子超过了hlmv中头部hbox的范围,假如这种说法是对的,也就是说辫子是包含在代码所决定的头部hbox范围内的,也就是说在游戏中只要打击辫子的区域就能爆头了。。。用过这个模型的人都知道,显然这个是错的。
所以我得出的结论是,骨骼的周围确实存在一个限制模型的区域,但是这个区域不是hbox的区域,和hbox没有任何关系,暂时把这个限制称为是骨骼对模型的限制。事实上有限制是肯定的,也是必须的,不然可以把模型做的无限大,或者无限小。。。
继续分析qc可以发现调换hbox的位置,或者更改hbox的编号都无法更改游戏中的hbox,说明hbox已经完全编译进了代码,任何对qc中hbox的改动都是无效的。其实qc就是代码的一个接口,那为什么能通过改变动作的顺序来替换动作?就是因为代码只规定了动作顺序,具体的动作内容并不在代码里,而是在smd里,而smd是能修改的。
3.这个可以用试验来证明,我反编译了w_c4.mdl的模型,骨骼移到了原点,皮肤是一个边长为1的立方体删掉了某些面后的样子,这样就容易看清楚了。
经过反复的试验,证明:如果三个点与原点骨骼的距离都超过1,就会产生hbox,只要有1个小于等于1,就不会产生hbox.
再次经过反复的试验,证明:在没有定义hbox的情况下,hbox的区域是骨骼所绑点包括下一级骨骼总体的范围。前提是必须下级骨骼要有点绑在上面,如果没有点绑在上面那它不能作为最末端的骨骼,不然编译的时候会自动删掉。一个骨骼所绑定的点包括它的下一级骨骼,他们相对坐标只要满足|x|max || |y|max || |z|max<=1,那就不会产生hbox了。也就是说hbox的每条边都是大于1的(看一下这张图片就明白了)。
产生的hbox是以骨骼的坐标为基准的,qc中它的6组数据就是hbox的两个对角点到骨骼的相对坐标,而且自动产生的hbox,要么骨骼在hbox的内部,要么在表面上,不可能在外部。这就很好的解释了为什么在qc中删除了hbox,但是编译后还是产生了hbox。
4.前面半句也许是废话,当然必须所有的点都在绑定它骨骼的限制范围内才能过游戏认证,但是后面半句的猜测很大胆,为什么会这么想呢?
主要是从做的那个金蛇剑模型中得出的结论。
请看我做的金蛇剑模型。
动过p模型的都知道,只要模型做的大点就不能过游戏了,还是以p_knife为例,我做的那个剑很大,直接换掉官方的皮肤是过不了游戏认证的,但是把它缩的和官方刀模型一样大就能过认证了。
根据"只要骨骼所绑的点都在这个骨骼的限制范围内,这个模型就能过游戏认证。"这个前提,我做了一些修改,并满足下图的条件,
绿色圈出来的骨骼就是拿武器的skin01官方骨骼,他有限制区域,如果我把黄色区域以外的点都删了,并把剩余的点都绑在skin01上,是能过游戏认证的。我创建了3个骨骼,每个骨骼所绑点的区域都用红色框标出来了,可以看出2,3,4区域都是小于1区域的,既然1区域满足认证,那2,3,4肯定满足,事实证明这个假设是对的,这个模型能过游戏认证。再进一步测试,发现当把红色的点都绑到skin01上时正好不能过游戏认证,可以肯定那个地方就是限制区域的边界地方,初步计算一下,离skin01最远的点和它的距离大概在12,而且这个距离正好是skin01y轴方向的距离,因为那把剑差不多就是和skin01正交的。我估计这个限制区域和hbox一样也是以一个立方体来标注的。
在此基础上,又有一个问题摆在眼前,是不是自创的骨骼也是有限制范围的,有没有可能自创的骨骼没有限制范围?
请看我下面做的试验。
我把剑身都绑到了自创的一个骨骼上,但是游戏进不去,再结合上面的例子,可以肯定自创骨骼也是有限制区域的。而且还可以进一步的假设:限制区域是由代码决定的,而且代码可能也没有规定所有骨骼的限制区域,只是规定了一部分,就是说自创的骨骼没有规定它的限制范围。
那代码是怎么判定他范围的呢?要解决这个问题还是应该先考虑一下代码是怎么识别骨骼的,有几种可能,一是骨骼的名字,这个不可能,因为你即使把skin01这个骨骼换成其他的,也照样能过游戏;二是根据骨骼的顺序,这也不可能的,我们知道smd是定义骨骼信息的,只要你把其中一个不是很重要的骨骼删了,或者添加自创骨骼,模型还是能过游戏,如果删除了某个骨骼那骨骼数量必定比原来的少,顺序上与原来的肯定对不起来的,所以说代码判定骨骼也不是根据smd中的顺序;第三,连接顺序,我觉得这是最后一种可能,也是可能性最大的。
smd中确定一个骨骼是通过两个方面来实现的,一个是这个骨骼的位置,一个是它的连接情况。skeleton time 0后面就是纪录骨骼位置的,而判断它的连接情况就是通过连接顺序来判断的。
所以这样就很清楚了smd纪录骨骼的连接,和连接顺序有关系。扯远了。。。
总之代码判断骨骼的方法最有可能的就是连接顺序了。假设一个p模型代码只定义了其中的两个骨骼有限定区域,没定义的骨骼限定区域是怎么判定的,这是个疑问,可能性最大的是和qc中smd动作一样的情况,又要提到为什么1.5模型用到1.6中死后不能倒下的原因了-_-!,代码定死了所有动作的顺序,动作的内容可以随便改,1.5假设有110个动作,1.6有130个动作,我们都知道死亡的动作总是在qc动作序列最后面的,假设是120-130,如果1.6中死后调用的是第125个动作,你用的是1.5模型的话根本没有这个动作,1.5的动作只排到110,那这时候代码就会自动回到第一个动作去播放,就是dummy,经历过的朋友都知道的,1.5模型用到1.6中死后就是这个动作,所以也有人说是滑步,太空步。。。。。。
基于这样的考虑,也可以猜想没有定义的骨骼它的限制范围就是排在第一个的有定义骨骼的限制范围。但也可能是上一级骨骼的限制范围,总之这个不太好试验。
另外在试验中还发现了一个问题,请看下图。
我把一个自创的骨骼与skin01距离拉远了,这个模型无法进入游戏,我加了骨骼控制器,把它往回拉,但是还是过不了游戏。
说明游戏只认证不带参数情况下的模型,也就是说,你加控制器之类的参数,即使在hlmv中看上去能通过认证,如果你的主模型smd无法通过认证也是不行的,所以可以说smd的主模型是过游戏骨骼限制认证的前提。
另外上图那个模型无法进游戏还揭示了一个原理,骨骼与骨骼间也是有限制的,回想刚才skin01大概的限制区域,我就把它下一级骨骼移到这个区域外一点就不行了,说明它的下一级骨骼也是要在它的限制范围内的。
当你的骨骼没有绑定点,并且不是最后一节骨骼时,这个骨骼的限制区域其实还是有作用的,他主要是用来限制下一级骨骼的。
后记:这些结论不一定是对的,但是基本都能用试验证明出来。
目前最大的不解就是代码是如何定义哪些骨骼是有限制区域的,我的猜测是有两种情况:
1.qc是代码的接口,自然要研究一下qc,我猜测可能人物模型中定义了hbox的骨骼是有定义限制的。
2.可能代码不是对骨骼进行单个定义限制范围的,有可能对一个mdl设置一个全局的参数,这样所有的骨骼都是用的那个范围,mdl中所有的限制范围都一样。
当然究竟是不是骨骼在限制模型这个确实不清楚,目前只有这个猜测最符合实际情况了。
我也不想再去测试了,如果能证明一个mdl中两个骨骼的限制范围是不一样的,那第2个猜测就不成立了。
最后要特别感谢阿发和3dstart,可以说阿发的作品给我提供了一个很好的范例,而3dstart提出的一些观点也对我有很好的启示。
[ 本帖最后由 FantasyFT 于 2008-7-12 09:47 编辑 ]
附件: 您所在的用户组无法下载或查看附件
搜索更多相关主题的帖子:
模型 骨骼 hbox 范围 游戏