张亮
摘 要:在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.