10.014 CTD
  • Overview
  • Schedule
  • Administrative
    • Accessing Rhino remotely
    • Rhino for Mac
  • ASSIGNMENTS
    • Dates and rubrics
    • Generative design
      • Generative design
    • Parametric design
      • Parametric design
    • Simulated design
      • Simulated design
      • Simulated design
  • SESSION 1B
    • Computer Aided Design
    • Ranges and expressions 1
      • Ranges and expressions 2
      • Ranges and expressions 3
      • Ranges and expressions 4
      • Ranges and expressions 5
      • Ranges and expressions 6
  • SESSION 2A
    • Visual programming 1
      • Visual programming 2
      • Visual programming 3
      • Visual programming 4
    • Associative modelling 1
      • Associative modelling 2
      • Associative modelling 3
  • SESSION 2B
    • Logical Patterns 1
      • Logical patterns 2
      • Logical patterns 3
  • SESSION 3A
    • Spatial geometry 1
      • Spatial geometry 2
      • Spatial geometry 3
      • Spatial geometry 4
      • Spatial geometry 5
      • Spatial geometry 6
      • Spatial geometry 7
    • Curve geometry 1
      • Curve geometry 2
      • Curve geometry 3
      • Curve geometry 4
  • SESSION 3B
    • Surface geometry
    • Parametric modelling 1
      • Parametric modelling 2
      • Parametric modelling 3
      • Parametric modelling 4
  • SESSION 4A
    • Information nesting 1
      • Information nesting 2
      • Information nesting 3
    • Data landscapes 1
      • Data landscapes 2
      • Data Landscapes 3
      • Data landscapes 4
  • SESSION 4B
    • Mesh geometry 1
      • Mesh geometry 2
      • Mesh geometry 3
  • SESSION 5A
    • Space and time 1
      • Space and time 2
    • Modelling entities 1
      • Modelling entities 2
      • Modelling entities 3
  • SESSION 5B
    • Multibody dynamics 1
      • Multibody dynamics 2
    • Material elasticity 1
      • Material elasticity 2
      • Material elasticity 3
  • SESSION 6A
    • Form-finding 1
      • Form-finding 2
      • Form-finding 3
      • Form-finding 4
  • SESSION 6B
    • AI Image generation 1
      • AI Image generation 2
      • AI Image generation 3
  • APPENDIX
    • Spirograph 1
      • Spirograph 2
    • Curves
    • Swarm Intelligence 1
      • Swarm Intelligence 2
    • Hybrid programming 1
      • Hybrid programming 2
Powered by GitBook
On this page
  1. SESSION 6A

Form-finding 1

Vaults, minimal surfaces and mesh relaxation

PreviousMaterial elasticity 3NextForm-finding 2

Last updated 9 months ago

In this session we introduce the concept of “form-finding” []; a process of deriving geometry via experiments involving materials and physics. Classic examples include experiments for composite vault designs [] using rope and weight physical models []; dome designs [] derived from soap bubble experiments []; and tensile canopy structures [] produced by stretching membranes and thin films [].

The appeal of those design forms is in that they integrate certain mechanical material properties and also because they cannot be designed with conventional constructive geometry methods using pen and paper or CAD. Today we use physics simulation to perform form-finding as it is easier to setup and execute, compared with quite labor intensive preparation of physical experimental prototypes.

Relations Design

In previous examples we kept relationships ie. the way forces associate with particles, implicit: In the projectile case we established none, in the multibody case we defined all possible combinations, and in the chain case we implied that adjacent particles in a list are connected in a rope-like sense. Controlling connectivity between particles explicitly requires describing relationships in a more well-structured manner. How should this structure look like and what kind of data shall we store?

The common pattern among operations performed during the application of forces to particles was some form of “smart” indexing for selecting the positions of particle pairs, defining force vectors, applying physics laws and accumulating force sums. This indexing logic is what we need to express with data. For every particle we shall retain a list of all other connected particles. This structure is also known as an edge table.

In the figure above, the particle at index “0” is connected with particles “1”, “3” and “4”; particle “2” is connected with “1” and “5”; particle “4” is pretty much connected to every other particle except “6” and “2”. The entire edge table is encoded below such that for every particle [0, 8] we have captured all of its connected neighbours.

I   Edges
0 → 1 3 4
1 → 0 2 4 5
2 → 1 5
3 → 0 4 6 7
4 → 0 1 3 5 7 8
5 → 1 2 4 8
6 → 3 7
7 → 3 4 6 8
8 → 4 5 7

Edge Topology

The topology cluster constructs the edge table by examining the mesh’s face indices. We employ a python component, because it is faster and less verbose, but it is also possible to use simple “expression” components or even basic comparisons instead.

The key insight for associating how vertices, edges and faces are related to one another is observing that given a mesh’s face “[A, B, C]”, where “A”, “B” and “C” are the three vertex indices of a triangle, we can tell that vertex “A” is forward linked to “B” via an edge and backward to “C” via another edge. Thus all we need to do is to accumulate linkage information for every vertex. It is easier to explain the mechanics of this process if we work out an example with specific values instead of symbols.

The first operation performed by the topology construction cluster is to decompose a mesh into its vertex and face lists; nine vertices and eight faces seen below. We may express the edges of each triangle as pairs of indices of the face list. For example the triangle “[0, 1, 4]”, contains the three edges “[0, 1]”, “[1, 4]” and looping back to the first we have also “[4, 0]”.

    Vertex List       Face List        Edges implied by Faces 
