Making random / natural vegetation for scene


#1

So… my general idea is to basically:

  1. make random point cloud
  2. project points to ground surface
  3. assign each point to random layer number with script (Really FUN script request that might actually be useful for others)
  4. select objects each layer, and replace the points with a tree/plant/rock/etc. block possibly randomizing scale and rotation a bit.

So… to make this fly need help with the random point cloud… I haven’t searched forum on that yet and suspect there is a solution already. In dream-land could control density of points with a bitmap. Like black = no points and white = very dense. Any ideas on how to best achieve this. I don’t mind working at it a bit to come up with something useful.

Basic logic:

prompt for block instance name of scenery item
for each point in points
get point location
do math to come up with randomization for Z rotation and scale variation (within limits)
InsertBlock instance at point location with scale and rotation values
delete point
next

Comments?


(John Brock) #2

Flamingo has plant/tree/groundcover tools for this.


#3

John

Haven’t used Flamingo in years but my recollection is that the plant generation happens at render time?

I need actual geometry for export.

Ryan


(John Brock) #4

You are correct. The vegetation in Flamingo is “grown” in memory at render time and does not export.


#5

This is just rough while figuring out scripts. My scale and rotation randomizer is working pretty alright.

Still don’t have a good way to scatter points. Doing it manually.


#6

Random Point cloud you can generate with grasshopper very easy.

Did. you tried the land Design Plugin na asuni?

Eike


(Nathan 'jesterKing' Letwory) #7

I’d use blender possible systems with grooming and texture control to that, then export to Rhino. But no doubt with Grasshopper it should be possible to create some good setups, controlled with one or more textures. Use block instances where possible.


#8

I’d like to make a progress printout in the command line. How do I find out how many objects are in my GetObjects array?


#9

Ubound(arrObjects) will give you the total count - 1 (arrays are 0-based in RS)

hth,

–jarek


#10

Yeea. Thanks Jarek.


#11

Hello wynott,
You might find it useful, a script @clement has created. It allows you to place blocks to points and give them random Z rotation.
You can find it here:
Populate trees
Saved me a lot of time already.

Cheers!


#12

Shoot. Jonish, yeah I made a new script that does the same thing.

Next module I want to do is a script that checks the bounding box then sinks the object into the ground a random (definable rang) percent of the height of the object… Use on rocks and coconuts and other ground clutter.


#13

That would be cool. I believe that for trees, random Z rotation and scaling would be sufficient. (Sadly now I have to do the scaling manually. I really miss block manipulation in Grasshopper.)


(Andrea Montis) #14

One of the rhino deficiencies for those who make 3D visualization: a random distribution system with advanced options, like forest pack or skatter, with full support for blocks and proxy,
Surely I would pay for that …


#15

What would you consider a reasonable price?


#16

I think I’ve figured out how to do some scatter tricks with what we have available now. Will post what I come up with.

Need some help with math on the scaling side though:

Looking for a bit of code that will do a simple version of what I believe is called exponential probability. https://en.wikipedia.org/wiki/Exponential_distribution

Would like to have an input that changes the shape of the curve… So when doing the scaling the majority of trees would be more closely sized, and then less often they are scaled to a much greater extent than the others. I.e. the less frequent the tree, the greater the size variation. Of course will have normal distribution as an option also if a more uniform look is desired… say for an orchard or some other more controlled growth situation.

Think I’ll be able to use the same formula to cull insertion points from areas with a feathered edge around structures or whatever for clearings.


#17

I guess to clarify…

When I generate a random number to determine the scale amount of any given tree, what I want to do is find where on this curve that number falls, and then determine the scaling based on the height of the curve at that point.

I guess if I confined the random number to something like 1-100 then could do the curve by looking up hard coded numbers on a table.

But I suspect the math to do this numerically is simple and a way cleaner method. I’m just kindof not good at math and will need a hand to do it that way.


#18

Actually I think i’ve got this solved


(Andrea Montis) #19

maybe between 100 and 200 $


#20

Here’s some test scenes showing the tree scaling with random as comparison.

Base

Random distribution

Exponential distribution, rate 1

Exponential distribution, rate 0.1

Exponential distribution, rate .05

Ok, now square grid, identical tree blocks, rotated

Random distribution

Exponential distribution, rate 1

Exponential distribution, rate 0.1

Exponential distribution, rate 0.05

So, to my eye the Exponentially distributed scaling definitely looks more natural than the purely random one. The rate sweet spot probably varies a little bit depending on the situation but somewhere between .1 and .05 seems to give a good result.