Animated Bloom Sculptures

The golden ratio applied to art sculpture. Persistence of vision illusion.
By Jonathan Lee.
December 07, 2021

Inspiration

This project is inspired by the work of John Edmark. He created these amazing 3D printed sculptures designed to animate when spun under a strobe light. This is a video of his sculptures.

My Take

For my Digital Media Art course, I decided to make a set of chess pieces that would appear to animate when spun. Each piece carries a motif from its traditional counterpart and incorporates the Golden Angle \(\Phi \approx 137.508 ^\circ\), which produces the spiral pattern around the sculpture. This pattern is often found in nature, especially in phyllotaxis, such as in the arrangement of sunflower seeds in the flower, due to the optimal packing density of the pattern.

I created each piece in Blender using the python scripting API. The key was to start with a primitive shape and to rotate it around the z-axis by the Golden Angle \(\Phi\). When the sculpture is spun on its axis and it is viewed under a strobe light or camera, it causes a persistence of vision illusion that makes the little nodes seem to move up the sculpture. Changing the frequency of the strobe or framerate can make the sculpture appear to stand still, flow inward, or flow outward. This illusion is similar to how car wheel spokes appear to spin forwards or backward on the highway, or how propeller blades appear to move in slow motion in videos.

In addition to a rotation around the z-axis, I also translated the shape in the z-axis to create cones, cylinders, and spheres. To create the “oscillating spikes” on the king and queen, I used a sine wave to give the spikes a periodic motion.

Scripting

3D Mesh Script

This is the Python script I used to create the pawn in Blender 2.79.

import bpy
import bmesh
import math
from mathutils import Vector

n = 150  # number of points
r = 1.75 # radius
layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)

# create the first instance of the sphere to revolve
bpy.ops.mesh.primitive_uv_sphere_add(size=0.25, view_align=False, enter_editmode=False, location=(0, 0, 0), layers=layers)

ob = bpy.context.object
obs = []
sce = bpy.context.scene

# Revolve smaller spheres around a larger sphere, each transformed by reducing scale and rotating by the angle phi and theta.
for i in range(1, n):
    theta = i * math.radians(137.5) #degrees
    phi =  (math.radians(120)/n) * i
    x = r*math.sin(phi)*math.cos(theta)
    y = r*math.sin(phi)*math.sin(theta)
    z = r*math.cos(phi)

    if x<0:
        a = x*(-1)
    else:
        a = x

    if y < 0: 
        b = y*(-1)
    else:
        b = y         

    c = math.sqrt((a*a)+(b*b))
    size = c*0.8 + 0.009*i # This can be messed about with to get the right size

    copy = ob.copy()
    copy.location = (x,y,z)
    copy.scale = size*copy.scale
    copy.rotation_euler=(phi,math.radians(0),theta+math.radians(90))
    copy.data = copy.data.copy()
    obs.append(copy)

for ob in obs:
    sce.objects.link(ob)

# Fill inside of pawn with a sphere
py.ops.mesh.primitive_uv_sphere_add(size=1.75, view_align=False, enter_editmode=False, location=(0, 0, 0), layers=layers)

# Cylinder to form base of 3D model
bpy.ops.mesh.primitive_cylinder_add(vertices=32, radius=2.0, depth=1.0, end_fill_type='NGON', calc_uvs=False, view_align=False, enter_editmode=False, location=(0.0, 0.0, -1.5), rotation=(0.0, 0.0, 0.0), layers=layers)

sce.update() 

Animation Script

The animation script rotates the sculpture on the z-axis by the angle \(\Phi\) every frame. Every 143 frames, the sculpture rotates back to its starting point. Then I play the animation in an infinite loop, so it appears spin indefinitely. This helps me visualize how the sculpture will come alive, and I can quickly tweak and iterate the design.

import bpy
import bmesh
import math
from mathutils import Vector

# prepare a scene
scn = bpy.context.scene
ob = bpy.context.object

n = 143 #number of frames
d = 0   #Change to apply spin

for i in range(0, n):

    bpy.context.scene.frame_set(i)

    # do something with the object. A rotation, in this case
    ob.rotation_euler=(0.0,0.0,math.radians(d))

    d = (d + 137.5) #Change to subtract to change direction of appeared flow

    # create keyframe
    bpy.ops.anim.keyframe_insert_menu(type='Rotation')

Creating the Physical Sculpture

3D printed parts. Some still with support material.

Seeing art on a computer is one thing, but seeing it with your own eyes is so much more immersive and makes the illusion come to life. I built physical models of the sculptures by 3D printing the 3D mesh. I used a PC fan as a turn table to spin them at a constant speed. A bright LED flashlight that I rigged as a strobe light was the final touch to create the illusion.

I used a 555 timer and RC circuit to generate a high frequency square wave to turn the flashlight into a strobe light. A potentiometer is used to tune the frequency of strobe light and change the speed of the illusion.

The combination of the strobe light and rolling shutter of the camera create noticeable artifacts in the video. In real life, the flashing from the strobe light is not as apparent due to the high frequency and duty cycle.

Unfortunately, the PC fan was not strong enough to spin some of the larger models. In the future, I’d like to revisit this project and make a nicer animated display for the sculptures.