I    X   Y   Z        A   B   C         E        F        G
0   -1  -1   0        0 → 1 → 4       0 → 1    1 → 4    4 → 0 
1    0  -1   0        1 → 2 → 5       1 → 2    2 → 5    5 → 1 
2    1  -1   0        3 → 4 → 7       3 → 4    4 → 7    7 → 3 
3   -1   0   0        4 → 5 → 8       4 → 5    5 → 8    8 → 4 
4    0   0   0        0 → 4 → 3       0 → 4    4 → 3    3 → 0 
5    1   0   0        1 → 5 → 4       1 → 5    5 → 4    4 → 1 
6   -1   1   0        3 → 7 → 6       3 → 7    7 → 6    6 → 3 
7    0   1   0        4 → 8 → 7       4 → 8    8 → 7    7 → 4 
8    1   1   0

Next we push the face list data to the python component as well as a regular series with as many items as the number of vertices i.e. in this example nine in “[0, 8]”. The python expression for triangles, in ternary “if” form, can be written as seen below.

U = B if( I == A ) else C if( I == B ) else A if( I == C ) else -1
V = C if( I == A ) else A if( I == B ) else B if( I == C ) else -1

The cascading “if” construct detects whether a vertex at index “I”, in the mesh vertex list, matches either face index “A”, “B”, or “C”. Specifically for “U”, if it matches “A” it returns “B”; if it matches “B” it returns “C”; if it matches “C” it returns “A”; otherwise it signals failure to match using “-1”. The “V” value performs the same query but in the opposite direction i.e. instead of “A→B→C” it matches “A←B←C”.

In plain English this query translates to: is a given vertex present in any edge of a given triangle face? If so, report with which other vertex it is connected, otherwise mark it as not connected.

The expected result given that we use “graft” ie. the Cartesian product between the mesh vertices and faces, is two of tables of nine rows by eight columns, respectively. The presence of “-1” values makes it difficult to discern the contents of the tables.

        Table of U Values             Table of V Values
I    0  1  2  3  4  5  6  7        0  1  2  3  4  5  6  7
0    1 -1 -1 -1  4 -1 -1 -1        4 -1 -1 -1  3 -1 -1 -1
1    4  2 -1 -1 -1  5 -1 -1        0  5 -1 -1 -1  4 -1 -1
2   -1  5 -1 -1 -1 -1 -1 -1       -1  1 -1 -1 -1 -1 -1 -1
3   -1 -1  4 -1  0 -1  7 -1       -1 -1  7 -1  4 -1  6 -1
4    0 -1  7  5  3  1 -1  8        1 -1  3  8  0  5 -1  7
5   -1  1 -1  8 -1  4 -1 -1       -1  2 -1  4 -1  1 -1 -1
6   -1 -1 -1 -1 -1 -1  3 -1       -1 -1 -1 -1 -1 -1  7 -1
7   -1 -1  3 -1 -1 -1  6  4       -1 -1  4 -1 -1 -1  3  8
8   -1 -1 -1  4 -1 -1 -1  7       -1 -1 -1  5 -1 -1 -1  4

We need to perform some data reshaping and clean up. First we will merge the two tables into one, as seen below. We need to transpose and merge to keep the same sense of rows and columns.

    Table of Vertex to Face-Edge Incidences
I    0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
0    1 -1 -1 -1  4 -1 -1 -1  4 -1 -1 -1  3 -1 -1 -1
1    4  2 -1 -1 -1  5 -1 -1  0  5 -1 -1 -1  4 -1 -1
2   -1  5 -1 -1 -1 -1 -1 -1 -1  1 -1 -1 -1 -1 -1 -1
3   -1 -1  4 -1  0 -1  7 -1 -1 -1  7 -1  4 -1  6 -1
4    0 -1  7  5  3  1 -1  8  1 -1  3  8  0  5 -1  7
5   -1  1 -1  8 -1  4 -1 -1 -1  2 -1  4 -1  1 -1 -1
6   -1 -1 -1 -1 -1 -1  3 -1 -1 -1 -1 -1 -1 -1  7 -1
7   -1 -1  3 -1 -1 -1  6  4 -1 -1  4 -1 -1 -1  3  8
8   -1 -1 -1  4 -1 -1 -1  7 -1 -1 -1  5 -1 -1 -1  4
     Table of Edges
I    0  1  2  3  4  5  6  
0    1 -1  4  3
1    4  2 -1  5  0
2   -1  5  1
3   -1  4  0  7  6
4    0 -1  7  5  3  1  8
5   -1  1  8  4  2
6   -1  3  7
7   -1  3  6  4  8
8   -1  4  7  5

Finally we perform a “set difference” between the above table and a set containing only one element, namely “-1”. This is to get rid of the pesky “not found” value. We thus end up with exactly what we were looking for: a table that for each vertex, in the mesh’s vertex list, it tells us which are other vertices are connected to it in the sense of edge linkages. You may verify the result by comparing with figure below.

     Table of Edges 
I    0  1  2  3  4  5    
0    1  4  3
1    4  2  5  0
2    5  1
3    4  0  7  6
4    0  7  5  3  1  8
5    1  8  4  2
6    3  7
7    3  6  4  8
8    4  7  5

Developing the edge table using only visual programming components was a bit of a challenge. It is much simpler, more intuitive and faster to write the whole process with few lines of python code. Nevertheless, this proves that all forms of computation are sort of equivalent with various degrees of mental gymnastics required by each.

The actual python for edge table extraction in the graph provided in at the end of the section uses the regular form of “if” statements instead of cascading “if” expressions. This is for legibility given that it aims to works for both triangular, quadrilateral and mixed-faced meshes.

Then we use the “create set” component which removes duplicate entries from a list. A set is like a list but a value can appear in this type of container only once. As a side note, we also do not care about the order of a set’s elements []. This results to the following jagged table. As you may be able to see now we are almost there.

>
>
>
>
>
>
>
>