当前位置: 主页 > 平面设计 > Maya表达式控制动力学动画之尾巴

Maya表达式控制动力学动画之尾巴

  • 2022-02-06
  • 来源/作者: PS.ONEGREEN.ORG    / 佚名    
  • 4 次浏览

  前面我们通过表达式可以计算出物体的速度和加速度,得到了物体的速度和加速度,我们就可以尝试运用表达式控制很多有关动力学的动画。下面是我一个利用表达式模拟尾巴运动的表达式练习。希望能对初学的朋友们有所帮助。

  我们首先看一下效果图。

  Maya表达式控制动力学动画之尾巴

  1.创建一个长方体作为身体,然后创建一条有六七节的尾巴骨骼,再将尾巴骨骼连接到长方体上,作为其子物体,如图。

  Maya表达式控制动力学动画之尾巴

  2.建立身体速度及加速度表达式。表达式如下:

  global float $t=0.667,$k=0.5,$m=0.5;
  float $xs,$sx0,$sx1,$sx2,$vx0,$vx1,$ax,$k1=100;
  if(frame==0)
  $sx=$sx1=$sx2=$sx0=$ax=$ay=box.translateX;
  else
  {
  $sx2=box.translateX;
  $vx1=$sx2-$sx1;
  $vx0=$sx1-$sx0;
  $ax=$vx1-$vx0;
  $sx1=box.translateX;
  $sx0=$sx;
  $sx=box.translateX;
  }
  float $sy,$sy0,$sy1,$sy2,$vy0,$vy1,$ay;
  if(frame==0)
  $sy=$sy1=$sy2=$sy0=$ay=box.translateY;
  else
  {
  $sy2=box.translateY;
  $vy1=$sy2-$sy1;
  $vy0=$sy1-$sy0;
  $ay=$vy1-$vy0;
  $sy1=box.translateY;
  $sy0=$sy;
  $sy=box.translateY;
  }
  float $sz,$sz0,$sz1,$sz2,$vz0,$vz1,$az;
  if(frame==0)
  $sz=$sz1=$sz2=$sz0=$az=box.translateZ;
  else
  {
  $sz2=box.translateZ;
  $vz1=$sz2-$sz1;
  $vz0=$sz1-$sz0;
  $az=$vz1-$vz0;
  $sz1=box.translateZ;
  $sz0=$sz;
  $sz=box.translateZ;
  }
  box.ax=$k1*$ax;
  box.ay=$k1*$ay;
  box.az=$k1*$az;
  if(frame==0)
  box.ax=box.ay=box.az=0;

  其中身体的速度及加速度三个维度都要计算,但开始测试时可以只考虑一个维度。

[NextPage]

  另外要为身体添加三个加速度的属性box.ax,box.ay,box.az,尾巴骨骼的动力学效果都是靠这三个属性值来控制的。其中$k1为比例系数,通过调整这个参数,可以控制尾巴对加速度的敏感程度,为方便调试和控制,大家可以考虑把这个参数也作为身体的一个属性。

  Maya表达式控制动力学动画之尾巴

  3.建立尾巴的速度、加速度和尾巴转动角度的

表达式:

  尾巴的速度和加速度主要为旋转角速度和角加速度,其计算思路为:由身体的位移加速度和尾巴第一节骨骼当时的角位移计算出其角速度和角加速度及其转动角度值,再将转动角度值赋予骨骼角度通道。如果不考虑身体的z轴方向的旋转,尾巴骨骼的角速度和角加速度仅考虑两个维度就可以了。分别编写两个维度的表达式,如下为尾巴第一节骨骼的y轴向的速度和加速度的表达式。

  float $a2,$a1,$a,$v,$x,$x1,$e;
  int $i;
  $a1=0.8*(sind($x+0)*box.az+cosd($x+0)*box.ax);
  $x1=0.5*$a2*$t*$t+$v*$t;
  $a2=$a1-$k*$x;
  $a=$m*$x;
  $v=$v+$a2*$t*0.3;
  $x=$x+$x1;
  if(frame==0)
  $a=$x=$x1=$v=$a=0;
  joint1.rotateZ=$x;
  joint1.ay=$a;
  $v1=$v;

  $m为骨骼的角加速度系数,其值可以控制骨骼的刚性属性,原理上值越大,骨骼越不易弯曲,但实际上此值不能太大,否者骨骼的震荡会无法控制,此值在前面全局变量中定义。

  其中joint1.ay为第一节骨骼的附加属性,用来表示其y轴向的角加速度。X轴方向与之同理。

  第二节及其后续骨骼表达式基本一致,与第一节骨骼不同之处在于其初始角加速度是由前一节骨骼的骨端位移加速度和自身角度偏移量计算得出的。如下为第二节骨骼的y轴向的角速度,角加速度和角度值的表达式,最后将角度值赋予相应角度通道即可。

[NextPage]

  float $a2,$a1,$a,$v,$x,$x1,$e;
  int $i;
  $a1=1.5*joint1.ay*cosd($x);
  $x1=0.5*$a2*$t*$t+$v*$t;
  $a2=$a1-$k*$x;
  $v=$v+$a2*$t*0
.1;
  $x=$x+$x1;
  $a=$m*$x;
  if(frame==0)
  $a=$x=$x1=$v=$a=0;joint2.rotateZ=$x;
  joint2.ay=$a;

  其它骨骼与之基本一致,不同的为个别参数的修正。其中$a1=1.5*joint1.ay*cosd($x);表达式中的1.5是我定义的第一节骨骼的长度系数,其他各节根据实际的骨骼情况作相应变化,例如我定义的骨骼为1.5,1.2,1.0,0.8,0.5。如果骨骼长度相同,其值应相同。

  对于目前这个表达式,我对后续骨骼进行角速度及角加速度的计算时未考虑前一节骨骼在空间的具体角度值,因此只适合于尾巴整体弯曲不大,精度要求不高的场合,有兴趣的朋友自己可以尝试加入这方面的控制。还有目前的尾巴仅仅是被动地跟随身体的运动而摆动,朋友们可以为尾巴骨骼添加主动施加力的影响,让尾巴可以有意识的摆动。

  这个表达式仅是练习,其中还有很多具体因素未全面深入考虑,一些参量的计算不够精确,有兴趣的朋友可以考虑完善,做出更好

的控制效果来。

  Maya表达式控制动力学动画之尾巴

  测试动画。

  Maya表达式控制动力学动画之尾巴

  测试动画。

  Maya表达式控制动力学动画之尾巴