Logo

Agent-based Tectonics

2019 Computational Design Rhino, Grasshopper

Follow Daniel Dennett. Algorithms, mindless steps, create automatic geometry & aesthetics with autonomous agents.

cover image of the project

Daniel Dennett once addressed how impressive the products of an algorithm, the underlying process always consists of nothing but a set of individually mindless steps succeeding each other without the help of intelligent supervision: they are “automatic” by definition: the workings of an automaton. This project states that algorithm is a new set of geometry, a new set of aesthetic with autonomous agents.

Low-poly Modeling

modularity to subdivision surface

low-poly modeling

low-poly modeling

Mesh vector field

extract vector field data for orienting planes

mesh vector field

mesh vector field

Mesh initial processing

build vertex-colored meshes for scalar and vector data fields

mesh initial processing

mesh initial processing

  • Left: mesh with vector value
  • Right: mesh with scalar value

Agent System

a flocking agent system based on Craig Reynolds classical rules

AgentPlaneSimulation.cs
public class AgentPlaneSimulation
{
// .......................... fields
15 collapsed lines
//public double cNS;
//public double cNT;
public double PlaneRadius;
public double NeighborhoodRadius;
public double CohesionStrength;
public double AlignmentStrength;
public double SeparationStrength;
public double FieldStrength;
public double MaxForce;
public double MeshSeekRadius;
public double MeshStrength;
public double SeekColorStrength;
public double MaxSpeed;
public AgentPlane[] agentPlanes;
// .......................... constructor
public AgentPlaneSimulation(List<Point3d> P, List<Vector3d> V, double cNS, double cNT, double pR, double cI, double aI, double sI, double fI, double mF)
21 collapsed lines
{
//this.cNS = cNS;
//this.cNT = cNT;
this.PlaneRadius = pR;
this.CohesionStrength = cI;
this.AlignmentStrength = aI;
this.SeparationStrength = sI;
this.FieldStrength = fI;
this.MaxForce = mF;
this.MaxSpeed = 0.3;
// build agent planes array
agentPlanes = new AgentPlane[P.Count];
Parallel.For(0, P.Count, i =>
{
agentPlanes[i] = new AgentPlane(P[i], V[i], this);
});
}
public AgentPlaneSimulation(List<Point3d> P, List<Vector3d> V)
11 collapsed lines
{
// build agent planes array
agentPlanes = new AgentPlane[P.Count];
this.MaxSpeed = 0.1;
Parallel.For(0, P.Count, i =>
{
agentPlanes[i] = new AgentPlane(P[i], V[i], this);
});
}
// .......................... methods
public void Update()
39 collapsed lines
{
// . . . . . . . . . . environmental and stigmergic interactions
// calculate field influence vector for agents
foreach(AgentPlane ag in agentPlanes)
{
// clear neighbour list
ag.neighbours.Clear();
ag.neighTens.Clear();
// calculate field vector from mesh
// Eventhandler function for RTree search
EventHandler<RTreeEventArgs> rTreeCallback = (object sender, RTreeEventArgs args) =>
{
ag.neighbours.Add(MEnvironment.Vertices[args.Id]);
ag.neighTens.Add(TensorField[args.Id]);
};
MeshRTree.Search(new Sphere(MEnvironment.ClosestPoint(ag.O), MeshSeekRadius), rTreeCallback);
// this resets the acceleration (or desired direction)
// in case a different update sequence is implemented
// remember to reset desired before calculating the new iteration
ag.ResetDesired();
ag.SeekMeshNeighbours();
ag.SeekColor();
ag.ComputeFieldAlign(ag.ComputeFieldVector(),FieldStrength);
}
// . . . . . . . . . . peer-to-peer interaction
FLockRTree();
// . . . . . . . . . . update position and direction
UpdateAgentsDirection();
}
public void FLockRTree()
27 collapsed lines
{
// declare RTree
RTree rTree = new RTree();
// populate RTree
for (int i = 0; i < agentPlanes.Length; i++)
rTree.Insert(agentPlanes[i].O, i);
// find neighbours for each agent
foreach (AgentPlane agent in agentPlanes)
{
List<AgentPlane> neighbours = new List<AgentPlane>();
EventHandler<RTreeEventArgs> rTreeCallback =
(object sender, RTreeEventArgs args) =>
{
if (agentPlanes[args.Id] != agent)
neighbours.Add(agentPlanes[args.Id]);
};
rTree.Search(new Sphere(agent.O, NeighborhoodRadius), rTreeCallback);
// compute desired vector for each agent
agent.ComputeDesiredNeighbours(neighbours);
}
}
public void UpdateAgentsDirection()
9 collapsed lines
{
// here's one of my mods - update positions and velocities in parallel
Parallel.For(0, agentPlanes.Length, i =>
{
// update at max Force
agentPlanes[i].UpdateDirectionAndPosition();
});
}
}

Code credit: Alessio Eriol

Isosurfacing line-base network geometries

discretize 3d space with Marching Cubes algorithm into voxels

agent pre setup

agent pre setup



agent body 1

agent body 1



agent body 2

agent body 2



agent body 3

agent body 3




algorithms are modes of thought logic becomes an aesthetic operation

algorithms are modes of thought logic becomes an aesthetic operation

PROJECT INFO

Year
2019
Type
Computational Design

TECH STACK

Rhino Grasshopper

ADVISORS

Name
Alessio ERIOLI
Institution
Università di Bologna
Profile
https://www.unibo.it/sitoweb/alessio.erioli/en

TAGS

Grasshopper Rhino agent