top of page

Art

I finally took a step towards joining my more creative side with my more technical side.  So here was my first attempt at a more cohesive personal project putting together an array of skills both known and unknown all driven by artistic inspiration.  I'll mostly describe the process and finally present the result.

IMG_5375.jpg

QUICK, ACT NATURAL

 

"When no one's watching, the chameleon is every color at once - unperformed and whole. The moment someone arrives, it shifts, scanning and adapting to match whoever's in the room. Add more people and the act starts to unravel, caught between signals it can't reconcile. It never chose to do this. Someone just walked in.

This piece is inspired by 'masking' - the practice of suppressing your natural instincts and mirroring others in order to fit in. For many neurodivergent people, masking is not a choice but a survival strategy - one that often comes at the cost of knowing who you really are."

 

JShep

Step 1: The Idea

The above description of masking is something I've dealt with for my whole life.  I had this idea when helping organize an art show at work, and I wanted to submit a piece.  Once I had this idea of a chameleon that could change colors, I immediately already knew how to make this happen from a hardware and software perspective as I have extensive background in these areas, but what about the actual presentation?  From the creation of the chameleon, to how I would wire the LEDs, to how the chameleon would be presented to the viewer - how would I and could I successfully integrate a camera?  The whole process of deciding, undeciding, discussing, and annealing the idea took a couple months and a lot of discussions with friends, family, and coworkers who helped me best align my original vision with the reality of creation and the tools (and experience!) I immediately had available.  

And after this time, I had the full idea - a 3D printed hollow chameleon embedded with addressable RGB LEDs controlled with a Raspberry Pi Zero for form factor.  A camera would be facing the viewer from the enclosure, but the trick here is that there would be two way mirror material covering the entire inside of the cave, both reflecting the light from the chameleon and creating a more mesmerizing display as well as cleverly obscuring the camera pointed at the viewer.  The Raspberry Pi would be taking the images from the camera and controlling the LEDs based on 3 separate criteria:

  1. Nobody is in frame - ​This would drive the LEDs to be more dynamic, natural, and multicolor - representing a natural state of relaxation

  2. There is one person in frame - This would instruct the Raspberry Pi to extract a color palette from the viewer, and update the LEDs to have the chameleon mimic the viewer.  This represents the state of "masking" as described above.

  3. There are two or more people in frame - The Raspberry Pi would then send the chameleon into a chaotic frantic state of confusion - random colors, and flashing erratic LED behavior would represent the chameleon unsure of what to do with itself now that there are multiple clashing personalities in frame.

The enclosure would be cave-like, and simple from the outside, while dazzling and mesmerizing on the inside, sort of like a geode.  This has no meaning necessarily other than just "it looks cool" and gives me less work to do on the exterior of the cave enclosure😁

IMG_5057.jpg

Step 2: The Modeling

As an absolute Blender noob, I was knew that I didn't have nearly enough knowledge or experience to be able to completely model a satisfactory chameleon.  I first checked Thingiverse and didn't find anything that matched what I would watch.  I then had an idea to experiment with assets that AI could potentially produce.  I piece together a txt -> img -> 3d model workflow in ComfyUI using Z-Image-Turbo and Hunyuan3D-2.0 and eventually arrived at some initial results that I could use to begin in Blender.

From here, a lot of post-processing was necessary to get it into the desired state to both 3D print as well as hollowed out in order to support my idea of embedding an LED strip.  Re-meshing, decimating, tuning, tweaking, scaling, slicing, solidifying were all parts of the necessary steps in order to produce a manifold shell structure that could more or less be 3D printed successfully.

I also used this process for the cave enclosure - the one difference here was that I needed to add internal routing for cable and housing the hardware.  I also had to break out the cave structure into 5 different pieces to accommodate for the limits of the 3D print bed.

Step 3: The Programming

This was the more "known" area for me, and was relatively straightforward but still had its difficulties.  I acquired a Raspberry Pi Zero 2 W for form factor, a Raspberry Pi camera, and an addressable LED strip, though I first prototyped on a Raspberry Pi 5 and Logitech web cam.

