This is a very nice goal, thank you :slight_smile:

1 Like

Dear @DanielPiker

I am here again with reciprocal question (two questions).

This time I would like to ask question about reciprocal component of yours from kangaroo1
My original intention was to extend this component to polygonal meshes, here is my trial (it uses my rhino6 mesh library): (779.8 KB)

The way I did is taking an outline of polygon and colliding them with current and next line segment.
Solution seems fine, but I would like to ask how did you defined pair in your component the line pairs for the collisions? What is the logic behind? Also how you define the rotation normal? I tried to use average of two mesh vertex normals but it seems to produce different results.

The second part is over-under logic.
From edge to edge both in yours and mine I see that some sticks are not resting on top of each other, but can fall out. How can I avoid this issue? Would it work only on specific mesh typologies only?

1 Like

Hi Petras,

The pairs of cylinders to keep in contact came simply by pairing each halfedge with its next.
For the axis to rotate about I used a line through the midpoint of the edge in the direction of the average of the normals of the 2 adjacent faces (I guess if you are using general polygons the normal is not so uniquely defined as with triangles, but I think any estimate should work here).
This part is similar to what Tomohiro Tachi used for generating tensegrity structures in this paper:

As for the over/under - yes it’s true that this approach doesn’t always result in all sticks resting on each other in a way that it could work just with gravity and friction. I’m not sure if that is always possible with straight sticks for general surfaces including negative curvature.
Still, this isn’t necessarily a problem if you are actually connecting the sticks - they can still transfer in-plane and bending forces through the structure - in the little dome we made we used cable ties.

Dear Daniel,

Thank you for response.
Does it simply means that the edge rotation vector is as image below - average vector between “A” and “B”:

I have a question about under over part again, does it the kangaroo goal flips the sticks as gif below, because geometrically after scaling the lines change over-under position, or particles slips over each other? I attach the sample file, where I move the slider a little bit. If the particles are slipping out of its place, I am wondering if it possible to make it constant to original position?
net-gifmaker%20(1) (26.6 KB)

Yes, the direction of the rotation axis I used was just the average of the adjacent face normals.

For problem of them slipping past each others ends, I think maybe this could be solved most simply by just making the sticks longer for the purpose of the cylinder tangency goal. It doesn’t matter if they then intersect with other sticks, since you are specifying explicitly which pairs are supposed to interact.
You could then select some portion of these longer lines to use as the actual sticks.

Dear Daniel Piker,

Making sticks longer does the trick.

I have question again. Or more a request for for a custom goal.

In screenshots below you can see that some values of sticks radius works very well, but when the radius is bigger, sticks slides too much, distorting the pattern. This means that thicker sticks requires higher curvature. I attach the script below. (25.3 KB)

Is it possible to make the goal that is similar to goal you made before, but I would to ask an additional input for specifying radius. The reason for asking this is that I think sticks could rotate between each other instead of sliding. Thus changing the curvature in overall geometry.

Hi Daniel, for some reason this file is not working, even after pushing the reset button, I am trying to make a reciprocal frame but the reciprocal tool that was posted in grasshopper 3d is not making regularly shaped frames, can you help me please?
in case there is no solution for that, here is the code that I got from grasshopper3d, how can i attach an anchor tool to it so that the frames don’t slide?
thank you
reciprocal (9.4 KB)

Hi -

I think the error you are seeing is probably caused by the wrong assembly reference being set in the scripted goal.

It needs to be the same one that Grasshopper is loading, from the same file location. For Rhino 5 this is the usual Grasshopper libraries folder, but for Rhino 6 it is usually in:

C:\Program Files\Rhino 6\Plug-ins\Grasshopper\Components

Hi Daniel, You are right, grasshopper asked me for a reference and I think I referenced it wrong, how can I retrieve the menu where i can relink where it loads kangaroosolver.dll from?

also, I’m going to be straightforward with you, I really need your help, I’ve been trying out grasshopper tools for weeks and I can’t seem to get regularly shaped and lengthed reciprocal frames, could you please kindly tell me what do in order to get it? I’ve tried looking through your older posts but I’m just lost, I would really appreciate it if you could help me soon. (I have kangaroo 1+2, weaverbird, reciprocal tool, plankton and mesh pipe plug-ins).

reciprocal test 2.3dm (63.2 KB)

I’ve been trying to achieve this level of regularity (don’t care much about the pattern choice though)

All respect,

1 Like

Have a look through this related thread:

Dear @DanielPiker,

I would like to ask if it possible to make line-line goal in such a way that the line do not slide between each other, but keeps original position as close as possible.

To make line-line goal work I need to scale them, so original red points does not exist in the input.
But I need them to indicate the original position of lines. Ideally the lines would not slide between each other but rotate. I know that the curvature will change, but with current setup I cannot use larger size sticks, it is only possible to make a relaxation if radius is relatively small or close to original curvature distortion.

I attach the files for the setup I have.

The problem:

I wish to keep these point as close as possible (anchor points goal does not help):

Relaxation.3dm (10.5 MB) (18.8 KB)

One possible solution is to mix line-line goal with Curve on Point goal, that keeps close to initial position, but the problem here is that you cannot prevent flipping curves/ moving over each other since the input lines for line-line goal are not scaled:

So the question I have is there any way to use line-line goal and prevent particles flipping over each other without scaling the input lines?

I’m not sure I completely follow, but is what you need something like this combination of the 2 goals:

  • one that pulls the point at parameter ta on line a to the point at parameter tb on line b.
  • one that tries to make a pair of cylinders tangent by making the shortest vector between a pair of lines a given length. (14.6 KB)

Here it is done with 2 separate goals. The LineAt_LineAt one tries to make the actual lines touch, so it needs to be weak relative to the LineLine goal making the cylinders tangent.

I guess it should also be possible to do this as a single goal.

Dear Daniel,

Could you help me to adapt line-line goal so that it attracts two lines till certain distance?

I would like to specify the target distance between points on lines, so that the distance does not become 0 but user specified.

@DanielPiker I’m trying to run the “” file posted above, and there is a missing “Reciprocal” component that is from Kangaroo 1. Is this available somewhere?

Hi @thedriftery
Here’s a version that uses only Kangaroo2 without needing the old reciprocal component: (22.0 KB)

1 Like

Hello @DanielPiker
Thank you a lot for the script, I have 2 questions:
Premise I am new to grasshopper,

  • How could I extrude the final lines not in a round shape (pipe tool) but squared? ( like in the picture below)

Thank you


Hi! Im trying to use this one but im fairly new to GH. What type of input does this need? is it possible to just connect a mesh like with the reciprocal demo file for kangeroo0.99?

Hi Daniel,

I am using the latest version of Rhino 7, and when i am trying to open the code i get an error component at the C# script : 1. Error (CS0246): The type or namespace name ‘KPlankton’ could not be found (are you missing a using directive or an assembly reference?) (line 13). Could you please help me out with findin the component. I have searched online but cant find a solution.

Thank you

Hi @Sara_R

The assembly reference location for KangarooSolver needs to be set on the scripted components.
That file above was shared back when Rhino 7 was still a WIP, so the standard folder location was different.

I just resaved with it set to the standard folder path
C:\Program Files\Rhino 7\Plug-ins\Grasshopper\Components
If you have Rhino installed in the usual place this should just work (26.2 KB)

If you’ve got Rhino installed somewhere different, you need to right click the scripted component, ‘Manage Assemblies’, Add, and locate the KangarooSolver.dll on your computer.

it works thank you!

1 Like