Generating 3D Models

TL;DR

  • We need to generate 3D models of phyllotactic patterns.
  • We give an explanation of how to generate phyllotactic patterns on a sphere.
  • We present an issue we encountered, and the solution we found.

Why 3D Models ?

When we first started thinking about the project, we quickly realized we would need to generate 3D models of the sculpture ourselves.

First because we need to have full control on the model, to try various configurations for the future 3D printed sculpture. And second because it will greatly help us visualize all the kinds of animations we are imagining.

Accordingly, Vlaya wrote a script using the blender python API to generate a 3D model, following John Edmark’s online explanation.

Phyllotactic Patterns on a Sphere

We place the first point on the “equator”. Then to place each following point, we rotate 137.5° and move a little closer to the top of the sphere.

The big question is : how much closer is “a little closer to the top of the sphere” ?

137.5° is the golden angle, derived from the golden ratio. It has the nice mathematical property of being as hard as possible to approximate with rational numbers. This allows it to waste as little space as possible, which is why plants use it. And it looks nicer. You can try the simulation on this page to get a better grasp of this.

A First Attempt

The first thing we tried was to actually place the points on a cylinder, rotating them 137.5° and going up by a fixed amount each time, and then projecting those points onto the sphere :

Projection from the cylinder onto the sphere
The projected points
Connecting the dots

But we soon noticed an annoying discrepancy between what we got, and what John Edmark’s Blooms look like :

A Bloom by John Edmark on the left, our attempt on the right

Our petals get more and more squashed as we near the center.

A consequence of that is, if we follow a spiral from the center outwards, at some point we’ll realise that what we’re following isn’t a spiral anymore.

All this doesn’t happen with John Edmark’s Bloom.

Follow a clockwise spiral from the center outwards and see what happens

The same thing actually happens in sunflowers:

Spirals “breaking up” in a sunflower

But in our case, it happens because the points step too slowly towards the center, whereas in a sunflower, they step too fast.

This paper on phyllotactic spirals gives a good explanation.

A Better Solution

Let’s formalise things a bit:

Spherical coordinates

A point on the sphere can be located by two arcs of a circle : parallel arcs (“horizontal”) and meridian arcs (“vertical”). To rephrase the previous explanation, we place each following point by moving along a parallel for 137.5°, and then moving up along a meridian for some arc length.

A face formed by intersecting spirals

As we get closer to the top, the parallel arcs of circle become smaller.

The meridian arcs also need to get smaller, otherwise we would overshoot the top.

We want the meridian arc lengths to decrease so that the faces keep roughly the same square shape.

To do that, they need to decrease at the same rate as the parallel arc lengths, to remain in proportion.

A bit of geometry yields this differential equation, where a(x) is the “vertical” angle between point x and the horizontal plane, and k is a coefficient:

a'(x) = k cos(a(x))
a(0) = 0

The solution is:

a(x) = Arctan(sinh(kx))

We had to tweak the value of k a little bit to get nice results.

Here’s what it looks like:

3D rendering of our latest design

Flat Circular Phyllotactic Patterns

We can do the same thing with flat circular patterns : place each following point by rotating 137° and moving closer to the center. The question is still “how much closer ?” and the geometry is merely a bit different.

We get this differential equation, where r(x) is the distance of point x from the center, k is a coefficient and R is the radius of the circle:

r'(x) = - k r(x) 
r(0) = R

The solution is:

r(x) = R exp(-kx)

This gives us flat patterns like that:

Flat phyllotactic pattern

Stay tuned for upcoming 3D animations !

Ah, yes. Stereoscopic vision.

This is a follow-up to my previous article, in which we explored the choice of PCB placement in order to get an optimal visibility.

My previous analysis only covered the case of a punctual point of view. However, most people have two eyes, which provide a double point of view and could increase our coverage of space. It is to be pointed out that a point of space seen by one eye does not provide depth information to the brain, however let us assume that our image perception is smart enough to overcome this limit.

In the following simulation, we used a typical eye distance of 6 cm. To understand the different configurations, please refer to this article.

As you can see, the dispositions that seem to benefit the most of stereoscopic vision are modulo forests, particularly the ones where the repartition of PCBs seems the most uniform. The parallax effect is all the stongest when PCBs hiding each other are far away in the axis of vision. Modulo forests with k = 3 and 11 seem to be good candidates as the front portion of the cylinder is (almost) complete in both cases.

Choosing a shape

As stated in this previous post, we have to compare different PCB dispositions to avoid blind spots. We soon came to realization that we would not be able to get rid of blind spots with our design, but it is possible to study the different ideas we came up with in order to mitigate this issue.

That’s why we created a python program that can simulate :

  • blind spots created by PCBs hiding each other
  • the variations of brightness due to the fact that LEDs can be seen at an angle (which is what created the dark center zone in CyL3D, which we are trying to get rid of)

Stairs : an iteration over CyL3D’s design

To avoid the issue of a dark zone due to all LEDs facing the observer at an angle in the center zone, an idea was to make sure that all LEDs were not facing the same direction. There came the stairs idea:

Stairs design. The PCBs have LEDs on one face.

After modelling this idea in python we get:

As you can see, there are a lot of deadzones, particularly in the central viewing axis.

The radial revolution?

Imagine a configuration with one vertical PCB with LEDs on both sides, facing the radial direction. Wait, don’t. I modeled it so you don’t have to :

This creates a 2D cylindrical POV display, with dark zones on the sides, which is in our opinion much better than a center dark zone. To create a 3D POV display, we “only” need to add concentric cylinders. The question is now: how serious is the problem of PCBs hiding each other and how to avoid it.

Spiraling down the rabbit hole

The idea of spirals seems natural. PCBs can laid out with an angular offset when compared to the adjacent PCB. For balancing reason, we alternate the PCBs with a central symmetry in order to create a double spiral.

The major issue is that the adjacent PCBs tend to hide each other in large portions of space, due to the fact that they are aligned and closed to each other. We can also notice that the resulting shape is far from being symmetric (which is expected with a spiral).

Some arithmetics

In order to shake things up a little more, we can keep the idea of a constant angular offset, but with a twist.

Let us take a circle split in n angular positions. If you choose a starting point and then jump from position to positions by skipping k positions, you will reach all positions if, and only if, n and k are coprime. This gives us a more evenly spread disposition.

For the sake of convenience, and because it is a nice name, we shall name this configuration “modulo forest”.

Deadzones tend to be much more spread out, which seems more acceptable. Further investigation has to be done in order to choose a definitive shape.