那么经过了第一阶段的学习,对于Jiggle Bone
的基本原理和属性也有了一定的了解,下面进入第二阶段,即实操阶段。
第二阶段的形式为“代码
”+“动图
”+“讲解
”三部分。
旋转部分
上下摆动,无阻尼,不停地维持最后的运动状态
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_stiffness 100 //刚度0.1较为柔软
pitch_damping 0 //无阻尼,永远维持最后运动状态
pitch_constraint -45 45 //角度区间为-45°->45°
//滚转
yaw_constraint 0 0 //角度区间为0禁止滚转
}
}
动图:
讲解1:可以看到基础属性为20
,这是指0.20英寸
,对应到blender
中就是0.2
的距离,即两个小格
。
讲解2:tip_mass
是尖端质量,当质量很大时,旋转将总是趋向X轴的下面。
讲解3:刚度的默认值是500
,最大值是1000
,而100
是一个相对柔软的值,这个值可以让骨骼以感官上的正常速度进行旋转和位移的变换,太大的值让人看着眼晕,太小的值看上去好像在太空。
讲解4:damping
为0
代表无阻尼,骨骼一旦有了一个运动状态,在没有外力的情况下将永远做有规律的周期运动,当然除非你把窗口叉了,那肯定就莫得了哈。
讲解5:constraint
角度区间是一个以度为单位的区间值,因为在游戏中200°+200°=400°
,这表示骨骼旋转值为1+40°
,因此没有最大最小值。这个角度决定了在刚度
足够柔软的情况下,骨骼能旋转的最大角度;当刚度很高时,很有可能达不到设定的区间,就已经开始回弹
了。
讲解6:可以看到俯仰中有三个属性,而滚转中只有一个属性,其实用不到的属性都可以不写,这个示例仅使用了X
轴旋转,因此只需俯仰即可;至于滚转为何要添加区间,这是因为区间的默认值为无限大,这意味着限制Y
轴旋转的属性只有刚性起作用;在添加[0 0]
区间后,效果是禁止骨骼在Y
轴的旋转。
当刚度增加到800
时,摆动的剧烈程度增加:
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_stiffness 800 //刚度0.8较为硬朗
pitch_damping 0 //无阻尼,永远维持最后运动状态
pitch_constraint -45 45 //角度区间为-45°->45°
//滚转
yaw_constraint 0 0 //角度区间为0禁止滚转
}
}
动图:
讲解7:可以明显看到动图中的骨骼转速增加,这是因为刚度
有所增加。
全方向摆动,无阻尼,不停地维持最后的运动状态
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1
//俯仰
pitch_stiffness 100 //刚度0.1较为柔软
pitch_damping 0 //无阻尼,永远维持最后运动状态
pitch_constraint -45 45 //角度区间为-45°->45°
//滚转
yaw_stiffness 100 //刚度0.1较为柔软
yaw_damping 0 //无阻尼,永远维持最后运动状态
yaw_constraint -45 45 //角度区间为-45°->45°
}
}
动图:
讲解8:在滚转属性中添加了和俯仰相似的属性,这让骨骼可以在全方位旋转了。
仅滚转,无阻尼,出现bug,在pitch无法旋转时,yaw的阻尼视为默认值5。
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1
//俯仰
pitch_constraint 0 0 //角度区间为0禁止滚转
//滚转
yaw_stiffness 100 //刚度0.1较为柔软
yaw_damping 0 //无阻尼,永远维持最后运动状态
yaw_constraint -45 45 //角度区间为-45°->45°
}
}
动图:
讲解9:这是Jiggle Bone
的Bug
之一,在俯仰函数禁止旋转时,即使设定了滚转的所有属性(但上面代码中不是全部),仍然无法让骨骼快速滚转,滚转阻尼被强制视为10
。因此出现动图中旋转缓慢而没有弹性的效果。
加上位移
讲解10:只使用位移也是可以的,但如果需要禁止骨骼旋转,仍需包含A组属性组;如果不需要骨骼的刚度设置的话,可以使用is_rigid
属性组作为A
组属性,但由于is_flexible
属性组中只要将刚度设为1000
则可以达到同样效果,因此is_rigid
基本没什么人使用。
带位移的禁止转动
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_constraint 0 0 //角度区间为0禁止滚转
//滚转
yaw_constraint 0 0 //角度区间为0禁止滚转
}
has_base_spring
{
base_mass 1 //根节点质量很小,看不出重力作用
stiffness 100 //刚度
damping 0 //阻尼为0
//X轴移动
left_constraint -1 1 //移动距离区间
left_friction 0 //X边界阻力(不写默认0)
//Y轴移动
up_constraint -1 1 //移动距离区间
up_friction 0 //Y边界阻力(不写默认0)
//Z轴移动
forward_constraint -1 1 //移动距离区间
forward_friction 0 //Z边界阻力(不写默认0)
}
}
动图:
Blender中动图:
讲解11:实际上friction
没什么卵用,除非由于重力原因贴到区间边界上起不来,此时才会在边界上移动,才会用到边界阻力。
讲解12:sfm
中的Z
轴向上,X
、Y
轴与地面平行
讲解13:移动距离区间没有单位,但一单位距离为Blender
中的一小格(也是blender
中的1
单位距离)
只有X轴位移,禁止旋转
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_constraint 0 0 //角度区间为0禁止滚转
//滚转
yaw_constraint 0 0 //角度区间为0禁止滚转
}
has_base_spring
{
base_mass 1 //根节点质量很小,看不出重力作用
stiffness 100 //刚度
damping 0 //阻尼
//X轴移动
left_constraint -1 1 //移动距离区间
//Y轴移动
up_constraint 0 0 //移动距离区间
//Z轴移动
forward_constraint 0 0 //移动距离区间
}
}
动图:
讲解14:禁用了Y
、Z
轴移动的区间
只有Z轴位移,X轴旋转
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_stiffness 100 //刚度0.1较为柔软
pitch_damping 0 //无阻尼,永远维持最后运动状态
pitch_constraint -45 45 //角度区间为0禁止滚转
//滚转
yaw_constraint 0 0 //角度区间为0禁止滚转
}
has_base_spring
{
base_mass 1 //根节点质量很小,看不出重力作用
stiffness 100 //刚度
damping 0 //阻尼
//X轴移动
left_constraint 0 0 //移动距离区间
//Y轴移动
up_constraint 0 0 //移动距离区间
//Z轴移动
forward_constraint -1 1 //移动距离区间
}
}
动图:
讲解15:添加了俯仰
属性,禁用了X
、Y
轴移动。
只有X轴位移,X轴旋转
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_stiffness 100 //刚度0.1较为柔软
pitch_damping 0 //无阻尼,永远维持最后运动状态
pitch_constraint -45 45 //角度区间为0禁止滚转
//滚转
yaw_constraint 0 0 //角度区间为0禁止滚转
}
has_base_spring
{
base_mass 1 //根节点质量很小,看不出重力作用
stiffness 100 //刚度
damping 0 //阻尼
//X轴移动
left_constraint -1 1 //移动距离区间
//Y轴移动
up_constraint 0 0 //移动距离区间
//Z轴移动
forward_constraint 0 0 //移动距离区间
}
}
动图:
讲解16:添加了俯仰
属性,禁用了Y
、Z
轴移动。
超大超离谱的位移区间和旋转区间
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_stiffness 100 //刚度0.1较为柔软
pitch_damping 0 //无阻尼,永远维持最后运动状态
pitch_constraint -135 135 //角度区间为0禁止滚转
//滚转
yaw_stiffness 100 //刚度0.1较为柔软
yaw_damping 0 //阻尼最大
yaw_constraint -135 135 //角度区间为0禁止滚转
}
has_base_spring
{
base_mass 1 //根节点质量很小,看不出重力作用
stiffness 100 //刚度
damping 0 //阻尼
//X轴移动
left_constraint -20 20 //移动距离区间(单位距离为Blender中的一小格)
//Y轴移动
up_constraint -20 20 //移动距离区间(单位距离为Blender中的一小格)
//Z轴移动
forward_constraint -20 20 //移动距离区间(单位距离为Blender中的一小格)
}
}
动图:
讲解17:这个就属于恶搞了,把所有区间
调的尽可能大,很离谱
。
多级动态骨骼(别用has_base_spring属性组)
多级Jbone相互链接–>模拟布料
$jigglebone "jiggle_1"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_stiffness 100 //刚度0.1较为柔软
pitch_damping 5 //无阻尼,永远维持最后运动状态
pitch_constraint -75 75 //角度区间
//滚转
yaw_stiffness 100 //刚度0.1较为柔软
yaw_damping 5 //阻尼最大
yaw_constraint -30 30 //角度区间
}
}
$jigglebone "jiggle_2"
{
is_flexible
{
//基础属性
length 20
tip_mass 1 //尖端质量很小,因此看不出重力作用
//俯仰
pitch_stiffness 100 //刚度0.1较为柔软
pitch_damping 5 //无阻尼,永远维持最后运动状态
pitch_constraint -75 75 //角度区间
//滚转
yaw_stiffness 100 //刚度0.1较为柔软
yaw_damping 10 //阻尼最大
yaw_constraint -30 30 //角度区间
}
}
//往下一直写道骨骼链末端的骨骼
动图:
讲解18:这里需要每一个骨骼都写一个Jiggle Bone
属性,有些繁琐,但还不是最繁琐的,因为这个骨骼链只有5
层。
Bl中的骨骼:
人物模型的披风模拟
$jigglebone "cloth_back_L"
{
is_flexible
{
length 20
tip_mass 1
pitch_stiffness 100
pitch_damping 5
yaw_stiffness 100
yaw_damping 5
pitch_constraint -75 75
yaw_constraint -30 30
}
}
$jigglebone "cloth_back_L001"
{
is_flexible
{
length 20
tip_mass 1
pitch_stiffness 100
pitch_damping 5
yaw_stiffness 100
yaw_damping 5
pitch_constraint -75 75
yaw_constraint -30 30
}
}
//向下一直写完所有骨骼
Bl中的骨骼:
讲解19:恐怖的17
级骨骼,但模拟出的效果还不错,虽说穿模了。
动图: