algorithmic modeling for Rhino
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 efficiencies...now 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 script...it 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 be...so 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 code...it 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!
Comment
Thanks for your help Nik, I learned a lot from your post.
Thanks for your patients Nik, I tried to figure out all these terminology . so "iso" just means one certain surface because within one 3D field, there is a lot of surfaces where all the value at this surface are the same. just like the electric field, at different distance from the center charge there is always a Gaussian Surface where the field strength is the same. so the value only means which surface to choose. am I right?
Hi Nik, "it samples the eight corners of each sample cube in a big XYZ grid around your object for the overall field value at each of those eight points" here, is the sample cube similar to the bounding box? "by summing the contribution of all geometric objects or at least the closest point to each one" is the geometric objects a cube unit or a object ? I don't understand it clearly. Thanks
Thank you Nik, I know the marching cube algorithm but what is the relationship between marching cube and iso value??
Neo, this is marching cubes. It relies on creating a literal spacial field around each geometry item, mathematically, by merely defining the a value based on distance away from a point on the geometry, then it samples the eight corners of each sample cube in a big XYZ grid around your object for the overall field value at each of those eight points, by summing the contribution of all geometric objects or at least the closest point to each one, which is how nearby geometry can join up together, via the summation of their field influence. "iso" is just the particular level of field strength, a fixed value of which happens to creates a continuous surface. If the field value in the cube contains a transition over the iso value, more math using the corner field values determines which of many dozens of possible triangles to best fill that cube with as part of the resulting mesh, using a known lookup table as reference. Iso will thus make the diameter bigger.
This script uses an older and slower VB script for the marching cubes. A brand new C# plugin is now available called Cocoon, release notice being here in a thread with some deeper explanation of how this VB script and the new one based on it, works:
http://www.grasshopper3d.com/forum/topics/bulge-free-metaballs-and-...
Hi David,
Your Job is awesome. but I am not clear how "iso" this parameter influence the final result. As I tried to increase the number then I found these spheres getting smaller.Can you explain a little bit on how does it work?? Thanks
Hi Oliver...this is one of those things that I really wish I had more time to update...the smooth that I built into the script in is a very basic Laplacian operation, and the topology that results from the MC algorithm isn't well suited to being nicely smoothed from this. What I really should do is one final pass post-Laplacian smooth that reevaluates each vertex in the iso-field and relocates it. This should produce a much smoother result, especially after a WB loop sub-D pass.
Daniel Piker started up a very interesting approaching using a small library he built called Æther that may be worth looking at. Unfortunately, I am just in the middle of a lot of things, so won't have time to code up these (and other) desired changes for improving this MC implementation, probably for a few months yet.
© 2015 Created by Scott Davidson. Powered by
You need to be a member of Grasshopper to add comments!
Join Grasshopper