algorithmic modeling for Rhino

Marching Cubes: Curve Wrapping & More Metaballs

UPDATE: 30-Jan-2014

I have added breps as an input for wrapping geometry (it also can take lines now), as in the above definition. It has been updated for some you can taper a curve at both ends if you choose, you only need to feed one radius, although you can feed as many as you like (it acts like the longest list component). The definition uses kangaroo, weaverbird and nudibranch, although I ahve also included some internalized geometry...but I highly recommend playing with those! Kangaroo and weaverbird are better-known essentials, but nudibranch is really fantastic too. Enjoy!

Some of the work posted lately by Nick Tyrer has gotten me thinking about marching cubes again...I had done some stuff with marching tetrahedra and cubes a ways back, and with some new inspiration (and a little time I could carve out today) I figured I'd take a stab at trying to make it more flexible and robust. There was a lot of room for improvement...certainly there still is. This is really a work in progress, so all caveats apply to the can probably break, hasn't been thoroughly tested, etc. But I probably won't be able to do too much more with it for a bit, so I figured I'd put it out there if anyone wants to play with it.

The short of it is that the inputs can take any combination of points and curves, along with variable radii of influence for each geometry object. Also, if you're using curves, and want to "taper" the effect of it over its length (from start to finish) you can do so. For example, an untapered curve versus a tapered curve:

The marching cube stuff is derived from the amazing Paul Bourke's work. I'm calculating fields around points and curves using a standard metaball fall-off function. The trick to its (relative) quickness is in using rTrees to determine which sample points should have their fields updated by various geometry objects, and also in ensuring that points aren't sampled more often than they need to be. The use of the rTree has some up-front computational expense, but with larger geometry sets it saves a ton of time.

The definition has some examples in it, as well as a description of the inputs...but here there are again anyway:

G = A list of base Geometry, which can be any combination of curves or points

R = Radius...this is a list of the radius of influence for each geometry object. The number of elements in this HAS TO BE EQUAL to the number of elements in the geometry list

res = resolution...the edge length of each sampling cube, so smaller numbers reflect higher resolutions. Watch out...the lower this number is, it exponentially increases the calculation time!

iso = iso value for cutting the surface...the lower the number, the bigger the mesh will be

smooth = an integer equal to the number of smoothing passes you want to do on the mesh(es) after they've been created

taper = a boolean...if you're using curves, and want the mesh that wraps around the end of the curve to be tapered smaller, then set this equal to true

ratio = the taper ratio, a double between 0 and 1...this is how much of your base radius you want your tapered edge to if your taper = 1, then your tapered edge should have the same radius as the beginning, 0.5 then it'll be half, etc.

run = a boolean to execute the still can be pretty slow with a lot of geometry, so you can toggle this off to adjust your settings

Anyway, I hope you enjoy!

Views: 11359


You need to be a member of Grasshopper to add comments!

Join Grasshopper

Comment by Luca Borro on February 22, 2015 at 10:23am


your work is wonderful! Thanks a lot.
I take your work for excercise...and I want to obtain a single value for RADIUS (example: 2mm, 3mm, 4mm, 5mm, ecc....) Is it possible?

Comment by Esteban Pacheco on August 14, 2014 at 9:23am

Mannnnn This is Awesome!

Comment by mohamed fawzy mohamed on August 1, 2014 at 12:03pm

wow can u send to me solution or GH file :) thx

Comment by Jenny Salvatore on June 14, 2014 at 3:06pm

problem here... the VB-component for the Vase seems to not output any data for (mc) that goes into the weaverbird component... panel says <null> ...since everybody here loves the definition i assume you all found the solution? : ) please let me know

Comment by Ralf on May 8, 2014 at 9:01am

Hi David, at first, thanks a lot for this great piece of code. I was used to work with the millipede geom wrapper, but I cant explain how much faster your script is.

Now I think I am pushing this script to its limits, but maybe not - I am really not sure, so I would appreciate your help.

I am using your definition for getting geometry out of curves - these curves are resulting out of tracked boid's. I attached a pic from my succeeded wrap - there are about 700 curves and it took itself about 18 minutes computing time. I think that is very okay. So I thought, no problem for this definition, let's do it with 2000 curves (because at least, I have to do it with 4000 curves). But at this point, there is something it does not like, and I don't get it because at this time I'am not really into vb scripting.

I tried to tweak it from the outside, with scaling, brep r and all this things, but show's most of the time a problem in the line 255, or line 172.

Sorry for this big question, maybe you got some hints for me :) thanks!

Comment by Pirouz Nourian on May 6, 2014 at 11:21am

Amazing work! Thanks for sharing. 

Comment by jozze on April 16, 2014 at 10:38am

Hey David,

very cool stuffs. I am trying to get similar "sponge like" effects somehow through a python script based in your 140130 (VB script) marching cubes definition. I wonder if you could roughly explain the logic behind that code..actually I´m getting a bit lost.. I´d really appreciate it. Thank you.

Comment by mahmoud fathi on March 29, 2014 at 6:18pm

good work

Comment by Pieter Segeren on March 5, 2014 at 3:24am

Awesome work David! Love it. And thank you for sharing it.

Comment by jozze on January 31, 2014 at 2:04am



Search Grasshopper


  • Add Photos
  • View All

© 2015   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service