?? 群系統(tǒng)3.mel
字號(hào):
}
}
//上面這段代碼對(duì)每一組小車使用for循環(huán)進(jìn)行遍歷。在第一個(gè)循環(huán)中,每個(gè)導(dǎo)引小車被連接到所有的跟隨小車,在第個(gè)循環(huán)中
//每個(gè)跟隨小車被連接到所有的導(dǎo)引小車。保存腳本并再次清除場(chǎng)景。單擊MEL圖標(biāo)并觀察結(jié)果。這次會(huì)得到更細(xì)致的效果
//當(dāng)導(dǎo)引小車靠近時(shí),每個(gè)跟隨小車開(kāi)始跟隨導(dǎo)引小車,如果它們落在小車的影響距離之外,它們將以自己的方式運(yùn)動(dòng)。
//現(xiàn)在需要將跟隨小車的場(chǎng)連接到跟隨小車,導(dǎo)引小車的握手連接到導(dǎo)引小車,以使得能夠得到與例3中所找不到的相同的
//避讓行為。需要另一個(gè)嵌套循環(huán)完成這個(gè)工作。在腳本中緊接著上面的循環(huán)輸入下面的代碼:
//connect same type vehicles to each other.Disconnect vehicle from itself
for ($i=0;$i<LvNumber;$i++)
{
//connect leaders to leaders
for($j=0;$j<$LvNumber;$j++)
{
connectDynamic -f ("vehicleLForce_"+$i) ("rigidVehicleL_"+$j);
}
connectDynamic -delete -f ("vehicleLForce_"+$i) ("rigidVehicleL_"+$i);
}
for($i=0;$i<$FvNumber;$i++)
{
//connect followers to followers
for($j=0;$j<$FvNumber;$j++)
{
connectDynamic -f ("vehicleFForce_"+$i) ("rigidVehicleF_"+$j);
}
connectDynamic -delete -f ("vehicleFForce_"+$i) ("rigidVehicleF_"+$i);
}
//最后,必須斷開(kāi)(-delete)連接到自身的力場(chǎng),以使得小車不會(huì)試圖排斥自己。在空上例子中,如果不斷開(kāi)這些場(chǎng)也不會(huì)有什么明顯的
//效果,但是在使用動(dòng)力學(xué)引擎時(shí),確保不存在沒(méi)有物理意義的連接通常是一個(gè)好的做法,因?yàn)檫@樣的連接可能會(huì)導(dǎo)致無(wú)法預(yù)期
//的結(jié)果。現(xiàn)在會(huì)看到小車的運(yùn)動(dòng)變得相當(dāng)自然,它們沿著自己的運(yùn)動(dòng),相互避讓并跟隨導(dǎo)引小車。
//在主腳本中添加全局力的函數(shù)
//在目前這個(gè)當(dāng)口,需要檢查$gForce變量以決定是否調(diào)用makeGforces()。需要執(zhí)行全局過(guò)程makeGforces(),以保證在
//Hook up fields部分的代碼中連接全局力時(shí),它們是存在的。首先,需要檢查在中該選項(xiàng)是否被選中。在針對(duì)小車數(shù)量的
//switch語(yǔ)句之后,將下面的行添加到代碼中
if($gforces==1) makeGforces;//check global forces option
//Basic vehicle model type:follower
//現(xiàn)在將為createCrowd()過(guò)程添加一個(gè)由crowdSystem()過(guò)程傳入的整型參數(shù)。編輯createCrowd()過(guò)程的定義以接受這個(gè)新的參數(shù):
global proc createCrowd(int $vNumber,int $gforces)
{
//在crowdSystem()過(guò)程中添加$gforces,具體如下:
button -edit -command ("createCrwod $vNumber $gforces;deleteUI crowdWin;") $buttion1;
}
//現(xiàn)在需要在循環(huán)中添加當(dāng)$gforces被設(shè)置為1(即用戶打開(kāi)全局場(chǎng)選項(xiàng))時(shí),連接全局場(chǎng)的代碼。在Hook up fields代碼部分添加
//connect global forces to both types of vehicles if option is on
if ($gforces==1)
{
string $compass[4]={"N","S","E","W"};
for($i=0;$i<$LvNumber;$i++)
{
for($c=0;$c<size($compass);$c++)
{
connectDynamic -f ("Gforce"+$compass[$c]) ("rigidVehicleL_"+$i);
}
}
for($i=0;$i<$FvNumber;$i++)
{
for($c=0;$c<size($compass[$c]);$c++)
{
connectDynamic -f ("Gforce"+$compass[$c]) ("rigidVehicleF_"+$i);
}
}
}
//這段代碼是在前面所使用的嵌套循環(huán)的變體,只是在其中創(chuàng)建了一個(gè)4包含個(gè)主要方向的數(shù)組$compass,并使用這些字符串來(lái)構(gòu)造每一個(gè)場(chǎng)的名稱
//測(cè)試全局力的選項(xiàng)
//需要再次測(cè)試該腳本,以確保全局力選項(xiàng)能夠正確控制場(chǎng)的創(chuàng)建和連接,這些場(chǎng)實(shí)現(xiàn)全局力。保存該腳本并單擊擱板上的MEL
//圖標(biāo)。當(dāng)對(duì)話框出現(xiàn)時(shí),打開(kāi)Global Forces選項(xiàng)并單擊Create按鈕。移動(dòng)滑塊以利用全局場(chǎng)沿不同方向推動(dòng)小車。如果希望
//查看是否所有場(chǎng)連接都是正確的,選擇Window>>Relationship Editors>>Dynamic Relationships..菜單項(xiàng)。
//添加主啟動(dòng)過(guò)程
//這里希望為腳本添加一個(gè)主過(guò)程,它將提供兩個(gè)功能。首先,它將初始化一個(gè)全局字符串?dāng)?shù)組,其中將包含腳本啟動(dòng)時(shí)在MAYA
//界面中所選中對(duì)象的名稱列表。稍后,將添加這些被選中對(duì)象成為障礙物的代碼。其次,主過(guò)程將添加判斷窗口是否已經(jīng)存在
//的測(cè)試語(yǔ)句。如果該窗口已經(jīng)存在,就說(shuō)明該腳本前一次執(zhí)行所創(chuàng)建的舊窗口仍然處于打開(kāi)狀態(tài),并且先前的群系統(tǒng)也可能
//存在。在madeGlobalForce過(guò)程后,將下面的代碼添加到腳本中:
//main
//____
global proc crowdMain()
{
global string $collectObjects[];//Initialize global string that all procs can see
if (`window -exists crowdWin`)//Check to see if window is open
{
confirmdialog -t "Already running!" -m "Please close Crowd System window and create a New Scene";
}
else
{
$collectObjects=`ls -sl`;//collect objects that are selected
crowdSystem;//Run crowdSystem proc
}
}
//在該窗口已經(jīng)處于打開(kāi)的情況下,使用confirmDialog提供一條錯(cuò)誤信息。在用戶按下confirm按鈕后該腳本將退出。如果希望在不運(yùn)行該腳本
//的情況下看到錯(cuò)誤提示對(duì)話框,將下面折代碼剪切并粘貼到腳本編輯器中,并按下回車
confirmDialog -t "Already running!" -m "Please close Crowd System window and create a New Scene";
//為在過(guò)程之間共享數(shù)據(jù)而創(chuàng)建保存所選中對(duì)象列表的全局變量$collectObjects常常不是一個(gè)好的做法,通常,將數(shù)據(jù)作為過(guò)程
//的參數(shù)來(lái)傳遞是一個(gè)更好的選擇。然而,在大型的腳本中,將在代碼中很多地方都需要訪問(wèn)的、類似初始選取列表這樣的數(shù)據(jù)
//作為全局變量來(lái)使用是合理的。因?yàn)楝F(xiàn)在希望使用腳本的入口點(diǎn)為crowdMain()過(guò)程,需要在擱板按鈕MEL腳本中將對(duì)crowdSystem()
//的調(diào)用替換為對(duì)crowdMain()的調(diào)用。
//為腳本添加collectObstacles過(guò)程
//現(xiàn)在為腳本添加一個(gè)新的collectObstacles過(guò)程,該過(guò)程在對(duì)話框中obstacles特性被打開(kāi)的情況下,會(huì)使得所有被選中對(duì)象成為障礙
//物。在createCrowd過(guò)程后,加入下面的代碼
cycleCheck -e off;
//Build obstacles
//_______________
global proc collectObstacles()
{
global string $collectObjects[];
//Re-declare global array for obstacles
if (size($collectObjects)==0)
{
warning "No obstacles objects were selected.";
}
else
{
for($i=0;$i<size($collectObjects);$i++)
{
rigidBody -passive -name ($collectObjects[$i]+"RigidB"+$i) -b 2.0 ($collectObjects[$i]);
}
}
}//End of collectObstacles proc
//上面的過(guò)程首先聲明全局變量$collectObstacles,以使能在該過(guò)程的代碼中訪問(wèn)該變量。接著,該過(guò)程遍歷在$collectObstacles
//變量中所列出的對(duì)象,并將這些對(duì)象轉(zhuǎn)變?yōu)閯傮w對(duì)象,以使得小車能夠與它們進(jìn)行碰撞。rigidBody命令自動(dòng)將新的剛體對(duì)象連接到
//crowdSolver對(duì)象,因?yàn)樗匀皇钱?dāng)前求解器。同時(shí),也將添加腳本運(yùn)行時(shí),在沒(méi)有選中任何對(duì)象的條件下會(huì)顯示的一條警告
//信息:warning "No obstacle objects were selected."
//該警告信息通知用戶在界面中Obstacles On選項(xiàng)已經(jīng)被選中,但沒(méi)有任何對(duì)象被選中,并被存儲(chǔ)到$collectObstacles數(shù)組中
//該警告不會(huì)停止運(yùn)行該腳本,而只會(huì)在MAYA界面右下角的狀態(tài)行中打印該警告信息。將warning命令行剪切并粘貼到腳本編輯
//器中,看看它能產(chǎn)生什么效果。
//在場(chǎng)景中添加對(duì)象并運(yùn)行腳本
//下面在場(chǎng)景中放置一些對(duì)象并測(cè)試Obstacles選項(xiàng)。創(chuàng)建一個(gè)新場(chǎng)景并在其中放置幾個(gè)polyCube對(duì)象。可以將Cube放置在
//任何喜歡的位置,但是記住小車將會(huì)被分布在X軸和Z軸坐標(biāo)為-120和120之間的區(qū)域內(nèi)。選中這些Cube并單擊MEL按鈕。
//注意:有時(shí)候,可能會(huì)因?yàn)橛袃蓚€(gè)或多個(gè)小車被放到一個(gè)障礙物中,或者被放到另一個(gè)小車中而看到一條構(gòu)造信息。由于
//障礙物和小車會(huì)相互排斥,這個(gè)問(wèn)題在幾幀之內(nèi)將會(huì)自己得到糾正。這個(gè)問(wèn)題是由于使用rand函數(shù)來(lái)放置小車,并在放置之前
//沒(méi)有檢查它們是否相交所導(dǎo)致的結(jié)果。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -