• Skip to primary navigation
  • Skip to main content

Horst Sondermann

Parametric BIM School

Facebook
Instagram
LinkedIn
Twitter
YouTube
  • Rhino/Grasshoppper
  • Archicad
  • Cinema4D
  • Adobe
  • Youtube
  • Print/EBook
  • About
  • Datenschutzerklärung
  • Impressum
Startseite » Rhino/Grasshoppper » Rhino Grasshopper: Random Geometry Distribution
Rhino Grasshopper: Random Geometry Distribution

Rhino Grasshopper: Random Geometry Distribution

I wondered if I could produce the kind of random geometry in Rhino Grasshopper that I can generate with Cinema4D’s cloner tool. As shown in the images above, it’s about distributing objects over a defined surface allowing for random positioning, scaling and rotating. Let me show you how it works in Rhino Grasshopper.

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Create a rectangle

First of all we need a base surface, to keep things simple in this case it will be a regular rectangle. Double-click on the Grasshopper canvas and write rectangle:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Now that you have your Rectangle component produce 2 Number Sliders. Do this by double clicking on the canvas and write: 1<20<50:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

When you hit Return you’ll see that GH has produced a number slider showing integers ranging from 1 to 50 and showing 25 as default. As I said above, do this twice and connect the two sliders to the X and Y-Inputs of the Rectangle.

Note: You can also produce one slider only and Alt-Drag it to get an exact copy of it. (Start dragging and then press Alt – if you press Alt first you’ll get the Moses effect.) Now you can adjust the base rectangle’s size via your new Number Sliders:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

The Points

To distribute objects on this rectangle we start with points. They will serve as origins for our cylinders. Produce a Populate 2D-Component:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

As you see this component produces random points on our XY-Plane. And it has an R-Input asking for a Region to use for its point distribution. Intuition tells you that you’ll want to connect your rectangle’s R-Output to this input. As a result, GH fills your rectangle accordingly:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

A tool that distributes objects this way should offer variables for the objects’ quantity and distribution pattern. In this case, the according Inputs of our Populate 2D component are N (for Count) and S (for Seed).

Again, a case for integer Number Sliders: Produce 2 more of them and connect them to these N and S inputs. As a suggestion, for Count I chose 1<50<100 and for Seed 1<25<50:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

By the way, in case you didn’t know: The Number Sliders on their left show the names of the inputs they are connected to – automatically.

Anyway: Now you may play around with those sliders, producing random point topology on a random-sized base rectangle.

The Cylinder Axes

Starting from the points we want to see vertical lines serving as axes for cylinders. So produce a Line SDL Component:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

As you can see there a several Line components – but Line SDL is most suitable for our needs because it requires a Start Point (S), a Direction (D) and a Length (L) as input. And, as you might imagine, our random points serve as those start points, so connect the P-Output of the Populate component to the S-Input of Line SDL. The result is bit disappointing, our cylinder axes appear very short:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Well, let’s do something about that using the Length input. When you mouse-hover over the letter L Grasshopper tells you the input uses a default value 1:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Now obviously L could use some more input than that. Place another Number Slider (1<10<20) and connect it to L. Now you have some decent axes showing up:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

You feel the length of the axes could also vary in a random fashion? No problem: Place a Random component:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

What does it do? It produces a series of random numbers:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

It has 3 inputs: R (Range of Values), N (Number of Values) and S (Seed, i.e. the random pattern index).

First of all let’s connect this Random component to our Line SDL, via R output (Random) to L input (Line SDL). When you do this the Number Slider gets disconnected automatically:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Up to now there is no randomness to be observed, because the Number input of our Random component is set to 1 (=no Variation). To set higher values you might come up with the idea to have as many variations as you have lines. The solution is to connect the Populate Count Number Slider to the N input of the Random component. Now the line lengths differ:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Now for the overall length of the lines. The Random component’s Range default is 0 to 1:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

As we see, that produces very short lines. Now instead of changing the Range within the Random component I suggest using the random values as a factor for a multiplication, i.e. with 10. In order to do that, produce a Multiplication operator:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Plug the Random output into the A input of the Multiplication operator. Set B input to 10, via right-click on B – Set Data Item:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Now to utilize the multiplication result plug the R output into the Line SDL’s Length input:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

As you see the lines have grown. Staying with the default Random Range from 0 to 1 was actually a good thing – by adding a Multiplication operator with a suitable B value we can scale up our lines as we like.

Finally, the Cylinders

To get some 3D around our lines we use the Pipe component:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Pipe produces a cylindrical extrusion along a curve. So first of all you’ll want to connect the Pipe’s C (Curve) input to our Line SDL output. In Rhino’s preview our lines have changed into a bunch of cylinders:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

The concept of randomness still demands some work: I want to change the cylinders’ radius according to their height. To be more precise, I would like to have each cylinder’s radius to be 1/10 of it’s height. R is the according input of the Pipe component. Now what to plug into it?

First of all I need each cylinder’s height. The height is represented by our Line SDL component. To retrieve it’s value I need a Length component:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Now plug the Length input to the Line SDL output:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

When each cylinder’s radius is supposed to be 1/10 of it’s height, then we have to divide Length by 10. Or better (at least in my opinion): We use a Multiplication again. So produce another Multiplication operator and connect the Length output to it’s A input. Set B to 0.1 (right-click – Set Data Item):

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

Now when you connect the Multiplication output to Pipe’s R input you see the cylinders’ thickness change. For a test, play around with your sliders to see how everything changes accordingly.

To show you the relation between Line SDL’s output and Pipe’s Radius input (10:1) I added two Panels to compare the resulting values:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

So everything is fine, just one last thing: The Pipe component allows for closing the cylinder surface, via the E (Caps) input. For now it’s fine to choose Flat via right-click:

grasshopper rhino3d rhinoceros tutorial basics start programming visual components plugin sondermann horst random object distribution

We could do some more random stuff like slanting the cylinders. For this we would have to deal with the Line SDL’s D input. To keep things simple and leave something for you to find out yourself however we’ll stopp here.

Roundup

There’s more to come. Just for now I want you to keep practising. Check also my other article on good Grassshopper learning resources. Feel free to comment!

© 2018 / Horst Sondermann / All Rights reserved

Reader Interactions

Leave a Reply Cancel reply

You must be logged in to post a comment.

Copyright © 2025 · Genesis Sample on Genesis Framework · WordPress · Log in