MAYA表達式控制動力學(xué)動畫之小雞搶食的場景方法介紹
本教程向朋友們介紹MAYA表達式控制動力學(xué)動畫之小雞搶食場景的方法,群體動畫是表達式或MAYA mel語言的強項,下面我們來做一個追逐的表達式練習(xí),感興趣的朋友可以看看。
用小雞搶食的情景來說明。
一群小雞在覓食,突然一只小雞發(fā)現(xiàn)一只小蟲,其他小雞過來搶食,于是就會出現(xiàn)一群小雞追逐一只小雞的場景,在具體的測試中,我用一個球體代表叼著小蟲的小雞,其他的小雞用圓錐表示。下面詳細說明整個制作過程。
1.首先制作場景,建立一塊崎嶇不平的地面,代表小雞的球體和圓錐。如圖。

2.隨機的在地面上排布 "小雞"。.為了上小雞們能夠貼在地面并且是隨著地面坡度而發(fā)生相應(yīng)的角度傾斜,將小雞們與地面進行法
線約束和幾何體約束,如圖。

4.打開表達式編輯窗口,定義各小雞初始位置。
{
if(frame==1)
{$tx[0]=ball.translateX;//
$tx[1]=ball1.translateX=7.9;
$tx[2]=ball2.translateX=3;
$tx[3]=ball3.translateX=-0.8;
$tx[4]=ball4.translateX=1.3;
$tx[5]=ball5.translateX=-2;
$tx[6]=ball6.translateX=-4.3;
$tx[7]=ball7.translateX=8.8;
$tx[8]=ball8.translateX=16.02;
$tx[9]=ball9.translateX=12.0;
$tx[10]=ball10.translateX=5.2;
$tx[11]=ball1.translateX=-7.9;
$tx[12]=ball2.translateX=13;
$tx[13]=ball3.translateX=-10.8;
$tx[14]=ball4.translateX=21.3;
$tx[15]=ball5.translateX=-12;
$tx[16]=ball6.translateX=-14.3;
$tx[17]=ball7.translateX=28.8;
$tx[18]=ball8.translateX=10.02;
$tx[19]=ball9.translateX=18.0;
$tx[20]=ball10.translateX=15.2; $tz[0]=ball.translateZ;
$tz[1]=ball1.translateZ=1;
$tz[2]=ball2.translateZ=3.347;
$tz[3]=ball3.translateZ=8.908;
$tz[4]=ball4.translateZ=0.736;
$tz[5]=ball5.translateZ=2.525;
$tz[6]=ball6.translateZ=-2.145;
$tz[7]=ball7.translateZ=4.207;
$tz[8]=ball8.translateZ=0.542;
$tz[9]=ball9.translateZ=6.277;
$tz[10]=ball10.translateZ=5;
$tz[11]=ball11.translateZ=-1;
$tz[12]=ball12.translateZ=-3.347;
$tz[13]=ball13.translateZ=-8.908;
$tz[14]=ball14.translateZ=-0.736;
$tz[15]=ball15.translateZ=-2.525;
$tz[16]=ball16.translateZ=-10.145;
$tz[17]=ball17.translateZ=-4.207;
$tz[18]=ball18.translateZ=-5.542;
$tz[19]=ball19.translateZ=16.277;
$tz[20]=ball20.translateZ=15;
5.下面進行核心的算法說明,在追逐中,不管小雞當時在什么方位,他們的目標都為有蟲的小雞,另外小雞不能相互穿過,所以在后面的小雞若要躍過前面的小雞,需要改變奔跑的方向,找空當穿插追逐。
$sign[$k]=sign($vz[$k])*sign($tz[$k]-$tz[$j]);
$dx[$j]=abs($tx[$j]-$tx[$k]);
if((abs($dz[$k]-$dz[$j])<5)
&&($sign[$k]>0)&&($dx[$j]<=5))
{ $lz[$k]=abs($dz[$k]-$dz[$j]);
$lz[$k]=min($lz[$k],$zz[$k]);
$zz[$k]=$lz[$k]; $code[$k]=$j;
$n[$k]=$n[$k] 1; }
}
&&($sign[$k]>0)&&($dx[$j]<=5))
$aFz[$k]=15 0*abs($dz[$k]/3);
else
$aFz[$k]=15 0*abs($dz[$k]/3)-$k1*(7-$lz[$k]);
if($tz[$k]<$tz[0])
$aFz[$k]=-$aFz[$k];
if(($lz[$k]<3)&&($n[$k]>0))
$afz[$k]=8*$k2*$vz[$k] 10*sign($vz[$k]);
else
$afz[$k]=$k2*$vz[$k];
$az[$k]=$aFz[$k]-$afz[$k];
if(($lz[$k]<2)&&($n[$k]>0))
$vz[$k]=$vz[$code[$k]];
else
$vz[$k]=$vz[$k] $az[$k]*$t; $tz[$k]=-$vz[$k]*$t-0.5*$az[$k]*$t*$t $tz[$k];
$vz[$k]=$vz[$code[$k]];
其中的這句表示如果某小雞前面有小雞與之距離小于2個單位時,強制其速度與前面的這只小雞相同,從而避免穿插。另外式中的一些系數(shù)和參數(shù)大多是試驗確定的,并不是最合理的定義。
$dx[$k]=$tx[$k]-$tx[0];
$aFx[$k]=-3*($dx[$k]/5) 0.05*sign($dx[$k]);
if(($lx[$k]<2)&&($n[$k]>0)&&($lz[$k]<2))
{$afx[$k]=-5*sign($lx[$k])*((2.5-$lx[$k])/2)*((2.5-$lx[$k])/2) $k3*$vx[$k];
$ax[$k]=0;}
else if(($n[$k]>0)&&($lz[$k]>=2))
$afx[$k]=-0.1*sign($lx[$k])*((5-$lx[$k])/2) $k3*$vx[$k];
else
$afx[$k]=$k3*$vx[$k];
$ax[$k]=$aFx[$k]-$afx[$k];
$vx[$k]=$vx[$k] $ax[$k]*$t;
$tx[$k]=$tx[$k] $vx[$k]*$t 0.5*$ax[$k]*$t*$t;
最后,給各小雞的實體進行賦值,如下:
ball1.translateX=$tx[1];
ball2.translateX=$tx[2];
ball3.translateX=$tx[3];
ball4.translateX=$tx[4];
ball5.translateX=$tx[5];
ball6.translateX=$tx[6];
ball7.translateX=$tx[7];
ball8.translateX=$tx[8];
ball9.translateX=$tx[9];
ball10.translateX=$tx[10];
ball11.translateX=$tx[11];
ball12.translateX=$tx[12];
ball13.translateX=$tx[13];
ball14.translateX=$tx[14];
ball15.translateX=$tx[15];
ball16.translateX=$tx[16];
ball17.translateX=$tx[17];
ball18.translateX=$tx[18];
ball19.translateX=$tx[19];
ball20.translateX=$tx[20]; ball1.translateZ=$tz[1];
ball2.translateZ=$tz[2];
ball3.translateZ=$tz[3];
ball4.translateZ=$tz[4];
ball5.translateZ=$tz[5];
ball6.translateZ=$tz[6];
ball7.translateZ=$tz[7];
ball8.translateZ=$tz[8];
ball9.translateZ=$tz[9];
ball10.translateZ=$tz[10];
ball11.translateZ=$tz[11];
ball12.translateZ=$tz[12];
ball13.translateZ=$tz[13];
ball14.translateZ=$tz[14];
ball15.translateZ=$tz[15];
ball16.translateZ=$tz[16];
ball17.translateZ=$tz[17];
ball18.translateZ=$tz[18];
ball19.translateZ=$tz[19];
ball20.translateZ=$tz[20];
" n:" $n[1] ", " $n[2] ", " $n[3] ", " $n[4] ", " $n[5] ", " $n[6] ", " $n[7] ", " $n[8] ", " $n[10] "\n"
" dx:" $dx[2] " " $dx[5] " " $dx[10] "\n"
" aFx:" $aFx[2] " " $aFx[5] " " $aFx[10] "\n"
" ax:" $ax[2] " " $ax[5] " " $ax[10] " " "\n"
" afx:" $afx[2] " " $afx[5] " " $afx[10] "\n"
" vx:" $vx[2] " " $vx[5] " " $vx[10] "\n"
" tx:" $tx[2] " " $tx[5] " " $tx[10] "\n");
$vz[],$aFx[],$afx[],$aFz[],$afz[],$ax[],$az[],$t=0.053,
$sign[],$zx[],$zz[],$k1=0.5,$k2=0.5,$k3=2,$k4;
int $code[],$i,$j,$k,$m,$n[]; for($k=1;$k<41;$k=$k 1)
{
if(frame==1)
{$tx[0]=ball.translateX;//
$tx[1]=ball1.translateX=7.9;
$tx[2]=ball2.translateX=3;
$tx[3]=ball3.translateX=-0.8;
$tx[4]=ball4.translateX=1.3;
$tx[5]=ball5.translateX=-2;
$tx[6]=ball6.translateX=-4.3;
$tx[7]=ball7.translateX=8.8;
$tx[8]=ball8.translateX=16.02;
$tx[9]=ball9.translateX=12.0;
$tx[10]=ball10.translateX=5.2;
$tx[11]=ball1.translateX=-7.9;
$tx[12]=ball2.translateX=13;
$tx[13]=ball3.translateX=-10.8;
$tx[14]=ball4.translateX=21.3;
$tx[15]=ball5.translateX=-12;
$tx[16]=ball6.translateX=-14.3;
$tx[17]=ball7.translateX=28.8;
$tx[18]=ball8.translateX=10.02;
$tx[19]=ball9.translateX=18.0;
$tx[20]=ball10.translateX=15.2; $tz[0]=ball.translateZ;
$tz[1]=ball1.translateZ=1;
$tz[2]=ball2.translateZ=3.347;
$tz[3]=ball3.translateZ=8.908;
$tz[4]=ball4.translateZ=0.736;
$tz[5]=ball5.translateZ=2.525;
$tz[6]=ball6.translateZ=-2.145;
$tz[7]=ball7.translateZ=4.207;
$tz[8]=ball8.translateZ=0.542;
$tz[9]=ball9.translateZ=6.277;
$tz[10]=ball10.translateZ=5;
$tz[11]=ball11.translateZ=-1;
$tz[12]=ball12.translateZ=-3.347;
$tz[13]=ball13.translateZ=-8.908;
$tz[14]=ball14.translateZ=-0.736;
$tz[15]=ball15.translateZ=-2.525;
$tz[16]=ball16.translateZ=-10.145;
$tz[17]=ball17.translateZ=-4.207;
$tz[18]=ball18.translateZ=-5.542;
$tz[19]=ball19.translateZ=16.277;
$tz[20]=ball20.translateZ=15; for($i=1;$i<41;$i=$i 1)
{$aFz[$i]=$afz[$i]=$vz[$i]=$az[$i]=$n[$i]=0;
$z[$i]=$lz[$i]=5;
$aFx[$i]=$afx[$i]=$vx[$i]=$ax[$i]=0;
$lx[$i]=3; } } if(frame>=1)
{
$tz[0]=ball.translateZ;
$tx[0]=50*noise(0.006*frame);
$dz[$k]=$tz[$k]-$tz[0];
$n[$k]=0;
$z[$k]=5;
{for($j=0;$j<41;$j=$j 1) {$dz[$j]=$tz[$j]-$tz[0];
$sign[$k]=sign($vz[$k])*sign($tz[$k]-$tz[$j]);
$dx[$j]=abs($tx[$j]-$tx[$k]);
if((abs($dz[$k]-$dz[$j])<5)
&&($sign[$k]>0)&&($dx[$j]<=5))
{
$lz[$k]=abs($dz[$k]-$dz[$j]);
$lz[$k]=min($lz[$k],$zz[$k]);
$zz[$k]=$lz[$k]; $code[$k]=$j;
$n[$k]=$n[$k] 1; }
}
} }
if($n[$k]==0)
$aFz[$k]=15 0*rand($k) 0*abs($dz[$k]/3);
else
$aFz[$k]=15 0*abs($dz[$k]/3)-$k1*(7-$lz[$k]);
if($tz[$k]<$tz[0])
$aFz[$k]=-$aFz[$k];
if(($lz[$k]<3)&&($n[$k]>0))
$afz[$k]=8*$k2*$vz[$k] 10*sign($vz[$k]);
else
$afz[$k]=$k2*$vz[$k];
$az[$k]=$aFz[$k]-$afz[$k];
if(($lz[$k]<2)&&($n[$k]>0))
$vz[$k]=$vz[$code[$k]];
else
$vz[$k]=$vz[$k] $az[$k]*$t; $tz[$k]=-$vz[$k]*$t-0.5*$az[$k]*$t*$t $tz[$k]; $lx[$k]=$tx[$k]-$tx[$code[$k]];
$dx[$k]=$tx[$k]-$tx[0];
$aFx[$k]=-3*($dx[$k]/5) 0.05*sign($dx[$k]);
if(($lx[$k]<2)&&($n[$k]>0)&&($lz[$k]<2))
{$afx[$k]=-5*sign($lx[$k])*((2.5-$lx[$k])/2)*((2.5-$lx[$k])/2) $k3*$vx[$k];
$ax[$k]=0;}
else if(($n[$k]>0)&&($lz[$k]>=2))
$afx[$k]=-0.1*sign($lx[$k])*((5-$lx[$k])/2) $k3*$vx[$k];
else
$afx[$k]=$k3*$vx[$k];
$ax[$k]=$aFx[$k]-$afx[$k];
$vx[$k]=$vx[$k] $ax[$k]*$t;
$tx[$k]=$tx[$k] $vx[$k]*$t 0.5*$ax[$k]*$t*$t; }
ball.translateX=$tx[0];
ball1.translateX=$tx[1];
ball2.translateX=$tx[2];
ball3.translateX=$tx[3];
ball4.translateX=$tx[4];
ball5.translateX=$tx[5];
ball6.translateX=$tx[6];
ball7.translateX=$tx[7];
ball8.translateX=$tx[8];
ball9.translateX=$tx[9];
ball10.translateX=$tx[10];
ball11.translateX=$tx[11];
ball12.translateX=$tx[12];
ball13.translateX=$tx[13];
ball14.translateX=$tx[14];
ball15.translateX=$tx[15];
ball16.translateX=$tx[16];
ball17.translateX=$tx[17];
ball18.translateX=$tx[18];
ball19.translateX=$tx[19];
ball20.translateX=$tx[20]; ball1.translateZ=$tz[1];
ball2.translateZ=$tz[2];
ball3.translateZ=$tz[3];
ball4.translateZ=$tz[4];
ball5.translateZ=$tz[5];
ball6.translateZ=$tz[6];
ball7.translateZ=$tz[7];
ball8.translateZ=$tz[8];
ball9.translateZ=$tz[9];
ball10.translateZ=$tz[10];
ball11.translateZ=$tz[11];
ball12.translateZ=$tz[12];
ball13.translateZ=$tz[13];
ball14.translateZ=$tz[14];
ball15.translateZ=$tz[15];
ball16.translateZ=$tz[16];
ball17.translateZ=$tz[17];
ball18.translateZ=$tz[18];
ball19.translateZ=$tz[19];
ball20.translateZ=$tz[20]; print("l:" $lx[2] " " $lx[5] " " $lx[10]
" n:" $n[1] ", " $n[2] ", " $n[3] ", " $n[4] ", " $n[5] ", " $n[6] ", " $n[7] ", " $n[8] ", " $n[10] "\n"
" dx:" $dx[2] " " $dx[5] " " $dx[10] "\n"
" aFx:" $aFx[2] " " $aFx[5] " " $aFx[10] "\n"
" ax:" $ax[2] " " $ax[5] " " $ax[10] " " "\n"
" afx:" $afx[2] " " $afx[5] " " $afx[10] "\n"
" vx:" $vx[2] " " $vx[5] " " $vx[10] "\n"
對于這個程序僅僅是練習(xí)的東西,還有很多問題,例如雖然考慮到了小雞們的穿插情況,但實際運行中依然有可能出現(xiàn)這樣的問題。我想應(yīng)該每幀都要對小雞們重新排序,然后按新的次序關(guān)系計算相互的影響,前面簡單的按照初始定義的序號為次序計算是不太妥當?shù)?,有時間再改改,還有就是計算頻率還是太低,現(xiàn)在每幀計算一次,如果可以每幀計算多次應(yīng)該會好很多,由朋友知道如何定義每幀的計算次數(shù)嗎?當然希望有朋友可以提出更好的方法來。
表達式可以考慮繼續(xù)完善和擴展,例如可以考慮以單個小雞的奔跑方向來定義各小雞的局部坐標,再根據(jù)這個局部坐標來計算小計的奔跑動作;可以給各小雞添加不同的屬性,例如可以使每個小雞的體質(zhì)不同;可以給整個場景添加圍欄控制,使小雞們在一定的范圍內(nèi)奔跑;可以考慮有小雞搶到了小蟲,小雞們追逐對象改變的效果;可以考慮用這個表達式模擬其他追逐情況或大隊人馬沖鋒的情景。希望朋友們做出更多更好的效果來。
相關(guān)文章

