前言

  之前有篇博文实现了超低精度树的效果,那个时候就提到过可以用这种方法可以制作细节好像,面数超低的森林。
  但是项目需要根据地形安排树木,那么就只能用人工去排面片的方法。
  目前面片是弄好了,需要在Maya中弄出每个面片都有些许大小变化的效果。
  这种操作人工操作会累死的,所以本插件就诞生了。

实现

  原理其实非常简单,获取当前的物体放到字符串数组中,对字符串循环操作,将随机数加入到scale中。

  废话不多,直接上代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

if (`window -ex ZSD_randScaleWin` != true){//判断当前窗口是否打开了

//创建插件窗口
window -w 310 -h 100 -t ("批量随机缩放 - 插件") -in "randomScale" -s true -tb true ZSD_randScaleWin;
// 宽度 高度 title标题 icon-name 图标名称 sizeble改变大小 titlebar 标题栏 窗口的调用名

//创建一个柱状布局
columnLayout cr_mainCol;

//创建分割线
separator -style "in" -w 300 -h 8;
// 样式 "in"为内凹效果 宽度 高度

//创建栏状布局
rowColumnLayout -nc 2 -cw 1 70 -cw 2 230;
// numberOfColumns 两个子对象 column宽度 第一个70 第二个230

//创建面板上的Text文字栏
text -l "缩放值: " -al "right";
// lable 标签文字 align 对齐方向

//创建浮点数输入区
floatField -v 0 -w 60 -min 0 scaleVal;
// 默认值为0 宽度 最小值 调用数值的query名

//设置上一个层级为父对象
setParent "..";

rowColumnLayout -nc 2 -cw 1 70 -cw 2 230;
text -l "偏移振幅: " -al "right";
floatField -v 1 -w 60 offsetAmp;
setParent "..";
separator -style "none" -w 300 -h 4;

//创建随机
button -l "随机大小" -al "center" -w 300 -c ("randScale();") -ann "" butSearchReplace;
// label 按钮名称 align 对齐方式 宽度 command 执行的命令 annotation 提示 query名

//展示窗口
showWindow ZSD_randScaleWin;
}
else//已经打开了就重新将最小化的窗口打开。
{
showWindow ZSD_randScaleWin;
}

//按钮执行的函数
global proc randScale(){
//获取输入的scale数值
float $scaleVal = `floatField -q -v scaleVal`;

//获取输入的缩放振幅
float $offsetAmp = `floatField -q -v offsetAmp`;

//执行判断的布尔变量
int $checkScale = 0;

if($scaleVal == 0){//判断缩放值是否为零
$checkScale = 1;//布尔设置为true
}

//获取当前的选择的物体 存入字符串数组当中
string $sel[] = `ls -sl `;
//获取数组的长度
int $len = size($sel);
int $num;
float $rand;

if($checkScale == 0){//如果缩放值传入的值不为0
for($num = 0; $num < $len; $num++){//循环遍历选中的对象
$rand =(`rand 0 1`*2 - 1)*$offsetAmp;//获取-1到1的随机数,并且用缩放振幅来控制缩放的大小

//设置缩放值并进行偏移
setAttr ($sel[$num]+".scaleX") ($scaleVal+$rand);
setAttr ($sel[$num]+".scaleY") ($scaleVal+$rand);
setAttr ($sel[$num]+".scaleZ") ($scaleVal+$rand);

}
}else{//如果缩放值为0
for($num = 0; $num < $len; $num++){
$rand = ((`rand 0 1`)*2 - 1 )*$offsetAmp;

//获取物体本身的缩放值
float $scaleX = `getAttr ($sel[$num]+".scaleX")`;
float $scaleY = `getAttr ($sel[$num]+".scaleY")`;
float $scaleZ = `getAttr ($sel[$num]+".scaleZ")`;

setAttr ($sel[$num]+".scaleX") ($scaleX+$rand);
setAttr ($sel[$num]+".scaleY") ($scaleY+$rand);
setAttr ($sel[$num]+".scaleZ") ($scaleZ+$rand);

}
}
}

实现效果

总结

  在写随机数的时候本来用rand来实现随机效果的,但是不知道为什么物体太多的话随机效果就不明显了,又专研了很久才得出这个结果。