How to create a "low polygon" effect from an image?

This is a long shot but here it goes. I’ve been illustrating these “low poly” assets at work for a while based on source photos provided to me.

This takes so much time to do in Illustrator it’s crazy. I I was wondering if there’s a setup in Grasshopper that could automate this?

My thought process was that I could create a plane with the source photo. Then somehow use a Voronoi pattern or something to generate a new plane made of voronoi cells. Then somehow sample the average color from the original image, and fill each cell with it.

Then I could basically render a 2D projection of the resulting new plane.

Now, I know it wouldn’t look as “good” as my examples because I’m artfully plotting fake “polygons” to maintain the silhouette/edges/contours of the immages (like the basketball player’s leg, or the hockey stick). But I’m still curious to see.

That said, I do NOT know Grasshopper and creating a setup like this totally eludes me.

Could anyone possibly help with this? Would save me hours of grunt work!

not in rhino, but check this tool called DMesh and it’s alternatives

Meshy | 3D AI Generator could be interesting as well if you need 3d and not bound to the exact source image

The initial point distribution and triangulation clearly needs to be informed by the image, but something like this may be a start: (11.2 KB)


Thank you Anders. This is a great start. As you mentioned, being able to control the contour lines of the silhouette and main shapes would make this perfect. Unfortunately I don’t see any procedural way of doing this.

Meanwhile, Photoshop has this neat feature called Puppet Transform:

It generates a great triangulated mesh out of a masked selection, but unfortunately you can’t export or do anything with the actual mesh (aside from it appearing as a guide while you transform the rasterized image).

Something like this would be INCREDIBLE in Grasshopper.

I just had a quick idea of how to get a main silhouette by deleting dark pixels (in this case), then getting the largest naked mesh edge loop, meshing/patching this, then finally remeshing and recoloring this: (16.7 KB)

I’m using the standard TriRemesh component here, but one might inform this process by the image data as well (e.g. using RemeshByColour or ImageCircles). But I’ll leave that up to you. You can fairly interactively manipulate the four highlighted sliders to fine-tune the triangulation/visual output. Also I used a bit of Python, as I had no clue how to implement the same thing with standard components. Sampling the colored faces could probably be simplified/sped up using scripting too

Edit: I used this image for the input.



1 Like