谈到这js的设置,两大亮点,两大难点:
1.腿部的表达式
2.手部的bend系统
OK,先说腿部那的经典表达式,Roll系统:
腿部的控制器分别有三个属性:roll,toeLift,toeStraight
三个要联合使用
roll可以立刻看到效果
toeLift意思是ball到多少度脚尖开始抬起
toeStraight意思是脚尖到多少的时候ball关节变回直的
就像人走路,跑步时候脚掌的角度变化:
Jason这里用了一招挺有特色的,其实也是经常用了,做特效的人几乎时刻都面对,没有什么特别的,只是用在这设置上有点创意,那就是linstep,其实还有smoothstep,clamp,一大堆操作节点,只要灵活联想,都可以出到很好的效果,特效的同事应该清楚了,当时没有看JS的时候我是用判断节点和clamp节点做的,一样的道理
OK,分析一下他这段函数
ball_loc.rotateX = (linstep(0,$toeLift,$roll)) * (1-(linstep($toeLift,$toeStraight,$roll))) * $roll;
linstep(X,Y,Z)意思是给定一个范围 (大于X小于Y)
我们输入Z,当Z小于X的时候linstep输出为0
当Z大于Y的时候linstep输出为1
当Z大于X小于Y输出的就是当中的比例值
JS表达式分开了两部分,互相相乘,我觉得这个挺有趣的,有点像以前的小学简单数学
这两部分分别是(linstep(0,$toeLift,$roll))
(1-(linstep($toeLift,$toeStraight,$roll)))
(linstep(0,$toeLift,$roll)) : 我们输入roll值,当roll小于0的时候 ,
(linstep(0,$toeLift,$roll)) = 0
相乘后 ball_loc.rotateX = 0 ,ball关节没有旋转
当roll大于0,小于$toeLift , (linstep(0,$toeLift,$roll)) 输出0-1的比例值
当roll 大于$toeLift ,(linstep(0,$toeLift,$roll))输出为1
在看另外一段:(1-(linstep($toeLift,$toeStraight,$roll)))
我们先分析里面的一段: linstep($toeLift,$toeStraight,$roll)
当roll小于$toeLift的时候 ,linstep($toeLift,$toeStraight,$roll) = 0
整段 1-(linstep($toeLift,$toeStraight,$roll)) = 1-0 =1
当roll大于$toeLift,小于$toeStraight , linstep($toeLift,$toeStraight,$roll) = 0 输出0-1的比例值,是慢慢增大的值,但是
整段 1-(linstep($toeLift,$toeStraight,$roll)) 就相反了,输出1-0的比例值,是慢慢减少的
当roll 大于$toeStraight ,(linstep(0,$toeLift,$roll))输出为1
整段 1-(linstep($toeLift,$toeStraight,$roll)) = 1-1 =0
那么两段相乘,非常好,
(linstep(0,$toeLift,$roll)) * (1-(linstep($toeLift,$toeStraight,$roll))) * $roll
当$roll值在0,$toeLift 的时候 ,第二段为 (1-0=1),计算以第一段为准 例如 :X * (1-0)= X
当$roll值在$toeLift,$toeStraight 的时候 ,第一段为 (1-0=1),计算以第二段为准
例如 :1 * Y= Y
而第一段是0-1递增的,后面是1-0递增的
所以ball关节有真实人的效果
PS:其实动动脑筋,有更多的方法,说不定比他更简单的还很多,大家可以想想sin,cos函数,哈哈
更直接,先卖个小关子。。
明天说他手部的bend抬起系统,其实就是跟腿一样原理,就是在切换方面下了点小技巧来配合elbowLock
接着会给大家说你们看到一些DEMO的 闭唇运动,二级控制器的vector算法,大家多多交流哈
说完。。。收工。。。