高分问一个mel 问题(mayaMEL)

场景里有3000个物体 怎么随即选取其中得一半?写一个mel脚本。
2024-11-16 20:24:19
推荐回答(4个)
回答1:

//选择正没需要随机挑选的全部物体(在outliner里面选择可能快一些),然后
//拷贝下面代码到script editor中,执行。

global proc nwRandPickUp(string $totalSelection[]) {
int $lengthOfSelection = size($totalSelection); //初始选择集的长度
int $t = 0;
int $i;
int $incrementi = $i + 2; //$incrementi是随机函数挑选因子伍拍的下限
int $decrementLength = $lengthOfSelection - 2; //同理,是随机函数挑选因子的上限
string $_dummyStr = "";
string $pickedSelection[]; //最终的随机抽取的物体的选择集
clear($pickedSelection); //初始腔清羡化物体选择集
for ($i = 0; $i < $lengthOfSelection/2; $i++) {
$t = trunc(`rand $incrementi $decrementLength`); //随机函数挑选因子,范围(i+1, n-1),n是初始选择集的长度
$_dummyStr = $totalSelection[$t];
$totalSelection[$t] = $totalSelection[$i];
$totalSelection[$i] = $_dummyStr; //交换totalSelection[$t]和totalSelection[$i]使得每一次挑选都是在之前挑选的结果之外
}
for ($i = 0; $i < $lengthOfSelection/2; $i++) //将需要的那一半物体拷贝出来到目的选择集
$pickedSelection[$i] = $totalSelection[$i];
select -r $pickedSelection;
}
string $currentSelection[] = `ls -sl`; //将屏幕上选择的物体填入初始选择集
print (size($currentSelection));
print "\n";
nwRandPickUp ($currentSelection); //执行全局proc
string $currentSelection[] = `ls -sl`;
print ("\n\n" + size($currentSelection));

回答2:

string $sel[]=`ls -sl`;//选择所有物体
int $size = size($sel);//测量数组元素个数
string $select_a = "";//定义一个空字符串
for($i=0;$i<$size;$i++)
{
float $rand_a = rand($size);//为当前物体分配一个随机值,随机值为所有物体的个数,其目的为打乱物体的ID
if($rand_a >= $size/2)//如果随机的数值大于总数纤枣闭的50%
$select_a += $sel[$i]+" ";//那么它就被加入这个新的队伍;
}
string $com = "select -r "毁裂+$select_a;//将执行命令作为一个字符串
eval $com;//执行这个命令
string $sel[]=`ls -sl`;
int $size = size($sel);
print $size;//得到满足条件的物体的个岩正数,不会正好是一半,但是比较接近;

回答3:

这3000个物体是同一类型的么? 或者有相同的或桐前缀么? 例如3000个NURBS物体或着名大塌字为polyCube0001~polyCube3000. 总之有规律可循就行. 那滚团圆就好实现了.

回答4:

/散和滑/这个mel会随机选择场景里所有可见物体的一半棚知数量
//不过不能针对骨骼选择,如果场景里有摄像机冲腊,要先把摄像机隐藏
select -cl;
string $akk[] = (`ls -tr -v`);
int $int;
int $as = rand((`size $akk`)/2);
print $as;
print "\r";
for ($int=0;$int<(`size $akk`)/2;$int++)
{
int $ss = $as+$int;
select -add $akk[$ss];
};