Maya特效教程
Maya特效教程:Maya表達(dá)式控制動(dòng)力學(xué)動(dòng)畫之尾巴
編輯:Penny來源:發(fā)布時(shí)間:2010-06-28
前面我們通過表達(dá)式可以計(jì)算出物體的速度和加速度,得到了物體的速度和加速度,我們就可以嘗試運(yùn)用表達(dá)式控制很多有關(guān)動(dòng)力學(xué)的動(dòng)畫。下面是我一個(gè)利用表達(dá)式模擬尾巴運(yùn)動(dòng)的表達(dá)式練習(xí)。希望能對初學(xué)的朋友們有所幫助?! ∥覀兪紫瓤匆幌滦Ч麍D。
1.創(chuàng)建一個(gè)長方體作為身體,然后創(chuàng)建一條有六七節(jié)的尾巴骨骼,再將尾巴骨骼連接到長方體上,作為其子物體,如圖。
2.建立身體速度及加速度表達(dá)式。表達(dá)式如下:
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; 其中身體的速度及加速度三個(gè)維度都要計(jì)算,但開始測試時(shí)可以只考慮一個(gè)維度。
另外要為身體添加三個(gè)加速度的屬性box.ax,box.ay,box.az,尾巴骨骼的動(dòng)力學(xué)效果都是靠這三個(gè)屬性值來控制的。其中$k1為比例系數(shù),通過調(diào)整這個(gè)參數(shù),可以控制尾巴對加速度的敏感程度,為方便調(diào)試和控制,大家可以考慮把這個(gè)參數(shù)也作為身體的一個(gè)屬性。
3.建立尾巴的速度、加速度和尾巴轉(zhuǎn)動(dòng)角度的表達(dá)式:
尾巴的速度和加速度主要為旋轉(zhuǎn)角速度和角加速度,其計(jì)算思路為:由身體的位移加速度和尾巴第一節(jié)骨骼當(dāng)時(shí)的角位移計(jì)算出其角速度和角加速度及其轉(zhuǎn)動(dòng)角度值,再將轉(zhuǎn)動(dòng)角度值賦予骨骼角度通道。如果不考慮身體的z軸方向的旋轉(zhuǎn),尾巴骨骼的角速度和角加速度僅考慮兩個(gè)維度就可以了。分別編寫兩個(gè)維度的表達(dá)式,如下為尾巴第一節(jié)骨骼的y軸向的速度和加速度的表達(dá)式。
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為骨骼的角加速度系數(shù),其值可以控制骨骼的剛性屬性,原理上值越大,骨骼越不易彎曲,但實(shí)際上此值不能太大,否者骨骼的震蕩會(huì)無法控制,此值在前面全局變量中定義。
其中joint1.ay為第一節(jié)骨骼的附加屬性,用來表示其y軸向的角加速度。X軸方向與之同理。
第二節(jié)及其后續(xù)骨骼表達(dá)式基本一致,與第一節(jié)骨骼不同之處在于其初始角加速度是由前一節(jié)骨骼的骨端位移加速度和自身角度偏移量計(jì)算得出的。如下為第二節(jié)骨骼的y軸向的角速度,角加速度和角度值的表達(dá)式,最后將角度值賦予相應(yīng)角度通道即可。
其它骨骼與之基本一致,不同的為個(gè)別參數(shù)的修正。其中$a1=1.5*joint1.ay*cosd($x);表達(dá)式中的1.5是我定義的第一節(jié)骨骼的長度系數(shù),其他各節(jié)根據(jù)實(shí)際的骨骼情況作相應(yīng)變化,例如我定義的骨骼為1.5,1.2,1.0,0.8,0.5。如果骨骼長度相同,其值應(yīng)相同。
對于目前這個(gè)表達(dá)式,我對后續(xù)骨骼進(jìn)行角速度及角加速度的計(jì)算時(shí)未考慮前一節(jié)骨骼在空間的具體角度值,因此只適合于尾巴整體彎曲不大,精度要求不高的場合,有興趣的朋友自己可以嘗試加入這方面的控制。還有目前的尾巴僅僅是被動(dòng)地跟隨身體的運(yùn)動(dòng)而擺動(dòng),朋友們可以為尾巴骨骼添加主動(dòng)施加力的影響,讓尾巴可以有意識(shí)的擺動(dòng)。
這個(gè)表達(dá)式僅是練習(xí),其中還有很多具體因素未全面深入考慮,一些參量的計(jì)算不夠精確,有興趣的朋友可以考慮完善,做出更好的控制效果來。
測試動(dòng)畫。
測試動(dòng)畫。
1.創(chuàng)建一個(gè)長方體作為身體,然后創(chuàng)建一條有六七節(jié)的尾巴骨骼,再將尾巴骨骼連接到長方體上,作為其子物體,如圖。
2.建立身體速度及加速度表達(dá)式。表達(dá)式如下:
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; 其中身體的速度及加速度三個(gè)維度都要計(jì)算,但開始測試時(shí)可以只考慮一個(gè)維度。
另外要為身體添加三個(gè)加速度的屬性box.ax,box.ay,box.az,尾巴骨骼的動(dòng)力學(xué)效果都是靠這三個(gè)屬性值來控制的。其中$k1為比例系數(shù),通過調(diào)整這個(gè)參數(shù),可以控制尾巴對加速度的敏感程度,為方便調(diào)試和控制,大家可以考慮把這個(gè)參數(shù)也作為身體的一個(gè)屬性。
3.建立尾巴的速度、加速度和尾巴轉(zhuǎn)動(dòng)角度的表達(dá)式:
尾巴的速度和加速度主要為旋轉(zhuǎn)角速度和角加速度,其計(jì)算思路為:由身體的位移加速度和尾巴第一節(jié)骨骼當(dāng)時(shí)的角位移計(jì)算出其角速度和角加速度及其轉(zhuǎn)動(dòng)角度值,再將轉(zhuǎn)動(dòng)角度值賦予骨骼角度通道。如果不考慮身體的z軸方向的旋轉(zhuǎn),尾巴骨骼的角速度和角加速度僅考慮兩個(gè)維度就可以了。分別編寫兩個(gè)維度的表達(dá)式,如下為尾巴第一節(jié)骨骼的y軸向的速度和加速度的表達(dá)式。
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為骨骼的角加速度系數(shù),其值可以控制骨骼的剛性屬性,原理上值越大,骨骼越不易彎曲,但實(shí)際上此值不能太大,否者骨骼的震蕩會(huì)無法控制,此值在前面全局變量中定義。
其中joint1.ay為第一節(jié)骨骼的附加屬性,用來表示其y軸向的角加速度。X軸方向與之同理。
第二節(jié)及其后續(xù)骨骼表達(dá)式基本一致,與第一節(jié)骨骼不同之處在于其初始角加速度是由前一節(jié)骨骼的骨端位移加速度和自身角度偏移量計(jì)算得出的。如下為第二節(jié)骨骼的y軸向的角速度,角加速度和角度值的表達(dá)式,最后將角度值賦予相應(yīng)角度通道即可。
其它骨骼與之基本一致,不同的為個(gè)別參數(shù)的修正。其中$a1=1.5*joint1.ay*cosd($x);表達(dá)式中的1.5是我定義的第一節(jié)骨骼的長度系數(shù),其他各節(jié)根據(jù)實(shí)際的骨骼情況作相應(yīng)變化,例如我定義的骨骼為1.5,1.2,1.0,0.8,0.5。如果骨骼長度相同,其值應(yīng)相同。
對于目前這個(gè)表達(dá)式,我對后續(xù)骨骼進(jìn)行角速度及角加速度的計(jì)算時(shí)未考慮前一節(jié)骨骼在空間的具體角度值,因此只適合于尾巴整體彎曲不大,精度要求不高的場合,有興趣的朋友自己可以嘗試加入這方面的控制。還有目前的尾巴僅僅是被動(dòng)地跟隨身體的運(yùn)動(dòng)而擺動(dòng),朋友們可以為尾巴骨骼添加主動(dòng)施加力的影響,讓尾巴可以有意識(shí)的擺動(dòng)。
這個(gè)表達(dá)式僅是練習(xí),其中還有很多具體因素未全面深入考慮,一些參量的計(jì)算不夠精確,有興趣的朋友可以考慮完善,做出更好的控制效果來。
測試動(dòng)畫。
測試動(dòng)畫。
招生熱線
快速導(dǎo)航
入學(xué)要求 | 課程設(shè)置 | 暴雪動(dòng)態(tài) | 我要報(bào)名
學(xué)員作品 | 就業(yè)學(xué)員 | 招生問答 | 暴雪簡介
公司作品 | 周邊介紹 | 教學(xué)環(huán)境 | 乘車路線
學(xué)生作品