Maya特效教程
Maya特效教程:Maya用Expression實現(xiàn)讓雞蛋自己翻滾的效果
編輯:Penny來源:發(fā)布時間:2010-06-28
本文的目的是探討一下用Expression等方法來實現(xiàn)不規(guī)則圓的物體(如雞蛋,變形的輪胎)在平面上無滑動的滾動效果,由于不用關(guān)鍵楨key,而且速率可調(diào),這樣重用率高,從而效率也提高了。
源代碼
我希望提供這樣的思路,能起到拋磚引玉的作用,讓更多的人來關(guān)注,研究Maya,MEL,Expression,來實現(xiàn)更好的效果,進(jìn)而促進(jìn)這一領(lǐng)域的范圍更廣,層次更深的應(yīng)用,交流和合作。唯愿如此
//************** 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是雞蛋和平面的接觸點(diǎn),C是曲線模型的起始點(diǎn),直線dt代表地面,線段od代表物體中心離地面的距離,弧線ct的長度可以由curveInfo.arcLength給出。物體滾動的距離其實就是(架設(shè)從c點(diǎn)接觸地面開始):弧ct + 線段dt。(或者減,看垂足d是在滾動方向的前方還是后方)。圖中線段od和dt是用MAYA自帶的measureTools/distanceTool直接測量的。我想這樣比自己計算兩點(diǎn)間距或者勾股定理套公式要省事一些,也好理解一點(diǎn)吧。
由于有的物體邊緣內(nèi)凹,所以在滾動的時候內(nèi)凹的部分接觸不到地面,在物體翻滾之前,需要做一個二維的輪廓模型,在凹陷的地方取直線,微微有一點(diǎn)點(diǎn)外凸最好,用這個模型取得位移和旋轉(zhuǎn)的坐標(biāo),而用真實的物體做動畫。在motionPath的uValue中調(diào)節(jié)曲線,這里還是要key幾個關(guān)鍵幀的。但是比起全手動要簡單,還能隨時更改快慢。
用一個靜態(tài)的模型,實現(xiàn)對動態(tài)運(yùn)動的控制。圖中的雞蛋受一個locator控制它的基準(zhǔn)坐標(biāo),這樣即使做過動畫,也能很方便的移動到另一個位置。graph Editor中是loopTimes的曲線,/% 1 后給uValue, 用來控制快慢和方向。
源代碼
我希望提供這樣的思路,能起到拋磚引玉的作用,讓更多的人來關(guān)注,研究Maya,MEL,Expression,來實現(xiàn)更好的效果,進(jìn)而促進(jìn)這一領(lǐng)域的范圍更廣,層次更深的應(yīng)用,交流和合作。唯愿如此
//************** 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是雞蛋和平面的接觸點(diǎn),C是曲線模型的起始點(diǎn),直線dt代表地面,線段od代表物體中心離地面的距離,弧線ct的長度可以由curveInfo.arcLength給出。物體滾動的距離其實就是(架設(shè)從c點(diǎn)接觸地面開始):弧ct + 線段dt。(或者減,看垂足d是在滾動方向的前方還是后方)。圖中線段od和dt是用MAYA自帶的measureTools/distanceTool直接測量的。我想這樣比自己計算兩點(diǎn)間距或者勾股定理套公式要省事一些,也好理解一點(diǎn)吧。
由于有的物體邊緣內(nèi)凹,所以在滾動的時候內(nèi)凹的部分接觸不到地面,在物體翻滾之前,需要做一個二維的輪廓模型,在凹陷的地方取直線,微微有一點(diǎn)點(diǎn)外凸最好,用這個模型取得位移和旋轉(zhuǎn)的坐標(biāo),而用真實的物體做動畫。在motionPath的uValue中調(diào)節(jié)曲線,這里還是要key幾個關(guān)鍵幀的。但是比起全手動要簡單,還能隨時更改快慢。
用一個靜態(tài)的模型,實現(xiàn)對動態(tài)運(yùn)動的控制。圖中的雞蛋受一個locator控制它的基準(zhǔn)坐標(biāo),這樣即使做過動畫,也能很方便的移動到另一個位置。graph Editor中是loopTimes的曲線,/% 1 后給uValue, 用來控制快慢和方向。