張亮
摘 要:在maya中筆刷paint是常用的工具方式之一,用戶會遇到需定義一個符合自己要求的筆刷之類的問題,同時可以對大部分面積模型進行操作,這將會影響今后工作的生產效率。該文借助MEL這一具有強大擴展性的腳本語言闡述該實現功能的基本原理,分析隨機控制,關鍵幀設置的Mel語言實現流程。通過這一研究,為MEL在maya中具體使用提供一定借鑒意義。
關鍵詞:Maya 筆刷 建模 MEL
中圖分類號:TP39 文獻標識碼:A 文章編號:1672-3791(2019)01(b)-00-02
在maya中制作植物生長,使用者往往遇到想要自定義的植物或者形態,同時對這個形態進行更高塑造。然后對整個部分隨機變化,對細節進行調整。利用Maya系統中可視化的工具或命令進行修改,是件繁瑣的事情。怎樣在過程中創作符合要求的工具,和合理的代碼是實現解決這些問題的關鍵。制作類似植物生長的方法,包括隨機、設置關鍵幀、調整形態,有些地方不僅局限在maya中可視化工具,對于熱衷使用技巧的人來說,script是實現該方法的捷徑。該文主要闡述畫筆工具基于mel腳本語言快速實現相關功能,方便操作;整體控制、隨機變化,關鍵幀操作在maya中引用。
1 定義畫筆和畫筆工具的修改
在畫筆工具里,定義筆刷的相關屬性。
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 隨機控制選取對象
為了使插件更具有隨機性,能夠更加真實地模仿自然生長的花草,添加了隨機功能。
在隨機控制我們采取用數組儲存列表,然后對每個元素進行操作。即每次在這個列表中隨機抽取一個元素,然后把最后一個元素填補在這個元素上,同時刪除最后一個元素,執行次數為你想要的隨機概率。具體的實例小樣如下。
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();
在這里第一個for循環是建立1000長度的數組元素,值域0.001~0.999之間。第二個for循環是在1000選取500個,print可以當作以后對這個元素進行操作的元素。接下來要實現我們在畫筆一些屬性的隨機。
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;
}
};
在這里只是改變這個節點3個屬性,如果需要更多的變化,也可以這里多添加更多的屬性。要想獲得操作這個節點,需要了解maya的dag網絡結構。還有注意的是最后還要從新選擇temp_obj這樣用戶對隨機操作的效果不滿意,可以重新隨機,而不用重新選擇。以上的隨機獲取并隨機的方式不只是可以在畫筆中,在其他模塊一樣有用。
3 實現用戶關鍵幀
由于為了使畫面的更加動態,所以會使每個畫筆的開始時間不同,可以設置關鍵幀。在此主要分為兩個模塊:第一模塊是用戶輸入想要開始生長的幀數;第二模塊是通過滑塊組在當前界面幀開始生長。在第一模塊中,由于maya中額starttime(開始時間)的修改是秒為單位,下面的時間滑塊組是以幀為單位的。為此,在mel中將輸入端的數據乘上1/25(maya中默認1s為25幀),從而解決時間單位不統一的問題。第二模塊的實現則也需要考慮到時間單位的問題,直接通過獲取當前界面的時間幀此時獲取的數據只是純的數字,若直接賦予則會產生錯誤,因為要賦予的是以幀為單位的數據,則同樣為界面獲取的時間數據乘上1/25,并將此數據對應的maya屬性修改,從而實現了在界面當前時間幀開始生長的功能。
參考文獻
[1] AdamMechtley,RyanTrowbridge.Maya Python游戲與影視編程指南[M].北京:人民郵電出版社,2016.
[2] 張寶榮,呂新歡.Maya總動員[M].北京:清華大學出版社,2011.
[3] 王澄宇.MAYA腳本應用手冊[M].北京:人民郵電出版社,2013.