The most interesting forms of self-structuring occur in three dimensional space (or higher). Unfortunately, the soda constructor software only works in two dimensions. The goal of this project is to generalize the soda-constructor idea to three dimensions.
At first sight this generalization seems a very daunting task. But I think that a small group of people with object programming skills could easily recreate the soda constructor and easily generalize it to three dimensions. A given soda construction consists of two classes of objects: nodes and rods. A node object has a list of cartesian co-ordinates and a set of rod objects to which it is connected. A rod object has a pair of nodes to which it is connected, and it has an unstretched length L and a spring constant k, telling its resistance to elongation or compression.
Both rods and nodes have methods that enable the structure to choose its shape. A rod has a method that computes its elastic energy. It computes this energy by comparing the distance between its ends, r, to its unstretched length L. Then the energy E is given by E = (1/2) k(r - L)2. A second method computes the cartesian components of the force. Its direction is the direction of the rod, determined from the two end positions. Its magnitude and sign are given by k (r-L). A node has a method that determines the net force vector on it, found by summing the forces from its connected rods. It has a further method that shifts its position in the direction of this force by a small amount, set by a global parameter.
Consider an object such as tetrahedron constructed from these nodes and rods. Unless the nodes are properly placed in the initial configuration, there will be a nonzero force on each node. Now a program operates on this structure in order to relax it to the state of least energy. The program requests each node in turn to move slightly in the direction of its force. Then it requests each rod in turn to determine its force using the current, altered positions. This algorithm eventually leads to a configuration of minimal energy. In our example of a tetrahedron, this is a regular tetrahedron.
More interesting objects, such as an elastic sheet or tube, consist of many nodes and rods. It is useful to have some simple method to construct these complicated objects. The original soda constructor has a graphic user interface for this purpose. To construct an object you move a mouse to construct each rod. Generalizing this interface to three dimensions requires a little thought. One way to do it is to create a rod with a free end by dragging from an existing node in a given direction on the screen. Then, when two rods have been created in this way, one connects them by clicking on their free ends in sequence and then giving a key stroke to tell the program to connect them. This procedure doesn't specify where the connection point will be in space. But one can use the relaxation procedure above to select a natural point. One just specifies that after two points are connected, the connecting node and its rods are relaxed as told above. When the process is finished, the new node is at its lowest energy position. In general, this position is out of the plane of the other nodes.
For example, one can build a tetrahedron by first drawing a rod, and then drawing a free rod from each of its two ends. Next, one connects these two free ends. The relaxation that follows this connection leaves the three rods in an equilateral triangle. Finally, a free rod is attached to each of the three corners, and the resulting three free ends are connected. The relaxation that follows creates a regular tetrahedron.
One slight complication is that the final node of the tetrahedron lies initially in a plane, with compressive forces acting from all three rods. Thus the relaxation process never generates an out-of-plane force to push the node to its equilibrium position. It reaches an unstable equilibrium. To avoid this unphysical situation, one can give an additional command to push the newly connected node slightly above or below the plane of the original nodes. This breaks the degeneracy and assures a unique final position. Using this interface, one can readily connect dozens of rods with a few dozen points and clicks.
To create an elastic sheet, one can start with a planar triangular lattice, eg in the shape of a regular hexagon. Such a lattice should be a defined object in the program. One positions the first lattice in the plane of the screen and then creates a second copy of the lattice shifted slightly relative to the first copy, so that each of its nodes lies at the center of a triangle of the first lattice. Next, one pushes the second lattice above the plane of the first lattice. Finally, one connects each node of the second lattice to the nearest three nodes of the first. This creates a rigid, two level structure. It can be deformed and manipulated like a continuum elastic sheet, provided the local curvature is much smaller than the rod length L.
To create a tube, one can start with a circle with, say 30 rods connected in a ring. Next one duplicates this ring and decreases the unstretched length L slightly, so that the two rings are concentric and each inner node lies between two neighboring outer nodes. Next one connects each inner node to the two nearest outer nodes. Then one duplicates the entire structure and places the new copy above the first copy, with each node lying above the center of a rod of the first copy. Finally one connects each node of the second copy to the nearest two nodes of the first copy. One then copies the entire structure and connects it to the original copy in the same way, thus doubling the height of the tube. One continues like this until the desired height is attained.