1.背景
作为算法设计中的一种基本方法,迭代思想往往涉及一个循环结构,使一组操作在一定条件下重复执行,直到满足终止条件为止。这作为关键的思维工具在搜索、排序、循环等场景中运用。
迭代思想广泛运用于诸如万花筒、图形细分等图形创作之中,而通过将常见含迭代思想的二维图形赋予空间点信息并作相应循环处理,便可以实现三维空间效果的创建,如下图所示。
import peasy.PeasyCam;
PeasyCam cam;
int p = 4;
PVector[] pts = new PVector[p];
float d = 0.05;
int space = 25;
PVector pt = new PVector(1000, 1000);
void setup() {
size(800, 800, P3D);
cam = new PeasyCam(this, 1500);
for (int i=0; i<p; i++) {
pts[i]=pt.copy().rotate(TWO_PI/p*i);
}
}
void draw() {
background(0);
recursive(pts, 40);
}
void recursive(PVector[] v, int iteration) {
if (iteration > 0) {
PVector[] v2 = new PVector[v.length];
for (int i=0; i<v.length; i++){
v2[i]=PVector.lerp(v[i], v[(i+1)%v.length], d);
}
stroke(255, 150);
strokeWeight(1);
for (int i=0; i<v.length; i++) {
point(v[i].x, v[i].y, iteration*space);
line(v[i].x, v[i].y, iteration*space, v[(i+1)%p].x, v[(i+1)%p].y, iteration*space);
line(v[i].x, v[i].y, (-iteration+1)*space, v[(i+1)%p].x, v[(i+1)%p].y, (-iteration+1)*space);
line(v[i].x, v[i].y, iteration*space, v[(i+1)%p].x, v[(i+1)%p].y, (-iteration+1)*space);
}
recursive(v2, iteration -1);
}
}
本项目尝试将该思想迁移至建筑设计生成领域,区分于简单的图形/复制操作,期望生成具有一定迭代层级性与形式复杂度的三维模型。
2.原型构建
考虑到体现迭代层级性这一基本目标,我们不由得想到了分支结构这一基本原型,即各代成员相互联系,具有鲜明的层次区分。
def loop1(p,flag,w,h): # p为起始点,flag为迭代次数,w,h则为随迭代调整相应位置的函数
global xmax,ymax,xmin,ymin
if p.X>xmax:xmax=p.X;
if p.Y>ymax:ymax=p.Y;
if p.Y<ymin:ymin=p.Y;
if flag>0 :
w*=random()*0.05+0.4751; # 加入随机数控制y轴(宽度)变化幅度
h*=random()*0.15+1.05; # 加入随机数控制x轴(高度)变化幅度
flag-=1;
deltw=0.55
delth=1.20
if flag==0:
p1=rs.VectorCreate((bound,p.Y+3*w*deltw,p.Z),(0,0,0));
else:
p1=rs.VectorCreate((p.X+h*delth,p.Y+3*w*deltw,p.Z),(0,0,0));
arr1.append(p);
arr2.append(p1);
if flag==0:
p2=rs.VectorCreate((bound,p.Y-3*w*deltw,p.Z),(0,0,0));
else:
p2=rs.VectorCreate((p.X+h*delth,p.Y-3*w*deltw,p.Z),(0,0,0));
arr1.append(p);
arr2.append(p2);
loop1(p1,flag,w,h);
loop1(p2,flag,w,h);
loop1(p0,flag,w,h)
首先便需要在代码上将这一基本原型实现,并通过函数关系控制点距形成层级区分,考虑到一定的构成丰富性需求,在部分参数加入一定比例的随机数的控制。如上图所示,最终能在生成关系合理的平面分支图形。
3.几何形式
为了使得分支间的线条呈现更具设计感的形态,对逐层迭代点间加以函数及边界控制,并考虑z轴上的变化,使得线条过渡衔接更平滑,而不同的函数对整体呈现的造型有较大的影响,故以下是对分支结构的形式演化进行的对比探讨,:
3.1 圆形造型
import rhinoscriptsyntax as rs
from math import sin
from math import cos
PI=3.1415926
p=arr1
u=(p.X-xmin)/(xmax-xmin)
v=(p.Y-ymin)/(ymax-ymin)*2.0-1.0
x=r*u*cos(PI/3.0*v)
y=r*u*sin(PI/3.0*v)
z=hmax*cos(PI/2*u)
arr=rs.VectorCreate((x,y,z),(0,0,0))
3.2 中心对称的流线型造型
import rhinoscriptsyntax as rs
from math import sin
from math import cos
from math import tan
PI=3.1415926
p=arr1
u=(p.X-xmin)/(xmax-xmin)
v=(p.Y-ymin)/(ymax-ymin)*2.0-1.0
x=r*u*tan(PI/(2*v+5)*v)
y=r*u*cos(PI/2.0*v)
z=hmax*cos(PI/2*u)
arr=rs.VectorCreate((x,y,z),(0,0,0))
4. 三维模型生成
利用grasshopper相关模块处理迭代数据信息,对迭代生成的线条进行厚度控制、曲面覆盖并逐层赋以孔洞最终生成图形如下:
经本次的项目研究,可以预见,结合了函数计算生形的迭代分支结构,在建筑结构与形体的表现上具有一定的价值,再结合rhino-grasshopper平台基础上,通过修改相应参数与表达式能够高效实现丰富的造型生成。