張亮
摘 要:在maya中筆刷paint是常用的工具方式之一,用戶會(huì)遇到需定義一個(gè)符合自己要求的筆刷之類的問題,同時(shí)可以對(duì)大部分面積模型進(jìn)行操作,這將會(huì)影響今后工作的生產(chǎn)效率。該文借助MEL這一具有強(qiáng)大擴(kuò)展性的腳本語言闡述該實(shí)現(xiàn)功能的基本原理,分析隨機(jī)控制,關(guān)鍵幀設(shè)置的Mel語言實(shí)現(xiàn)流程。通過這一研究,為MEL在maya中具體使用提供一定借鑒意義。
關(guān)鍵詞:Maya 筆刷 建模 MEL
中圖分類號(hào):TP39 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2019)01(b)-00-02
在maya中制作植物生長,使用者往往遇到想要自定義的植物或者形態(tài),同時(shí)對(duì)這個(gè)形態(tài)進(jìn)行更高塑造。然后對(duì)整個(gè)部分隨機(jī)變化,對(duì)細(xì)節(jié)進(jìn)行調(diào)整。利用Maya系統(tǒng)中可視化的工具或命令進(jìn)行修改,是件繁瑣的事情。怎樣在過程中創(chuàng)作符合要求的工具,和合理的代碼是實(shí)現(xiàn)解決這些問題的關(guān)鍵。制作類似植物生長的方法,包括隨機(jī)、設(shè)置關(guān)鍵幀、調(diào)整形態(tài),有些地方不僅局限在maya中可視化工具,對(duì)于熱衷使用技巧的人來說,script是實(shí)現(xiàn)該方法的捷徑。該文主要闡述畫筆工具基于mel腳本語言快速實(shí)現(xiàn)相關(guān)功能,方便操作;整體控制、隨機(jī)變化,關(guān)鍵幀操作在maya中引用。
1 定義畫筆和畫筆工具的修改
在畫筆工具里,定義筆刷的相關(guān)屬性。
brushPresetSetup();bPset "time" 1;
bPsetName "imageName" "";
brushPresetApply();
presetSetPressure 1 0 0 1;
presetSetPressure 2 0 0 1;
presetSetPressure 3 0 0 1;
rename (getDefaultBrush()) Tubes;
定義好筆刷后,我們需要把筆刷attach到tube上
$sel = `ls -sl`;
string $sel3[];
int $i =0;
clear $sel3;
for ($each in $sel)
{
select $each;
stringArrayInsertAtIndex ($i, $sel3, $obj[0]);
$i++;
};
select $sel3;
select -cl;
changeToolIcon;
SelectTool;
AttachBrushToCurves;
$obj = `ls -sl`;
2 隨機(jī)控制選取對(duì)象
為了使插件更具有隨機(jī)性,能夠更加真實(shí)地模仿自然生長的花草,添加了隨機(jī)功能。
在隨機(jī)控制我們采取用數(shù)組儲(chǔ)存列表,然后對(duì)每個(gè)元素進(jìn)行操作。即每次在這個(gè)列表中隨機(jī)抽取一個(gè)元素,然后把最后一個(gè)元素填補(bǔ)在這個(gè)元素上,同時(shí)刪除最后一個(gè)元素,執(zhí)行次數(shù)為你想要的隨機(jī)概率。具體的實(shí)例小樣如下。
global proc random()
{
float $list[];
int $len = 1000;
int $i, $j;
for($i = 0;$i <$len; $i++)
{
$list[$i] = $i *0.001;
}
int $last = $len - 1;
for($j = 1;$j <=500; $j++)
{
int $a = rand($last + 1);
$qs = $list[$a];
$list[$a] = $list[$last];
$last--;
print($qs);
print("\n");
}
}
random();
在這里第一個(gè)for循環(huán)是建立1000長度的數(shù)組元素,值域0.001~0.999之間。第二個(gè)for循環(huán)是在1000選取500個(gè),print可以當(dāng)作以后對(duì)這個(gè)元素進(jìn)行操作的元素。接下來要實(shí)現(xiàn)我們?cè)诋嫻P一些屬性的隨機(jī)。
global proc setRandom()
{
float $sk[];
string $obj[] = `ls -sl`;
string $temp_obj[] =$obj;
int $obj_len = size($obj);
int $i, $j;
int $w = $obj_len - 1;
for($j = 1;$j <= $obj_len*0.8; $j++)
{
int $a = rand($w + 1);
string $qs = $obj[$a];
$obj[$a] = $obj[$w];
$w--;
setRandom_EvSingleSection({$qs});
}
select $temp_obj;
};
global proc setRandom_EvSingleSection(string $qs[])
{
float $getValue_flowSpeed = rand(1,5);
float $getValue_globalScale = rand(0.5,3);
float $getValue_brushWidth = rand(0.5,3);
$objSelected = $qs;
string $currentObject;
for($currentObject in $objSelected)
{
$selection = `ls -dag $currentObject `;
$node = `listConnections -d off -s on ($selection[1] + ".brush")`;
setAttr ($node[0] + ".flowSpeed") $getValue_flowSpeed;
}
};
在這里只是改變這個(gè)節(jié)點(diǎn)3個(gè)屬性,如果需要更多的變化,也可以這里多添加更多的屬性。要想獲得操作這個(gè)節(jié)點(diǎn),需要了解maya的dag網(wǎng)絡(luò)結(jié)構(gòu)。還有注意的是最后還要從新選擇temp_obj這樣用戶對(duì)隨機(jī)操作的效果不滿意,可以重新隨機(jī),而不用重新選擇。以上的隨機(jī)獲取并隨機(jī)的方式不只是可以在畫筆中,在其他模塊一樣有用。
3 實(shí)現(xiàn)用戶關(guān)鍵幀
由于為了使畫面的更加動(dòng)態(tài),所以會(huì)使每個(gè)畫筆的開始時(shí)間不同,可以設(shè)置關(guān)鍵幀。在此主要分為兩個(gè)模塊:第一模塊是用戶輸入想要開始生長的幀數(shù);第二模塊是通過滑塊組在當(dāng)前界面幀開始生長。在第一模塊中,由于maya中額starttime(開始時(shí)間)的修改是秒為單位,下面的時(shí)間滑塊組是以幀為單位的。為此,在mel中將輸入端的數(shù)據(jù)乘上1/25(maya中默認(rèn)1s為25幀),從而解決時(shí)間單位不統(tǒng)一的問題。第二模塊的實(shí)現(xiàn)則也需要考慮到時(shí)間單位的問題,直接通過獲取當(dāng)前界面的時(shí)間幀此時(shí)獲取的數(shù)據(jù)只是純的數(shù)字,若直接賦予則會(huì)產(chǎn)生錯(cuò)誤,因?yàn)橐x予的是以幀為單位的數(shù)據(jù),則同樣為界面獲取的時(shí)間數(shù)據(jù)乘上1/25,并將此數(shù)據(jù)對(duì)應(yīng)的maya屬性修改,從而實(shí)現(xiàn)了在界面當(dāng)前時(shí)間幀開始生長的功能。
參考文獻(xiàn)
[1] AdamMechtley,RyanTrowbridge.Maya Python游戲與影視編程指南[M].北京:人民郵電出版社,2016.
[2] 張寶榮,呂新歡.Maya總動(dòng)員[M].北京:清華大學(xué)出版社,2011.
[3] 王澄宇.MAYA腳本應(yīng)用手冊(cè)[M].北京:人民郵電出版社,2013.