Ill With Orchid Fever
How I channelled my obsession into an endless orchid generator
This article reflects on my inspiration and process behind the generative artwork, Cattleya. Originally released on Art Blocks, it’s now available on OpenSea.
Motivation
Art has always been a defining part of my being, but in early 2020, I lost the urge to make it. Disillusioned by fine art’s commercialism and politics, I retreated into a quieter professional-work life balance, shifting my energy to designing museums, developing software and hiking on the weekends.
In the forests upstate I felt most at home. Unfortunately, in New York City, being closer to nature means bringing nature to you, i.e. hoarding unhappy plants in a small, dark room, but this is often better than staring at a brick wall. So, I turned my bubble into a greenhouse, literally. (The “bubble” refers to a plastic sculpture-making “studio” I built to contain dust and fumes.)
Hope returned to my life in 2021 with each new bud and shoot, spike and leaf. I grew dahlias and gladiolas inside, along with bonsai and orchids. Watching them grow slowed down time. Focusing on their small, intentful changes encouraged me to become attentive to my own evolution as a person, to long-term decisions and growth.
Riding on the wave of excitement for a plant in-bloom, I kept buying new orchids. Hardy plants with a tolerance for indoor-living, they seemed to thrive under my care. As I started to research them, I became engrossed—no, infatuated—with their unfurling story, evolutionarily, culturally, mythologically, symbolically. This is how my collection grew and my obsession with orchids began.
Curious to try rekindling my creative flame, I decided to try something new. I resolved (1) To make what I want, (2) To make without justification, and (3) To make for myself. I tried to unlearn the short circuited associations that had become my creative nature: the voices that worried every step of the way whether my art was novel, topical, conceptual and commercially viable.
Recalling the playfulness of sketching in university, I returned to the canvas—HTML, that is—using p5.js as my paintbrush. I oscillated between making abstract and representational sketches in code. It only felt natural this new pursuit should cross paths with my orchid mania, which led me to ask: Could I capture the diversity, beauty and mystery of orchids in a fully generative system?
Approach
I set out with the intention to create digital orchids but with the foremost goal of enjoying the process, allowing myself the opportunity to be surprised, to be led freely from one inquiry to another.
In the beginning, I found myself drawn to studying flower shape. Once I captured sufficient variation and achieved a model of high enough fidelity, I moved onto a new component. I worked serially, honing in on and refining one aspect of the plant before moving onto others. Naturally, this process produced a model in which each component is independent of all others. In nature, this isn’t the case: for example, an orchid with purple-tinged leaves is likely to also have purple flowers. However, I didn’t care to reproduce these dependencies; my measure of success was not realism, but the enjoyment of its pursuit.
After shape, I focused on color, pattern and composition. Perhaps counterintuitively, I finalized the rendering style before any of these. From the onset, I envisioned the style of the work and was determined to realize it before anything else. In retrospect, this was a defining moment in setting the mood of the work, settling how to portray orchids before knowing exactly what of them to depict.
I heavily relied on sketching as a means of planning and solving problems before ever touching code. In total, I ended up with 67 sheets of drawings, physical and digital, varying from stylistic marker sketches to meticulously designed diagrams. I wouldn’t be surprised if half the time I spent on this project was sketching and the other half coding.
I developed this project in JavaScript using p5.js. For those unfamiliar with p5.js, it’s a powerful open-source JavaScript graphics library for creative coding. It’s played a critical role in my education, bringing the keyboard and pixel closer together, providing an accessible way to “sketch” in realtime with code.
In total, this project lasted about six months, from concept to completion. The last two months were primarily occupied with bug fixes and establishing consistent rendering across modern devices and browsers. (I won’t touch on those aspects here.)
Below, I dive deeper into each of the components of this project, shedding light on my inspiration behind and approach to modeling and developing orchids’ Style, Shape, Color, Pattern and Composition.
Style
Inspired by the rendering style of Meridian and Matt DesLauriers’ mention of signed distance fields in one of his talks, I became intrigued by the idea and challenge of creating a pointillist composition with movement and depth.
From the beginning, I wanted to depict orchids with dimensionality and do justice to their beautifully complex shapes. It made sense to model them in three dimensions, so the challenge of achieving a highly textured, hatch-like style became translating this 3D scene into a 2D representation.
The simplest solution was to render an image of the scene and draw marks at each pixel. However, I wanted the marks to move coherently and have some relevance to the underlying materials they represent. After some experimentation, I realized I could take multiple snapshots of the same scene from the same point of view using different “lenses,” like depth, color, normal and surface direction. Stacked on top of each other, these maps describe in detail the 3D materials represented at each point (pixel) in the 2D image. Thus, each mark could be made with respect to materiality.
Rendering the 100k+ marks takes a lot of time. Rendering all of them at once results in a less-than-ideal user experience. So, I opted to render them progressively in batches over a duration of time. This presented an opportunity to choose which marks render first and which render last. Following a render order from background to foreground not only added to the latent depth of the piece, but allowed me to blur frames successively, yielding depth-of-field and fog effects.
The result is a rendering style that upholds the dimensionality of the underlying scene, while applying a materially-relevant texture on top. The juxtaposition of small details and the greater scene, and the progressive rendering of marks, creates more animacy and intrigue.
Shape
One of the most intriguing aspects of orchids is their morphology. Their flowers are bilaterally symmetrical with 3 petals and 3 sepals. One of the petals, called the labellum or lip, is often more showy than the rest. It usually sits beneath the stigmatic cavity (containing the reproductive organs) and forms a shelf on which insects can rest while pollinating.
This is but one of the many ways that orchids have evolved to form mutually beneficial relationships with pollinators. Make no mistake: their visage and perfumes are sensorially stimulating, but their mechanical shapes, more than any other adaptations, carry with them a striking evolutionary intelligence.
As another example, take Angraecum sesquipedale: Latin for “one and a half feet.” Colloquially known as Darwin’s Orchid, it boasts an extremely long spur, a receptacle at the back of the flower holding nectar. The flower was so unusual, it stumped botanists for decades. The British polymath George Campbell even went so far as to suggest it was created by a supernatural being. In 1862, Darwin suggested, to the ridicule of many, that it coevolved alongside a moth with a very long tongue. Only after his death, four decades later, was such a moth found: the African hawkmoth, thus confirming his hypothesis¹.
One can imagine such an ecosystem with moths, whose tongues vary slightly in length, and flowers, whose spurs also vary in length from one plant to another. Those moths with the longest tongues have the best chance at extracting more nectar, surviving longer, and reproducing more. Likewise, those flowers with the longest spurs have the best chance at being pollinated, since the further a moth sticks its head into a flower, the more likely it is to rub against pollen and transfer this pollen to the stigma of another flower. The moth and the flower engage in this intertwined evolutionary race termed “coevolution.” This is how the shape of Darwin’s orchid became so unique. Similar mechanisms account for the unique shapes of most other orchids.
This is why shape is so important to me: it represents so clearly an embodied intelligence, much older than us or any one creature. Mystified, I set out to model it as best I could.
There were two primary forms to model: the shape of flowers and the shape of foliage. I approached each form independently using a technique known as Statistical Shape Modeling. This approach is exactly what it sounds like: it uses statistics to model shapes, in order to make generalizations about them and generate new shapes from the same distribution.
I began by defining common templates for flower and foliage shapes that can describe any given plant’s flower or foliage properties. For example, each flower follows the same basic pattern: 3 petals (2 lateral, 1 lip) and 3 sepals (2 lateral, 1 dorsal) arranged around a central axis. This yields four unique types of petals/sepals, since the lateral ones are self-similar. Each petal/sepal has a different size, outline, curvature, proportion and etc. These traits apply to each type of petal/sepal, so describing a flower completely requires at least 4 * number_of_traits parameters. Collectively, this set of parameters parametrically describes a flower, and each flower has a different set of parameters.
From the diagrams above, you’ll notice that each petal/sepal model consists of only four triangular facets. This is an oversimplification of flower geometry. In real life, flowers don’t have perfectly straight edges or flat petals. However, this isn’t a real flower, nor would I ever want it to be. No work of art will ever overshadow the natural, effortless awe I experience from Nature. I don’t want this work to pretend to be something that it’s not. I don’t want it to fall flat for a lack of integrity. For that reason, I decided that this “low-resolution” flower is high enough fidelity to capture, with the deftness of plein air, just a bit of that beauty and mystery I experience from orchids.
The next step in this process requires taking measurements of each plant’s flower and foliage according to the templates defined. In total, I collected data on flowers from six blooming plants using a template with 30 parameters per plant, and on foliage from eight plants using a template with 24 parameters per plant. This may not seem like a lot of data, but it provides sufficient guardrails to begin exploring this space generatively.
The power of the statistical shape model comes into play in this final step. Using a technique called Principal Component Analysis (PCA), I can generate new, simpler representations of each plant. These new representations require fewer parameters to describe a plant (4 for flowers and 6 for foliage). They aren’t as accurate as the original representations, but what they lose in accuracy we gain in the ability to generalize about orchid shapes. Each sample now exists in a lower dimensional space (4D for flowers and 6D for foliage). By randomly sampling from this latent space, I can generate new orchid shapes from the same distribution—shapes that bear likeness to the orchids I studied, with a few surprises.
To more tangibly describe how this latent space embodies the statistical shape model, let’s take a closer look at flower shape. Every possible flower type (with some error) can be described by a point in this 4-dimensional space. For example, Phalaenopsis flowers might be described by the point [0.1, -0.4, 1.8, 0.2]. Other orchid flowers with similar shapes to Phalaenopsis will lie close to this point. Orchid flowers with shapes very different from Phalaenopsis will lie far away from this point. Thus, in this space, each orchid flower type can be described by a vector of length 4, where the proximity of points corresponds to the similarity of two orchid flowers’ shapes.
By random normal sampling from this space, I can “peek” into this orchid flower shape representation, traverse new locales and generate new shapes, distinct from those flower shapes collected in the dataset. This is how orchid flower and foliage shapes are generated. No two plants have the same flower or foliage, though some are more likely than others.
A quick note on spike geometry: Spikes are the linear “stalks” that grow to hold flowers. The way they emerge, grow and carry inflorescences varies wildly. I captured this variety with a parametric spike geometry model. Some of its parameters are intertwined with foliage shape, but others are generated randomly for a given plant set. Some of its variation includes its length, directionality, curvature, capacity to hold flowers, quantity of spikes per plant, location(s) from which spikes emerge, and etc.
Color
After studying the blooming orchids in my collection and those from an encyclopedia of orchids, I noticed the colors of flowers tend to repeat themselves. For example, there’s a deep red, purple, yellow and light yellow-green that each appear in at least one-third of the plants I analyzed.
Hoping to discover some underlying pattern, I simplified all observed colors into a set of 15 colors and graphed them in RGB, HSB and LAB color spaces. Only in LAB space did the colors loosely follow a curve, from white through cream & light greens, yellow, orange, reds, maroons & tyrians, to purple and finally magenta. It’s interesting to note that these colors almost exclusively inhabit the upper right portion of the LAB space, away from cooler colors. This makes sense, as blue orchids are extremely rare.
I also noticed that orchid flower palettes tend to have anywhere from one to five colors in them. Using this information and the color sequence above, I formed a palette generator. This generator (1) randomly decides how many colors are in a palette, then (2) for each spot in the palette, samples the colormap continuously, interpolating between colors as needed. The result is a set of realistic flower colors comprising a given plant’s flower palette.
A slightly different approach is utilized for the foliage color. Since nearly all foliage is some shade of green, I generate a landmark in the green lightness channel and in the red and blue channels that yields a variably light foliage with warm and/or cool tints.
Lastly, the background base color is randomly sampled from another colormap, then augmented with fog of a varying color, yielding a multi-hued gradient.
Pattern
Every orchid plant, even those of the same type, often have strikingly different patterns. A good example is Miltoniopsis: a medium-sized plant with large, fragrant, showy blooms in intensely deep reds and purples. This variation within a plant, across plants of the same type, and across plants of different types, is a testament to complexity of color expression in orchid flowers.
Modeling the great variety of flower patterns was one of the most difficult tasks in this project. Without a clear direction in mind, I began by collecting data, looking for patterns across plants. For each blooming orchid in my collection, I distilled its color palette, then attempted to parametrically model its pattern for each petal/sepal type in square textures that could be mapped to the geometry previously defined for flowers.
With each new flower, I tried to imagine how its patterns could expand upon, yet still fit within, the mental model of flower pattern I was gradually building up. Eventually, I distilled these learnings into a parametric model. This model could take as input a number of parameters, some numerical and some functional, and output a flower pattern independent of palette.
Loosely speaking, the model stacked a structure function and noise function in a polar coordinate space, mapping each value in a UV texture to a normalized value in the range [0, 1]. These values could then be mapped using a colormap (palette), yielding a pattern in color.
The complexity of this model prevented me from easily generalizing it in the same way as generative flower and foliage shapes. So, I extracted the pattern parameters for 12 flowers and hard-coded these into the script, to be randomly chosen between. This is one of the few instances in my script of a discrete parameter set (the other notable one being Composition mode). Most other variables are continuous, existing along a spectrum, color and shape included.
Despite patterns being predefined, there is still considerable variation across different flowers when noise is present. To prevent two flowers from having the same “expression” of a pattern, I used texture pools to generate many possible petals and sepals from which to randomly assign to a given flower.
The patterning in foliage used a simpler approach in which each channel (R, G, B) received a noise field according to the lightness and tint defined by foliage color. The result is, according to the limits imposed by foliage color, leaves with hints of red and blue, dark greens and light greens.
Composition
At this point, I had a working rendering pipeline and a plant model, complete with foliage, spikes and flowers. The next and final step was generating a set of plants and composing it in a scene.
From the beginning, I imagined a number of different compositions. I wanted a mix of them and a balance between figurative and abstract representations, between a focus on the flowers and on the whole plant.
After some experimenting, I settled on three compositional types from which to randomly select:
- Macro: A close-up of one or more flowers, focusing on the flower’s patterning, color and shape. Foliage is visible in the background but is not the primary focus.
- Forest: A dense landscape of many plants of the same kind, at different stages of maturity, all flowering from afar. Focus is on the texture of a field of orchids and the patterns that emerge en masse.
- Still Life: A portrait of a single plant set sitting in a pot on a table or sill. Focus is on the plant’s pose and posture, its silhouette and the contrast between positive and negative space, its dense mass of flowers and their overall color.
Each composition required a different approach to choosing elements of focus and placing the scene’s camera. A number of other parameters, like spike length, plant quantity, flower size, blur depth, mark size and mark quantity are intertwined with composition mode to ensure each instance yields a pleasing composition. For example, Macro’s tend to have more blur in the background to give the impression of depth and less in the foreground to keep close flowers crisp.
Every scene is also composed of a plant set: a grouping of plants descendent from the same parent, which usually sits near the center of the pot. Plants near the center tend to be the most mature, while those near the edges are the most juvenile. This loosely mirrors the behavior of real-life orchids, which reproduce by vegetative propagation each year and don’t flower until they reach 3 to 8 years of age². I implemented a similar model, where plants need to reach a certain maturity before they can flower.
This may not be apparent from the outputs of Cattleya, but every plant is also temporally parametric. Each composition is frozen in time at a moment when the plants in its scene are mature enough to flower. If you look closely, you may find small young plants and see some buds ready to open. These are vestiges of the full lifecycle of the plant. When visualized in its entirety, a single plant emerges as a seedling and grows and grows until it blooms.
Bringing it All Together…
Together, these parametric models of color, shape and pattern, composed and rendered, yields a fully deterministic generative artwork of incredible variety. Today, I am still regularly surprised by new outputs after generating what must amount to tens of thousands of orchids. I must assume the work’s breadth can be attributed to the quantity of compounding generative models contained within, and to their often continuous, non-discrete nature.
Here’s a selection of my favorite orchids I’ve collected along the way from each composition mode category:
Reflections
Blamed for not including enough hard facts in the Origin of Species to prove the theory of natural selection, Darwin published a follow-up treatise in 1862. Titled The Various Contrivances by Which Orchids Are Fertilized by Insects, he sought to explain how neither theology nor morphology could account for the incredible biodiversity of orchids. Exclaiming “[they] are as varied and almost as perfect as any of the most beautiful adaptations in the animal kingdom,” Darwin clearly had a soft spot for orchids, and it’s no wonder. Sure, they bear showy masses of mesmerizing flowers, but their beauty transcends aesthetics. Orchids are windows, clear as day, into an innate natural intelligence, a tight mechanical collaboration unfolding over millions of years.
My informal yet rigorous study of orchids has given me a newfound appreciation for their rich histories, told and untold. Every flower and plant is so unique, it’s hard not to imagine how they came to be this way. Evolutionarily, Darwin suggests each orchid is unique because in order to survive, each plant needed to develop an exclusive relationship with a pollinator. Exclusivity ensured that the pollen from plant type X would be transported to another plant of type X, and not a different plant type Y. Since pollen is a sparse, valuable material, large chunks of it need to be transported en masse to ensure the receiving plant produces as many seeds as possible to maximize each seed’s minuscule chance of germination. This is why orchids “want” to work exclusively with one kind of pollinator to transport their precious cargo reliably, and why the flowers are so unique—as unique as their pollinator.
All said, this explanation still doesn’t satisfy my innate curiosity to understand, on a more intuitive level, the significance of these plants. I’m intrigued by the tension between a raw and carnal beauty and a latent natural machinery and intelligence. And the more I learn about these creatures, the more I’m drawn in. Their “organic” computation manifests over millennia in an inextricably intertwined body and mind. There’s a harmony between form and function, unparalleled in our own machines: humbling qualities worthy of admiration and respect.
This project is my Ode to Orchids: made in reverence to their beauty and timeless mystery.
I encourage you to generate your own orchids. You may be tempted to right-click + save them. I’m guilty of having manually saved 5385 outputs and counting. Sometimes, I need to remind myself that all is fleeting in this life. Oddly enough, it’s easier to stay present, enjoy and let go when you imagine every orchid you don’t save is your little secret: a co-creation for your eyes only, a special moment to treasure and keep within you as you go on your way. The world is too much with us, as Wordsworth would say…
Thanks
I owe a great deal of thanks to a lot of people for their support of this work. Most of all, I want to thank my partner Gray for supporting, encouraging and entertaining my orchid obsession, for building our collection together and investing in a life closer to nature. I deeply appreciate the communities of people in the orbit of Art Blocks and p5.js excited to share their passion and knowledge of generative art and help troubleshoot obscure bugs. Had Matt DesLauriers not mentioned signed distance fields in his Meridian release talk, this work wouldn’t exist in its current form. He’s an inspiration and I owe him a great deal of gratitude for sharing shader code like glsl-fast-gaussian-blur. Thank you to the Art Blocks team, especially Jeff Davis, Sarah Rossien and Sofia Garcia, for their support through this process and willingness to share every kind of generative art, including representational work like Cattleya. Many thanks to Taipei Dangdai for showing this work alongside traditional forms of fine art.
Lastly, if you’re curious to get your own unique real-life orchid, I cannot recommend more highly some of my favorite orchid nurseries, namely Appalachian Tropicals, Looking Glass Orchids, Silva Orchids and Orchid Web. I’ve frequented them in search of inspiring specimens for the last year and have not been disappointed!
Bibliography
[1] https://en.wikipedia.org/wiki/Angraecum_sesquipedale
[2] https://www.gardeners.com/how-to/growing-orchids/5072.html