笔者是天大的大四学生,目前正在准备英语考试,本文是几个月前对袋鼠2.42版本说明文档及自己理解的一些整理,因沉迷英语,好久没更新只能拿整理的存货出来充数,其中有些不好理解的goals我使用动态图来表达了,当然有些我自己也不是特别熟悉,所以如有不妥还请指出。
作为Daniel的忠实粉丝,首先分享他的博客(虽然从14年5月就一直没有更新了)
https://spacesymmetrystructure.wordpress.com/
里面有极小曲面、互承结构等多种参数化流行的形式的相关资料
然后是他的github
https://github.com/Dan-Piker
这里能下载到plankton、exoskeleton、kangaroo、meshmachine、turtleMesh等若干超级强大的源码,任何一个拿出来都值得学习好久。
关于Goals:
以前的版本中,Kangaroo是以Force Objects为主,现在都已经被Goals(目标)或Goal Objects替代了(两种叫法)。其实是利用了目标来统一了一个系统中力、能量和约束的思想。(不再以单独的力来命名,更关注这些作用效果的本质)
一个目标可以是任何函数,本质上就是一些点,移动到了想要移动的目标位置(过去则是需要不断计算点来迭代,速度非常缓慢)。目前Kangaroo包含了很多不同类型的目标,它们可以任意组合,Solver会根据目标来对几何结果进行调整。如果目标相互冲突,并且不能同时解算所有目标,那么这些点就会在它们之间找到妥协。更具体地说,它将把他们的加权平方距离与目标距离最小化。每个目标都可以指定一个权重值(即这个目标的重要性)。由于它们的快速收敛,这些目标可以在约束问题下用于交互式约束解算(人话:一边人工调整,一边快速反馈结果)。最后得到的目标点,所有点的能量应均为0。
关于Solver:
Solver运算器是收集所有目标并解算这个系统的运算器。以前的袋鼠需要Timer或者双击打开遥控器,现在已经取消了这样的设定。Solver自动运行直到收敛,然后会停止。对于简单的系统,可以非常快速的收敛。所以可能只会看到平衡后的结果。对于复杂的系统,它的运算速度一般也只会在15-30ms之间。
Tolerance(公差设置):决定了关于删除重合点的距离阈值。
GoalObjects:目标对象现在不用重置就可以添加删除,重合点在公差内(tolerance)的自动组合。当然这里不再需要Flatten将所有goal合运算了,现在这里已经自动进行这一步操作。(其实并不好,意味着不能多个系统同时运算了,亲测即便我归好了不同系统的数据结构也只会运行一个系统。)
On:运算开关
Reset:重置开关
输出端:
I:迭代次数
V:输出顶点
O:每一个goal都会输出一种数据,输出后产生树形数据结构
显示运算器,想显示的数据接入输入端,输出端接入Solver的GoalObjects,可以用于在O端输出想要显示的Lines、Polylines、Arcs和Meshes。
这是一个特殊的Goal运算器,当连接到GoalObjects中,按住键盘的alt,在Rhino视窗中鼠标左键按住单击拖拽可以移动点。
注意:即便在顶视图拖拽时,点不止会在xy平面上移动,其他方向也会有小幅度偏移,要想固定在xy上移动,请把所有点接入OnPlane运算器。
Weighting/Stiffness/Strength(权重/刚度/强度)三个参数可以任意设置,整个系统会保持稳定(可以用于模拟真实材料的刚度)假设在最强和最弱的约束之间差距非常大(比如一个设置成10的12次方,另一个设置成10的-12次方),那么点朝着较弱的目标变动的速度将会变慢,可能需要很长的时间才能有收敛的结果。
如果希望某一个目标的优先级更强,但仍需要一些低优先级的条件影响,可以先将权重设置成一样,然后按比例增加优先级更强的,直到得到预期结果。
Anchor:
固定一个点
AnchorXYZ:
可以有选择的固定点(如当只有x,y设为true,这个点就不会在xy方向上移动,只能再z方向移动)
Length:
尽可能地保持线段两点之间的距离。如果没有在Length端输入长度,它会默认起始长度作为目标长度(长度不变)该目标可以视为一个线性弹性的1维有限元,它可以在定量的指定真实的载荷作用下发生形变。可以把Strength设置成弹簧系数(N/m),计算EA/L,E是杨氏模量(Pa),A是横截面积(m^2),L是长度(m)
ClampLength:
在一定范围内保持两点之间的距离,但距离超出这个范围时将不受任何力。类似于以前版本的弹力。
EqualLength:
尽可能使一组线长度均相等。用此运算器配合CyclicQuad限定四边形网格的四边或对角线可以得到接近正方形的网格。多用于网格优化得到高质量网格。
优化前
优化后
Load:
一个力向量。向量的长度是施加力的大小(牛顿N)
Coincident:
将两个点合并成一个点。
Angle:
使两个线段间的角度接近于一个值。如果没有设定值,则变为使当前两个线段之间的角度不变。两个线段可以是分开的,也可以是接在一起的。可用于模拟圆形截面弹性杆的弯曲(而不会受扭力)。可以根据实际情况设定材料属性,强度可以输入E*I,E是杨氏模量(Pa),I是二阶矩(m^2)
ClampAngle:
和Angle一样,只不过这里可以设置上下限,对超过限度的角度不会施加任何力。
Direction:
旋转一条线是它和设定好的向量方向保持一致。如果没有指定向量,将采用最接近世界坐标系的坐标向量。可以用它来使线段正交。
Floor:
设z=0的xy平面为地面,点不会跑到地面以下。
LengthSnap:
把一条线的长度设定为给定值最接近的整数倍数。
AngleSnap:
把两条线之间的角度设定为给定值最接近的整数倍数。
Planarize:
把一个四边形网格压平。四边形四个点未必共面,通常在工业上只能加工平面的板材(cnc加工),所以要想将划分的四边形面用于实际工业加工,需要将四边形面进行平板化处理。
CoPlanar:
使一组点共面。可以作用于多个点,如果只有4个点建议使用算起来更快的Planarize。由于可以作用于多个点固可以使六边形单元平板化。
相较于四边形嵌板和三角形嵌板,由于六边形嵌板的每个节点都只连接三个顶点,所以六边形板块在密铺曲面时,具有板块数量最少,结构稳定性能高和节点处理便捷的特点。
CoSpherical:
使一组点共球。
CoLinear:
使一组点共线。
OnCurve :
将一组点拉向曲线(在曲线上产生曲线外一点的最近点)。
OnPlane:
将一组点拉向平面。
OnMesh:
将一组点拉向网格。
Hinge:
对相邻的两个三角形进行弯折。用于模拟折纸,也可用以模拟平板和壳体。
PlasticHinge:
和上面那个差不多,多了一个弹性/塑性形变的值来限制角度,当弯曲程度超过这个值时,会发生变形。
CyclicQuad:
尽量使四边形网格四点共圆。通常和“planarize”配合使用来获取圆形网格。
圆形网格和圆锥网格对建筑嵌板施工的意义重大。建筑嵌板幕墙除了需要拓扑划分技术,还需要给予划分好的网格厚度来构成实际的嵌板,为了让这些嵌板能够严丝合缝的拼合在一起,对网格的偏移生成厚度是必不可少的一步。
在网架的实现中,平直的面板(低成本)有沿着网架边线排布的梁(一般都是标准的横截面)支撑,梁都是围绕一个中心平面对称布置的。中心平面有网架边线相交的理想节点轴线,节点轴线是连接网格对应顶点与偏移顶点的直线。
网格的偏移属性有这两种:
1.顶点偏移:偏移网格的顶点与原网格的顶点之间的距离相同,具有这种属性的原网格叫“圆形网格”,圆形网格的顶点共圆。
2.面偏移:偏移网格面与原网格面之间的距离相同,具有这种属性的原网格叫“圆锥网格”,圆锥网格带有自由扭转的节点。
当所有的块面都相切于一个顶点,且这个顶点相切于由一个通过顶点轴的环绕旋转而成的圆锥体时圆锥网格叫做圆锥柄。
四块面相切于一个通过它们的公共顶点的圆锥体
图片来自Helmut Pottmann的《Architectural Geometry》
在圆锥网格的两个连接顶点的轴放置在一个公共平面上,因此,任何通过这个边线的梁都会有一个与这些轴线重叠的对称平面,这些轴与从网格偏移衍生的结构都具有自由扭转节点。圆锥网格非常的光滑。
在一个圆锥网格的两个相邻顶点的轴都放置在公共平面
图片来自Helmut Pottmann的《Architectural Geometry》
TangentIncircles:
调整一对相邻三角形的顶点,使其内圆互相相切。对于生成扭转自由梁布局和其他结构很有用。图中生成了Circle Packing。对于Circle Packing感兴趣的人可以阅读K. Stephenson 的Introduction to Circle Packing
PlasticAnchor(塑性锚点):
和普通的锚类似,只不过这个运算器允许施加一定的弹性。普通的锚点一般是不会发生变动的,而这种锚点,只要施加足够的力,塑性锚的目标位置就会变动。参数L用于设置锚开始移动的距离限制。
它可以看做是一种静态摩擦力,使物体受到很轻的力就可以在桌面上滑动。在雕刻应用中可以用来阻止粒子漂移。
当一个平滑力作用于网格时,如果它单独存在,它就会不断地收缩和变平,即便平滑的力很小。在网格的每一个点都使用塑性锚,可以圆滑形态,但是当平滑力小于锚点的塑性极限时,它就会停止运动。
PlasticLength(塑性长度):
首先,它会有弹性的表现,像一个正常的长度目标,试图让一对粒子保持一定的距离,但是如果拉伸或压缩超过给定的极限,这个静止的距离就会改变,发生塑性变形。
PolygonArea:
将闭合的多段线向内或向外拉,来让它的面积变成指定面积大小。(从尝试结果来看,只是数值变了,实际上会产生交叉,即正面积-负面积=指定面积,个人认为这个算法可能还有待修正)
Smooth:
圆滑网格,只对网格内部顶点起作用,对网格边界无效。
Transform:
这是一个多用途目标,它的作用是在两个点之间维持一个给定的变换,因此它可以保存各种类型的对称,周期性边界条件等。
Grasshopper转换对象(如反射、旋转、平移、缩放等)有一个转换(X)输出,可以作为输入使用。
这个运算器没有找到作者发布的案例,笔者自己试了试也没看懂其逻辑。。。。
RigidBody:
可以将实体网格(也可以是闭合多重曲面)视为一个rigid body(刚体)——这意味着它可以有六个自由度(三个方向移动和三个方向旋转),这种刚体运动与变形有所区分。你可以在空间中任意位置附加点,它们将始终与刚体的移动和旋转停留在相对位置处(注意这些附加点可以在实体上面或者里面,它们的位置不是那么重要)
以上是翻译的,实际上这个东西的是一个方便选取的东西,当输入的点动了,物体也会跟着动,就是始终保持物体与点的相对位置不变,plane输入物体的位置特性(因为是个物体,所以必须用plane表达),一般让点和plane端输入相同的点
Collide2d:
在指定平面内使两个闭合多边形之间发生碰撞。
Collider:
使有厚度的线(棍)之间和不同半径的球体之间发生碰撞(通过设置半径来加快碰撞速度)
可以用来玩Circle picking
SphereCollide:
大量相等尺寸的球体之间发生碰撞。可用于设定点与点之间的最小距离。也可以用于circle picking处理曲面转化均匀网格。
SoildPointCollide:
多个点和闭合实体之间的碰撞。实体可以是mesh或者brep。然后这里会有个选项,关于当点与实体碰撞时,点能否穿入实体,否就会弹开。
SolidCollide:
实体之间的碰撞。当然碰撞之前所有的物体得先被指定为刚体。
Volume:
控制一个网格的体积。可以用于模拟充气和皱缩
SoapFilm:
一个面积最小的单元可以用来寻找极小曲面。因为这是由连续介质力学(continuum mechanics)产生的,其输出形体不依赖于初始网格的密度,就像如果使用了长度为0的弹簧的边。然而,因为这些单元只在表面的正常的方向上产生力,他们通常需要其他的目标来保持三角形不会变得太扭曲。可以将它们与tangential smoothing结合起来
SoapFilm必须使用三点为一个list来输入,所以,输入网格必须是纯三角形的,并且输入每个面的三个点(炸开三角形网格后通常会得到四个点,起始点和终止点会重合,所以需要对重合点进行除重)。如果想得到真正的零平均曲率的极小曲面,或者所有方向应力都相同的薄膜,可以使用炸开折线段的三个起始点。然而这通常有很多限制,所以在通常情况下,仅仅将网格边缘作为长度目标,目标长度为0,是相对简单的拉伸形式方法。
题外话:张拉膜结构不是非得是极小曲面,大多数这类的建筑案例并不是纯零曲率的,它会受到很多现实条件的制约。
TangentialSmooth:
通常和SoapFilm结合使用。可以用于平滑一个网格的顶点位置,但只是表面方向上的平滑,不会影响表面的正常向量。所以它能保持顶点更加均匀,但不会影响整体形状。
这两个运算器通常成组使用,笔者找了很多相关资料,发现这两个用的很少,很多人在官网问了问题也没人解答,通常来说极小曲面好像不是通过这些来实现的。最后放一个daniel的案例作为结束吧。
结束语:
其实很多东西还没有说完,kangaroo涉及了太多太多的知识,最近太忙比较难,有时间会跟大家一起分享更深入的学习见解。
领取专属 10元无门槛券
私享最新 技术干货