Without getting into the weeds of implementation, this was all done in Python using various vision and AI libraries, creating a state machine to orchestrate how the LEDs are controlled.  Claude Code was used here to help expedite the coding process.

IMG_5068.jpg

Step 4: The Assembling

Once I had the parts printed and the software and hardware developed, it was time to begin putting everything together.  With a lot of hot glue (a common theme in this project), I ran the LED strip through the back of the chameleon structure and looped it around and around the interior of its body.  From here, I needed a way to actually join the top and bottom shells of the chameleon.  So why not more hot glue as an initial joining mechanism?  I then followed up by scraping segments of hot glue off of the joined gap, and actually soldering PLA directly to join the two pieces.  What resulted was a more or less complete chameleon shell with a messy seam - something some sanding and primer could solve, right?  ...right..?

IMG_5074.jpg
IMG_5081.jpeg

Step 5: Learning from mistakes and errors

WRONG!  It was at this point that I began to see things slowly come together, but an aggregation of small mistakes and lack of experience in building and assembling began to accumulate to a level that I could no longer accept:

  • The chameleon shell was much too thin and cracked easily

  • The scale in Blender is completely off

  • The seam line should better be disguised - bisected a plane directly through the chameleon is perhaps not the "best" design

  • My priming and sanding technique was definitely not the way to go

  • and so many more

I actually ended up sanding this chameleon so much to try to remove the blatantly obvious seam line that obstructed and interfered considerably with the way the RGB light came through that I spiraled into a loop of continually priming and sanding the surface over and over and over again. My frustration mounted and I ended up completely ruining the shell - I sanded too far in to the PLA and created holes in the shell as well as extremely messy looking sand lines that the LEDs quickly exposed.  By the way, I also naively modeled the chameleon in an arbitrary scale in Blender, which made further iteration very difficult.  And thus, Mk1 came to an end - it really served as a conduit of learning to get to the next iteration.
 

Step 6: Iterating

So what were the largest lessons?

  1. Nail the scale in Blender - This makes transfer of STLs into 3D printing software seamless, allowing for flawless accuracy and prediction of print size ​​

  2. Adopt a different priming and sanding technique - Thin layers, wet sanding, and being patient go a lot farther here

  3. Bisecting the chameleon shell along a more natural line - Even if the seam was a bit messy, the natural body lines would likely obscure these imperfections at least a little

  4. Find a better way to join the shells - soldering PLA with a soldering​ iron "worked" but didn't look great, I actually researched, experimented, and adopted a PLA friction welding technique using a Dremel

And voila! Mk2 turned out considerably better.  Better scale, more natural seam, better technique for joining the shells - this turned out to be considerably cleaner, still not perfect though, but satisfactory enough.

IMG_5283.jpeg
IMG_5315.jpeg
IMG_5316.jpeg
IMG_5325.jpeg

How all the pieces came together, dremeling, wiring, additional programming and tuning, etc.

Step 7: The Mirroring

So now with the chameleon more or less ready, it was time to begin working on the cave enclosure.  My idea - cover all of the interior triangle faces on this heavily decimated asset with mirror material.  After some initial tests with various mirror materials, both regular mirrors and two way mirrors, I settled on a 0.04 inch thick two way mirror acrylic material.  I tested out cutting out a triangle by scoring and snapping a piece, seemed to work alright for now.

And after about 17 hours of printing, the first quarter of the cave was complete, and it was time to begin scoring and snapping all of the faces.  How was I to transfer the interior faces of the physical cave to the acrylic material to score and snap?  I thought for a bit and ran to the store to buy crayons and chalk - what better way to transfer a shape from one thing to another than holding a piece of paper on the shape and rubbing chalk against the paper?

In retrospect, I was extremely naive at this point in time - I had 400+ triangle faces to produce, how did I think this was a plausible method?  Well I learned quickly when I took about 15-20 minutes to produce a couple faces that looked absolutely horrible - the material was shattering as I was cutting it with shears and the result was unusable.

