上一篇:CTC文件部分参数的含义
上个教程贴我讲到了ctc文件中各参数的作用,为了方便之后讲如何从零开始(严格来讲应该是从150开始)加物理骨骼、写ctc文件,这里再简单补充一些对物理骨骼的个人理解。
不像上一篇,基本都是照搬大佬们的经验,本帖子的内容是在大佬们的研究基础上自己进行大胆猜测的,仅供参考,如果理解有偏差,还是请以大佬们的总结为准!
绝大多数外观的物理骨骼ID范围都在150~200之间,少部分外观的物理骨骼超过了200的上限。而不管是什么外观的骨骼,我都看到固定有249~255这几个,所以我推测物理骨骼的极限范围是150~248。
总之,每个部位使用的物理骨骼的数量都强烈建议维持在50个以内(也就是ID范围150~200)。四个部位合起来一共200个物理骨骼,除非你对物理细节的要求非常过分,不然是绝对够用的。
补充1:arm、leg、wst只能容纳50个物理骨骼,且ID范围必须在150~200之内。而body部位是特殊的,ID可以超过200,虽然没经过充分测试,但是姑且可以认为body能够容纳150~250之内的100个物理骨骼。可是代价是,在反转姿势下body部位的物理会变成反重力。
补充2:抛去基础骨骼的优先级等等要素后,可以粗略地认为,不同部位的物理骨骼是近乎独立的,也就是说,如果你做一个东西,用了50个ID发现不够用了,你完全可以把网格拆成两份,把塞不进去的那一部分放到其他部位,然后从150开始再次接着排下去。
补充3:不同部位受风力影响的时间轴是不一样的,所以如果一整个网格用50个骨骼不够,必须拆成多个的话,最好是间隔着拆分网格,并保证每一份网格的对称性。不然如果简单拆成左右两半,就会出现左半边先飘动、右半边后飘动的情况。这一点还可以加以利用,做出波浪形的飘动效果。
一个正常的ctc物理链应该至少有一个固定的首节点和一个引导用的(?)尾节点。
固定的首节点就是物理链(Chain)中的第一个节点(Bone),该首节点自定义属性isParent固定为1,否则会导致整个骨骼链乱飘。
尾节点就是物理链中的最后一个节点,由于对应的尾骨骼往往不绑顶点组,所以尾骨骼本身并不直接参与模型的运动。dc上有人说,尾骨骼和尾节点起到类似于IK target的作用,引导整个骨骼链的运动;不过根据大佬的说法,它就是一个末端骨,标志一段骨骼链的结束。
对应到骨骼链上,就是骨骼链的最后一个骨骼一定是不绑定任何权重的,所以我们就能看到,所有的骨骼链最后都会有一个不控制任何顶点组、且经常垂直向下的尾骨骼,比如下图中的155。把它放到太离谱的位置,会导致骨骼链的尾部乱飘。
此外,按照我目前的经验来看,任何独立物理链/骨骼链之间是互不影响的,所以同一个模型应该也可以用多个骨骼链来控制。比如裙子这种多个骨骼链联合控制的模型,其物理效果是不同的物理链对顶点组(权重)进行不同程度的控制所造成的。
并且,似乎可以在一个骨骼链上面创建多条物理链,实现同一个模型的不同部位产生不同物理效果。
是猜测!所以你一定不要把它当做真实的机制!
上面讲到,“引导用的尾节点”是个非常重要的东西,它引导了整个骨骼链的运动。可以把一个物理链想象成“人-狗链子-狗”的关系,“人”是首节点,“狗链子”是中间节点,而“狗”是这个尾节点。(其实说的更准确一点,“人”应该是这个物理链的父亲骨骼,比如上图150的父亲骨骼013,而人手上的那部分绳子才是首节点)
人是这整个链的基础,带动狗链子,从而带动狗进行运动。而狗起到引导狗链子的作用,没有这条狗,链子会垂直落下,整个链就没法正常生效了。
有意思的来了,如果把狗改成一个固定的东西会怎样?对应在ctc里面就是把尾节点的isParent设置为1,比如把下图中尾巴最末端的那个节点给固定住:
这时候就发现,本来是左边这样垂下去的样子,改完之后尾巴就翘起来了:
巧了,这里正好是原模型的初始位置。为了确保假设准确,把重力调成反的,重新试试:
动起来后,又因为尾节点固定,导致运动(尤其是转向)时末端几个节点产生了非常诡异的拉伸:
到这里就可以猜测(是猜测!所以你一定不要把它当做真实的机制!)物理链在重力下的作用机制:从尾节点开始,重力将尾节点往下拉到一个固定的位置,然后前面的节点依次跟随运动。之后物理链跟随首节点进行任何运动时,都会倾向于朝着这个固定的位置回归。
如果把尾节点固定了呢?本来应该将物理链拉向那个固定位置,但是由于尾节点被强行固定,移动到初始位置,导致临近的几个节点不得不跟随尾节点运动,产生上面的效果。
补充:按照大佬的说法,如果你把某个节点的fixend设为1,就标志着它成为了一段链的开始,这时候就把原来的链分成多段链了。可以通过fixend=1的前一个节点的物理是否生效来证明,因为这时候它就是前半段链的末端骨,可以自己试一试。
四,ctc自定义参数补充-拉伸程度weightiness
看到那个诡异的拉伸,让我联想到之前的weightiness,一个影响拉伸程度的参数。
我以前试过调这个参数,没看出有变化,但是在固定尾节点后,我也改了一下这个参数试试,当我把weightiness从7调到0、39时,分别产生了如下图左、右的变化:
其中当weightiness设为0,尾巴在运动的时候基本没有产生诡异的拉伸,会以首、尾节点为固定点实现一定的摆动效果。
所以weightiness大概可能是是骨骼的允许拉伸程度,当这个值很低比如7时,骨骼之间的距离就会比较固定;而当这个值越高时,骨骼在运动时就会越倾向于拉开距离。
仍然不清楚具体的作用效果,建议这个值只取7或39,因为其他值可能会有奇怪的物理效果。
当你看完以上两篇,相信你对ctc文件有了一定的理解了,现在让我们开始打造一份独属于自己的物理文件吧!
下一篇:从零开始做物理·其一——工具准备与添加骨骼