#coding:utf-8
import rhinoscriptsyntax as rs
def NormalSrf(Srf,intU,intV,attracts):
Udomain=rs.SurfaceDomain(Srf,0)
Vdomain=rs.SurfaceDomain(Srf,1)
stepU=(Udomain[1]-Udomain[0])/intU
stepV=(Udomain[1]-Udomain[0])/intV
ptMtx={}
normMtx={}
for i in range(intU+1):
for j in range(intV+1):
u=Udomain[0]+stepU*i
v=Vdomain[0]+stepV*j
point=rs.EvaluateSurface(Srf,u,v)
rs.AddPoint(point)
ptMtx[(i,j)]=point
#设定多个干扰点,进而找到距离各干扰点最近的曲面上点,进行放样成面。
distance=[]
for n in range(len(attracts)):
distance.append(rs.Distance(point,attracts[n]))
distance.sort()
length=distance[0]
# length=rs.Distance(attracts,point)
vecNormal=rs.SurfaceNormal(Srf,(u,v))
vecNormal=rs.VectorScale(vecNormal,length*0.5)
vecNormal=rs.PointAdd(point,vecNormal)
normMtx[(i,j)]=vecNormal
for i in range(intU+1):
for j in range(intV+1):
if i>0 and j>0:
curvebottom=rs.AddCurve((ptMtx[(i,j)],ptMtx[(i-1,j)],
ptMtx[(i-1,j-1)],ptMtx[(i,j-1)],ptMtx[(i,j)]))
curvetop=rs.AddCurve((normMtx[(i,j)],normMtx[(i-1,j)],
normMtx[(i-1,j-1)],normMtx[(i,j-1)],normMtx[(i,j)]))
rs.AddLoftSrf((curvebottom,curvetop))
def main():
srf=rs.GetObject("select a surface",rs.filter.surface)
int_u=rs.GetInteger("input intervals in x direction",10)
int_v=rs.GetInteger("input intervals in y direction",10)
attracts=rs.GetObjects("select points",rs.filter.point)
NormalSrf(srf,int_u,int_v,attracts)
main()


补充案例:
#coding:utf-8
import rhinoscriptsyntax as rs
def NormalSrf(Srf,intU,intV,attracts):
Udomain=rs.SurfaceDomain(Srf,0)
Vdomain=rs.SurfaceDomain(Srf,1)
stepU=(Udomain[1]-Udomain[0])/intU
stepV=(Udomain[1]-Udomain[0])/intV
ptMtx={}
normMtx={}
for i in range(intU+1):
for j in range(intV+1):
u=Udomain[0]+stepU*i
v=Vdomain[0]+stepV*j
point=rs.EvaluateSurface(Srf,u,v)
# rs.AddPoint(point)
ptMtx[(i,j)]=point
#设定多个干扰点,进而找到距离各干扰点最近的曲面上点,进行放样成面。
distance=[]
for n in range(len(attracts)):
distance.append(rs.Distance(point,attracts[n]))
distance.sort()
length=distance[0]
for n in range(len(attracts)):
if rs.Distance(point,attracts[n])==length:
attractpoint=attracts[n]
vecNormal=rs.VectorCreate(attractpoint,point)
# length=rs.Distance(attracts,point)
# vecNormal=rs.SurfaceNormal(Srf,(u,v))
vecNormal=rs.VectorScale(vecNormal,20/length)
vecNormal=rs.PointAdd(point,vecNormal)
normMtx[(i,j)]=vecNormal
for i in range(intU+1):
for j in range(intV+1):
if i>0 and j>0:
curvebottom=rs.AddCurve((ptMtx[(i,j)],ptMtx[(i-1,j)],
ptMtx[(i-1,j-1)],ptMtx[(i,j-1)],ptMtx[(i,j)]))
curvetop=rs.AddCurve((normMtx[(i,j)],normMtx[(i-1,j)],
normMtx[(i-1,j-1)],normMtx[(i,j-1)],normMtx[(i,j)]))
rs.AddLoftSrf((curvebottom,curvetop))
def main():
srf=rs.GetObject("select a surface",rs.filter.surface)
int_u=rs.GetInteger("input intervals in x direction",10)
int_v=rs.GetInteger("input intervals in y direction",10)
attracts=rs.GetObjects("select points",rs.filter.point)
NormalSrf(srf,int_u,int_v,attracts)
main()

该博客展示了如何使用Rhino的Python脚本来创建放样表面。通过选取一个曲面、设置UV网格间隔和选择一组干扰点,脚本计算每个网格点到最近干扰点的距离,并生成一个新的表面。新表面沿原始曲面的法线方向拉伸,以响应干扰点的位置,从而创造出有趣的设计形态。

1600

被折叠的 条评论
为什么被折叠?