Back to brainstorming - was this plausible at all?  Could I even find a way to do this?  I need a quick and precise way to cut hundreds of shapes to an exact spec... so enters the laser cutter.  I didn't know how to use this thing - as a software person, the physical world scares me.  But I knew I had to do it to get where I wanted to go.  I learned a lot more of Blender (this project brought to you by hot glue and Blender) and eventually found a way to extract the interior faces of the cave pieces I modeled into SVGs that the laser cutter could tolerate.

IMG_5346.jpg
IMG_5318.jpg
IMG_5345.jpg
IMG_5361.jpg

The numbers... oh the numbers...  So producing the actual SVG and having the laser cut the acrylic took maybe 15 mins per cave piece.  Manually labeling the faces and triangles BEFORE I took them out of the laser cutter so that I wouldn't have to end up doing the worst puzzle ever took about ~2 hours of manual look/check/look/double check/label work per cave piece.

And that was quite literally the half of it, next came even more hot glue - gluing over 400 small triangle faces was pretty tedious as well.

IMG_5364.jpg
IMG_5325.jpeg

Step 8: The Assembling pt. 2

"The first 90 percent of the [work] accounts for the first 90 percent of the development time.  The remaining 10 percent of the [work] accounts for the other 90 percent of the development time." - Tom Cargill, Bell Labs

Almost there!  We have a cave and a chameleon, 1 + 1 = 2

Remember Mk1 where I said a bunch of small mistakes and moments inexperience added up to a point in which it came time to scrap that version?  Well admittedly there is quite an aggregation of mistakes accumulated into Mk2 as well, but this time, there was no scrapping that version - the art show was in a few days!  And what I have is very good, just full of things I would now do different, which I'll discuss later.  But for now a Dremel and elbow grease was going to fix a lot of those issues.  Cave pieces didn't quite fit the way I intended, the cable tunnels in the caves weren't size-able enough to accommodate for the wiring, but I had to just power through, slapping bandaids on all the bullet wounds, infection, and hemorrhaging of my project - is this art?

And once everything was very orderly, neatly and definitely not just smushed and superglued into place, the shell of the cave, the electronics, and the chameleon came together.

IMG_5383.jpg
IMG_5375.jpg

Step 8: The Displaying

And I think it all came together quite nicely.  I ported the code from my initial Raspberry Pi 5 + Logitech prototype to my Raspberry Pi Zero + RaspPi camera solution (easier said than done, reach out to me if you would really like to run MediaPipe on a RaspPi Zero 2 W, I've heard just everyone's doin it these days).  I actually ended up remapping the LEDs as I now have a new chameleon, and I let it run over night to really test the fidelity of the code.

I woke up and this thing was nearly unresponsive.  A big headache of only having half a gig of RAM is that I can't just continue my life saying I'll just bump to a beefier cloud instance if I need it.  I have to actually get into the nitty gritty of memory?? What am I a cave man???

Anyway, after many mitigated memory leaks, optimization adjustments, image down sampling, benchmarking, debugging, how does Claude say it? "Flibbertigibbeting"? "Prestidigitating"? "Julienning"?  Yeah those things.  I did those things.  After those things, I'm happy, I'm content, I'm definitely not just going to continue to point out every flaw to everyone as they look at it :) - is this art?

 

Step 9: Takeaways

My biggest takeaway is the collective of lessons I've learning along this journey.  I learned some Blender basics, some Inkscape basics, ComfyUI workflows, new things about various materials, how to user a cool ass laser cutter, how to prime, how to sand, oh yeah I forgot to mention the epoxy but I did that too, how to think about a more cohesive physical product, how to think more creatively and less technically about how and why I might want to write software a certain way; I learned a lot about burning my fingers on hot glue and cutting my hands with various tools; I guess I think I learned how to do some art, I've always had a more creative side to me, but I've never necessarily had the patience to really sit down and draw or sculpt or do art in more traditional ways, so it was cool to finally see something more physical and complete come out of my creative side.

 

Mk3 wen.  Actually, I think I'm good here, but if I had to do it again, here's the  things I would do differently:

  1. Tighter and more exact modelling for pieces fitting together in Blender with adapters for joining the pieces


 

©2025 by John Shepherd.

bottom of page