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