如何將Maya首選項重置為默認值? 重置Maya首選項的技巧
Maya首選項是Maya軟件中的一組用戶可配置的選項,可以讓用戶根據(jù)自己的需要調(diào)整軟件的默認設(shè)置,下面我們就來看看重置Maya首選項的技巧2024-02-18
啟動Maya軟件的時候,提醒:停止并顯示以下錯誤,然后軟件崩潰了,該怎么結(jié)解決呢?下面我們就來看看Maya崩潰的原因分析和解決辦法2024-02-18
maya控制手柄怎么創(chuàng)建IK? maya的IK表達式拉伸效果的設(shè)置方法
maya控制手柄怎么創(chuàng)建IK?maya建模的是偶,使用IK控制柄工具創(chuàng)建IK該怎么添加表達式做拉伸效果呢?下面我們就來看看maya的IK表達式拉伸的設(shè)置方法2023-02-28
maya打不開fbx文件提示Unrecognized file type錯誤怎么辦?
maya打不開fbx文件提示Unrecognized file type錯誤怎么辦?maya導(dǎo)入fbx文件失敗,提示無法識別的文件類型錯誤,該怎么辦呢?下面我們就來看看詳細的解決辦法2021-10-29
maya一款專為游戲開發(fā)者和制片人專門設(shè)計。適合視效藝術(shù)家、建模和動畫師,今天小編就來教給大家一個簡單的教程,使用maya制作立體曲面2021-09-09
maya怎么創(chuàng)建絢麗多彩的煙花? maya煙花的制作方法
maya怎么創(chuàng)建絢麗多彩的煙花?maya中想要創(chuàng)建漂亮的煙花,該怎么制作這個效果呢?下面我們就來看看詳細的教程,需要的朋友可以參考下2021-01-08
maya怎么用phoenixfd插件制作逼真的火焰動畫?maya中想要制作逼真的火焰動畫,該怎么制作這個動畫效果呢?下面我們就來看看詳細的教程,需要的朋友可以參考下2020-12-08
maya模型上的數(shù)字怎么關(guān)掉? maya模型不顯示數(shù)字的技巧
maya模型上的數(shù)字怎么關(guān)掉?maya中的模型顯示數(shù)據(jù),想要關(guān)閉顯示數(shù)據(jù),該怎么操作呢?下面我們就來看看maya模型不顯示數(shù)字的技巧,需要的朋友可以參考下2020-11-02
maya怎么重建曲面?maya中想要重建曲面,讓模型更加圓滑,該怎么操作呢?下面我們就來看看maya重建曲面的方法,需要的朋友可以參考下2020-10-10
maya骨骼不顯示怎么辦?maya文件打開以后發(fā)現(xiàn)骨骼隱藏了,我們找不到,骨骼被隱藏?zé)o非三種情況,自己被隱藏,父對象被隱藏,繪制樣式選擇了無,下面我們就來看看maya顯示骨2020-08-10






