那么经过了第一阶段的学习,对于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禁止滚转
	}
}

动图:

blender 控制骨骼_blender 控制骨骼

讲解1:可以看到基础属性为20,这是指0.20英寸,对应到blender中就是0.2的距离,即两个小格

讲解2:tip_mass是尖端质量,当质量很大时,旋转将总是趋向X轴的下面。

讲解3:刚度的默认值是500,最大值是1000,而100是一个相对柔软的值,这个值可以让骨骼以感官上的正常速度进行旋转和位移的变换,太大的值让人看着眼晕,太小的值看上去好像在太空。

讲解4:damping0代表无阻尼,骨骼一旦有了一个运动状态,在没有外力的情况下将永远做有规律的周期运动,当然除非你把窗口叉了,那肯定就莫得了哈。

讲解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禁止滚转
	}
}

动图:

blender 控制骨骼_spring_02

讲解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°
	}
}

动图:

blender 控制骨骼_spring_03

讲解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°
	}
}

动图:

blender 控制骨骼_多级_04

讲解9:这是Jiggle BoneBug之一,在俯仰函数禁止旋转时,即使设定了滚转的所有属性(但上面代码中不是全部),仍然无法让骨骼快速滚转,滚转阻尼被强制视为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 控制骨骼_默认值_05

Blender中动图:

blender 控制骨骼_spring_06

讲解11:实际上friction没什么卵用,除非由于重力原因贴到区间边界上起不来,此时才会在边界上移动,才会用到边界阻力。

讲解12:sfm中的Z轴向上,XY轴与地面平行

讲解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 //移动距离区间
	}
}

动图:

blender 控制骨骼_默认值_07

讲解14:禁用了YZ轴移动的区间

只有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 //移动距离区间
	}
}

动图:

blender 控制骨骼_默认值_08

讲解15:添加了俯仰属性,禁用了XY轴移动。

只有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 //移动距离区间
	}
}

动图:

blender 控制骨骼_多级_09

讲解16:添加了俯仰属性,禁用了YZ轴移动。

超大超离谱的位移区间和旋转区间

$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中的一小格)
	}
}

动图:

blender 控制骨骼_多级_10

讲解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 //角度区间
	}
}
//往下一直写道骨骼链末端的骨骼

动图:

blender 控制骨骼_spring_11

讲解18:这里需要每一个骨骼都写一个Jiggle Bone属性,有些繁琐,但还不是最繁琐的,因为这个骨骼链只有5层。

Bl中的骨骼:

blender 控制骨骼_多级_12

人物模型的披风模拟

$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中的骨骼:

blender 控制骨骼_spring_13

讲解19:恐怖的17级骨骼,但模拟出的效果还不错,虽说穿模了。

动图:

blender 控制骨骼_默认值_14