重要通知
《科学技术创新》版面紧张,请大家踊跃投稿。投稿邮箱 :kxjscx@kxjscxzzs.com
科学技术创新期刊信息

主管单位:黑龙江省科学技术协会

主办单位:黑龙江省科普事业中心

编辑出版:《科学技术创新》杂志社

国际标准刊号:ISSN:2096-4390

国内统一刊号:CN:23-1600/N

期刊级别:省级刊物

周   期: 旬刊

出 版 地:黑龙江省哈尔滨市

语  种: 中文;

开  本: 大16开

邮发代号 :14-269

投稿邮箱 :kxjscx@kxjscxzzs.com

在线编辑QQ :959914545

MEL语言在MAYA中笔刷的应用

时间:2020-10-28  点击:578


       

张亮

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


本文由: 科学技术创新杂志社编辑部整理发布,如需转载,请注明来源。

科学技术创新杂志社

2020-10-28

上一篇:VR虚拟现实技术对传统视频广告制作的影响
下一篇:计算机科学与技术应用研究