本文的目的是探讨一下用Expression等方法来实现不规则圆的物体(如鸡蛋,变形的轮胎)在平面上无滑动的滚动效果,由于不用关键桢key,而且速率可调,这样重用率高,从而效率也提高了。
源代码
我希望提供这样的思路,能起到抛砖引玉的作用,让更多的人来关注,研究Maya,MEL,Expression,来实现更好的效果,进而促进这一领域的范围更广,层次更深的应用,交流和合作。唯愿如此
//************** eggVer2.txt ***********************
// Egg rolling motion ---- Version 2.0
// Author: Luonaldo
// First create date: about March, 2003
// Last updated: 2003/09/10 ---->add looptimes.
// Last updated: 2003/09/17 ---->delete unused content.debug passed.
//to keep two curves vertical.
verCurve.rotateY = tanCurve.rotateY + 90;
float $times = eggBasePoint.loopTimes;
//NECESSARY CONDITION 1: rotateZ *************
EggBody.rotateZ = sign($times) * verCurve.rotateY;
//NECESSARY CONDITION 2: translateY *************
EggBody.translateY = distPivPointShape.distance + eggBasePoint.translateY;
float $distance;
$distance=distPivTouchShape.distance;
motionPath1.uValue = abs(($times % 1));
float $arclen;
$arclen=curveInfo1.arcLength * motionPath1.uValue;
// Now compare whether the pivotPoint is in front of or
// behind the touchPoint.
float $verRy;
float $refRy;
float $sign1;
float $alpha;
$verRy = (verCurve.ry > 0) ? verCurve.ry : (360 + verCurve.ry);
$refRy = (refCurve.ry > 0) ? refCurve.ry : (360 + refCurve.ry);
//to make 0< alpha <180
$alpha = (($verRy - $refRy) + 360) % 180;
//-1:behand, 1:front, begin:uvalue=0
$sign1= ($alpha > 90)? (-1) : 1;
//NECESSARY CONDITION 3: translateX *************
EggBody.translateX = -($arclen + $sign1*$distance)
* sign($times)
//times sign decide direction
- (curveInfo1.arcLength) * trunc($times)
//full times Length
+ eggBasePoint.translateX;
//egg base offset
//egg's tz is based on eggBasePoint.tz
EggBody.translateZ = eggBasePoint.translateZ;
//The end.
这是一个二维的模型,O是curve的pivot,D是垂足,T是鸡蛋和平面的接触点,C是曲线模型的起始点,直线dt代表地面,线段od代表物体中心离地面的距离,弧线ct的长度可以由curveInfo.arcLength给出。物体滚动的距离其实就是(架设从c点接触地面开始):弧ct + 线段dt。(或者减,看垂足d是在滚动方向的前方还是后方)。图中线段od和dt是用MAYA自带的measureTools/distanceTool直接测量的。我想这样比自己计算两点间距或者勾股定理套公式要省事一些,也好理解一点吧。
由于有的物体边缘内凹,所以在滚动的时候内凹的部分接触不到地面,在物体翻滚之前,需要做一个二维的轮廓模型,在凹陷的地方取直线,微微有一点点外凸最好,用这个模型取得位移和旋转的坐标,而用真实的物体做动画。在motionPath的uValue中调节曲线,这里还是要key几个关键帧的。但是比起全手动要简单,还能随时更改快慢。
用一个静态的模型,实现对动态运动的控制。图中的鸡蛋受一个locator控制它的基准坐标,这样即使做过动画,也能很方便的移动到另一个位置。graph Editor中是loopTimes的曲线,% 1 后给uValue, 用来控制快慢和方向。