Uniform Curvature for Grasshopper


I built a grasshopper definition to design bike-chains. The defintion works fine on circles or 2D Curves but i need it on a 3D Curve with a crazy Curvature. Is it possible to unify the curvature or do you have another tipps?


Do you want the 3D curvature to be constant along curve, or do you want the projected curvature in a specific view to be constant? For the latter create a cylinder with the desired curvature and wrap the curve around the cylinder.

The usual rational degree 2 NURBS formulation used by Rhino to create exact circles, arc, etc only works for planar shapes. My guess is for constant 3D curvature of a non-planar curve you will need to use more control points and move the control points until the curvature is close enough to constant. If you want sections of constant curvature joined by straight lines then you should have only tangent continuity (G1) at the transitions, not curvature continuity (G2) as in the image you posted.

I need a 3D Curve because the gears have different levels. I tried to adjust the curve for several hours but it always busted my grasshopper definition.

It works only on a planar curve.

What are you doing in Grasshopper that can’t be done in regular Rhino?

Every chain link has a new rotation, so they are permanent connected. Is that possible with Rhino?

This is going to be fairly difficult if you want to simulate the true 3D of a chain/derailleur system. Think about how it works - the ability of the chain to track between the different sprocket plates that are not on the same plane is allowed by the flexibility of the chain itself - both in the joints between the links as well as the elasticity of the chain material. The path consists of “arc” sections where the chain goes around the sprockets/derailleur wheels, connected by some sorts of blend curves which are not really straight lines. The blends are what simulate the flexibility of the chain.

The thing is made more complicated by the fact that the chain length is constant, and the system with the derailleur wheels that take up the slack has to move in a specific way to maintain the chain length as the sprocket diameters change. Seems like a pretty complex physical system that might be possible to simulate using Kangaroo - but this is far beyond my level of understanding…

Couple of ideas that perhaps might make things simpler -

The chain centerline is not really a smooth curve, its really actually a polyline with equal length segments… Not sure if that’s easier though.

Perhaps you can get away with a 2D planar representation of what you need, working with that would be much simpler, as you could eliminate the need for the chain to flex in the “across” direction…


Is an “exact” model needed for precision engineering needed? If so how accurate?

My guess is the deformation of the chain is due to pivoting of the links relative to each other, and a very small amount of clearance of the links to the pins which allows the “out of plane” bending. I strongly doubt there is any significant elastic deformation. One way to model the chain would be to assume the links rotate about the pins “in plane” and the “out of plane” bending is limited to a certain angle change between adjoining links. This would mean that the out of plane curvature is limited to the angle change between links (in radians) / distance between pins, The radius of “out of plane curvature” would be the inverse, ie distance between pins / angle change between links (in radians) .

Another reasonable assumption would be to assume the distance between pins along the center of the chain is constant. This would allow for the creation of a centerline curve, dividing it a polyline with equal length segments, and then modeling the links based on those segments. One approach to convert the curve to a polyline with equal length segments would be to divide that curve by points with constant straight distance between points, with the distance measured in a straight line, not along the curve. See this thread Like AlongCrv, but different for a method to create the points.Iteration of the location of one of the “gears” will be need for the curve to divide evenly. A polyline can then be created through those points Iteration of the location of one of the “gears” would be needed to ensure the curve is divided into an integer number of segments.

So the question, which @Chris7 started this thread with, is how to create that curve. That’s a topic for a future post.

A method I used to create a chain curve in regular Rhino. This is the general approach, not step-by-step instructions. Example: Chain Curve DC1.3dm (84.2 KB)

Create circles representing the pitch circles of the sprocket centerplanes.

Project those pitch circles onto the CPlane.

Connect the pitch circles with tangent lines and trim. Connect into a polycurve. Result is the chain curve projected onto the CPlane.

Extrude the projected chain curve to create a surface tangent to the pitch circles.

UnrollSrf the surface and pitch curves.

Connect the unrolled pitch curves. Duplicate and join at either end.

FilletCorner the polycurve using assumed “out of plane” bend radius. Result is the unrolled chain curve.

Split the unrolled chain curve at the edges of the individual surfaces of the unrolled polysurface.

FlowAlongSrf the unrolled chain curve onto the extruded surface,

Join the segments of the chain curve into a single curve.