请教如何脚本实现阵列?

image
例如,在暗室的表面上阵列若干已经生成好的角锥模型。在犀牛中是ArraySrf功能,我在底层中并没有找到相关功能的函数?请问脚本如何实现这种功能呢?

用transform呢。
看这里https://developer.rhino3d.com/api/RhinoScriptSyntax/#collapse-TransformObject

1赞

你的意思是将一个角锥放到平面的固定位置上,然后在复制后transform 平移,再取一行全部平移,形成最终的阵列。有没有能够直接形成表面阵列的功能,点选平面和角锥模型直接生成沿表面的阵列?如果使用Transform,我需要将角锥移动到固定点位置,再设计4*4的matrix,如果我的平面是弯曲的,那这个平移就显得很困难。

这个我不知道有直接可以按照曲面阵列的,等其他人来吧

直接的一个命令没有,但是制作方法也很简单
并不会因为他是曲面就不好做

对此你应该先考虑GH运算器的思路:
使用divide和evaluate surface获取曲面的细分点和该点的切平面,用这个切平面直接orient即可。

其中evaluate surface运算器对应的功能中,你需要的只是平面
直接采用FrameAt即可
而orient电池,直接采用Transform里面的这个功能

2赞

感谢指点!我在‘使用divide和evaluate surface获取曲面的细分点和该点的切平面’的时候,出现了奇怪的问题。我获取曲面细分点的思路是:先获取曲面的u,v长度,在根据阵列间隔确定阵列个数,再计算rs.EcaluateSurface。但不同曲面方式导致点阵出现错误。


图中三个三角曲面分别由①平面曲线建立曲面、②以边缘曲线建立曲面、③放样方式 创建,但是点阵生成的结果完全不同,我想要第一种等间距但是是沿着曲面的细分点,并不是矩形点阵,该如何生成呢?

# Creates an array of points on a surface
import rhinoscriptsyntax as rs

def ArrayPointsOnSurface():
    # Get the surface object
    surface_id = rs.GetObject("Select surface", rs.filter.surface)
    if surface_id is None: return

    # Get the number of rows
    rows = rs.GetInteger("Number of rows", 10, 2)
    if rows is None: return

    # Get the number of columns
    columns = rs.GetInteger("Number of columns", 10, 2)
    if columns is None: return

    # Get the domain of the surface
    U = rs.SurfaceDomain(surface_id, 0)
    V = rs.SurfaceDomain(surface_id, 1)
    if U is None or V is None: return

    # Add the points
    for i in xrange(0,rows):
        param0 = U[0] + (((U[1] - U[0]) / (rows-1)) * i)
        for j in xrange(0,columns):
            param1 = V[0] + (((V[1] - V[0]) / (columns-1)) * j)
            point = rs.EvaluateSurface(surface_id, param0, param1)
            rs.AddPoint(point)

if __name__ == "__main__":
    ArrayPointsOnSurface()

遇到多边形曲面,仍然显示矩形点阵。如何才能达到遇到任意曲面都能有等间距的在曲面上的点阵呢?

请将你需要的结果用画笔标记出来
例如
Snipaste_2021-09-03_14-42-51
既然曲面uv都不能满足你的需求
你就得将自己的需求准确表达出来
而根据你一开始的帖子提问,ArraySrf命令就是根据曲面uv的
如果你后续的问题已经不是“如何用代码将物体orient到曲面”
请重新开一个主题帖讨论,你的主题应该是“如何在三角形上面均匀分布点”
该问题和你这个主题的问题没有本质联系
并且该问题的难度可大可小。大的话,大到没有上限,也就是不可能实现。

1赞

感谢指点!我ArraySrf过程中采纳了“使用divide和evaluate surface获取曲面的细分点和该点的切平面,再orient到平面” ,那关键如何“divide”获取曲面的细分点呢?我自己所用方法得到的结果仅仅是获得矩形点阵。

已经回复,请仔细看我的回帖。

# Creates an array of points on a surface
import rhinoscriptsyntax as rs

def ArrayPointsOnSurface():
    # Get the surface object
    surface_id = rs.GetObject("Select surface", rs.filter.surface)
    if surface_id is None: return

    # Get the number of rows
    rows = rs.GetInteger("Number of rows", 10, 2)
    if rows is None: return

    # Get the number of columns
    columns = rs.GetInteger("Number of columns",10, 2)
    if columns is None: return

    # Get the domain of the surface
    U = rs.SurfaceDomain(surface_id, 0)
    V = rs.SurfaceDomain(surface_id, 1)
    if U is None or V is None: return

    # Add the points
    for i in xrange(0,rows):
        param0 = U[0] + (((U[1] - U[0]) / (rows-1)) * i)
        for j in xrange(0,columns):
            param1 = V[0] + (((V[1] - V[0]) / (columns-1)) * j)
            point = rs.EvaluateSurface(surface_id, param0, param1)
            rs.AddPoint(point)
if __name__ == "__main__":
    # call the function defined above
    ArrayPointsOnSurface()

以上代码可以实现矩形Surface上均匀点阵,但无法实现其他多边形曲面的均匀点阵,真实需求是获得如图黄色线框内表示的曲面内的均匀点阵。请教如何改进?
另外该脚本选用不同生成方式形成的曲面,为何获得点阵类型不同,求教本质原因?与控制点有关?如下图所示,8边形从左到右依次是放样曲面、平面曲线建立的曲面、嵌面得到的曲面,三角形分别是放样、平面曲线建立的曲面以及对应的点阵形状。

控制点,曲面uv结构,曲面的uv参数(用于Evaluate Surface/FrameAt等)
都是密切相关的
你可以将曲面uv粗劣理解为地球的经纬度
建议你在掌握这类最基本的概念之前,不要过早接触代码。
否则将来你的困惑只会更多。

根据你的描述,如果黄色的点阵满足条件,但只想要曲面范围内的点的话
你可以用多种方法将外面的点筛除掉。
point in curve的rhinocommon功能对应contains

这里提供一些链接仅供参考
希望优先掌握基础概念,就好比要先学会1+1才有可能学会微积分,否则你所做的一切都只建立在,“知道这么做,但是不知道为什么要这么做”

帮助文件中的建立曲面总览


请特别注意这些描述

rhino的wiki关于nurbs曲面的简单介绍