摸索grasshopper的第二天,决定使用一下脚本电池,制作一个随机生成管道的蛇皮东西,如下
其中除了用到interpolate来连线和pipe来成管,就是一个C#的脚本电池了,作用是不走回头路的随机生成点,然后用interpolate连接起来最后用pipe成管道
由于网上的资源太少,只能自己摸索。在C#的editor中,灰色背景的部分是不能编辑的,能编辑的只有白色背景的部分,一是(这里的x,y,A等可以在电池中修改名称,这里我把x改为seed,随机种子,y改为num,点数)
private void RunScript(object x, object y, ref object A)
{
}
和下图之间的部分
// <Custom additional code>
// </Custom additional code>
在RunScript中写下如下代码,解释如注释
private void RunScript(object seed, object num, ref object A)
{
// 创建一个列表,用来存放三维点(rhino.geometry.point3d)
List<Point3d> plist = new List<Point3d>();
// 实例化一个三维点
Point3d mp = new Point3d();
// 将object转化为int
int pnum = Convert.ToInt32(num);
int pseed = Convert.ToInt32(seed);
// 实例化一个随机数生成的玩意儿
Random r = new Random(pseed);
int dir = 0; // 记录当前方向
int lastdir = dir; // 保存上一步方向,避免马上走回头路
for (int i = 0; i < pnum; i++) // 循环需要的点数
{
lastdir = dir; // 保存上一步的方向
dir = r.Next(6); // 更新这一步的方面,随机上下前后左右6个方向
// 见后面的函数,这里的作用主要是如果这一步是回到上一步,那就重新来一次
if (Math.Abs(lastdir - dir) == 3)
{
i -= 1;
dir = lastdir;
}
// 没有走回头路就开始移动,保存移动后的点
else
{
randMove(ref mp, dir);
plist.Add(mp);
}
}
A = plist; // 把结果保存在A中,因为连线要从A连出来
}
在注释中间写上randMove方法
public void randMove(ref Point3d p, int dir)
{
switch(dir)
{
case 0:
p.X += 1;
break;
case 1:
p.Y += 1;
break;
case 2:
p.Z += 1;
break;
case 3:
p.X -= 1;
break;
case 4:
p.Y -= 1;
break;
case 5:
p.Z -= 1;
break;
}
}
这个没什么解释,为什么前面要用lastdir和dir相差是否为3的意思就是如果相差为3,那么这一步和上一步就是相反的一步,也就走了回头路了
**
运行结果
**
最后烘焙一下,到渲染模式