VITAL MODELLING AGENCY SYSTEMS
collaboration with camilla burke
Ensuring the particles recognise the rest of the particle collection was the next step in behaviour development. By utilising vectors, an attraction was created between particles triggered at a set distance, which were then repeled when a certain proximity from each other was reached. A particle’s direction could also be determined to ensure it was aligned to follow the larger body’s heading. This behaviour, known as flocking, formed the fundamental basis for our experimentation of complex behaviours of attracting and separating interactions.
The transition from working in a 2-dimensional canvas to a 3-dimensional space required additional parameters to the existing vectors. Fading effects from drawn transparent overlays were harder to achieve and mouse input more difficult to steer, but depth of perspective allowed for greater diversity in the agent’s behaviours. We were able to observe the various ways our functions affected spatial movement patterns by video recordings, and in subsequent studies, 3D meshes.
The generated isomeshes from processing were found to be unfeasible for resin printing due to the unworkability of the generated meshes. So an alternative method was explored by recording the particle trails as curves to export to more 3D oriented programs. By using a combination of 3Ds Max Plugins (PWrapper) and Rhino modelling, we were able to generate more refined and varied forms. The outcomes from tweaking the control settings ranged from fragmenting, flaking and disintegrating effects, while still maintaining digital workability for a resin print.
/*---------------------------------------
//Not sure exactly what's going on here - play around with it and see what it does
IMPORT LIBRARIE
//His comment was "move it to the ground
---------------------------------------*
obj.translate
if (distance < radius) {
fill(255);
int moveCount = 0;
acc.addSelf(steer);
acc addSelf(steer);
ptPop add(loc copy());
} ().y - bounds.getCenter().y), 0));
//---Constructor---//
import toxi.geo
//---Ball Flocking Function---/
{
import toxi.geo
//Make an array of WETriangleMeshes, the same size as the number of segments in the original OBJModel
import processin
WETriangleMes
voi v vo oid floc
getSegmentCount()];
separat
import processin
//---Display of Ball as spheres---//
cohesio
import processin
//Lets create a different WETriangleMesh to repres nt the whole thing
import processin
WETriangleMes
import peasy.or
//Loop over i, from 0 to the number of segments in the original OBJModel
import peasy.*
for (int i= 0
//---Behaviours---//
align(0.1
/*---------------------------------------
}
GLOBAL SETUP & SKETCH INITIALIZATION ---------------------------------------*/
//---Ball Alignmen ment t Beh Be Behaviour---/ void alig
c.y,loc.z);
import peasy.or //Do our little function below to make a WETriangl Mesh out of segment number i. import saito.objloade
meshArray
/*--------------------------------------
Vec3D stee
i));
>0) renderCurve();
//Add that to the giant mes
GLOBAL VARIABLE
int coun
100,-50,800);
fo (in for fo in
expMesh.addMes
---------------------------------------*
// smooths so when balls separate does not look as mechan
}
boolean savePD
width, height, "drawing.mov", 30, MovieMaker
Ball
return expMes
boolean exportDX
f(diff); "StudioMesh2.obj","absolute",TRIANGLES);
boolean record
normalizeTo(1.0/distance);
floa f loat
}
MovieMaker m mm m;
if (distanc
//--- Generate a WETriangleMesh from Segment---/
stee
public boolean
coun
//---Model variables---/
public WETriangleMes
}
PeasyCam m cam m;
}
OBJModel model
//New, blank WETriangleMes
f(1.0/count);
WETriangleMes
1000);
if( coun
//---Particle variables---/
steer
ArrayList ballCollectio
//Loop over i, from 0 to the number of faces in th
ArrayList attractorCollectio
for (int i =
segment
}
magnitude);
model);
r);
int radius = 1 ;
steer.scaleSel
int numBalls = 100;
//Get the face number i from that segmen
acc.addSel
Face face
}
WETriangleMesh mesh; /*---------------------------------------
//Get vector 0 (Java is zero-indexed
Methods
//---Ball / / Cohesion Behaviour---/
Vec3D a =
---------------------------------------*/
numBalls; i++) {
v d cohesio voi
//---Origin from a point or an area---// //Get vector
//---Generate a WETriangleMesh from an OBJModel---//
//Vec3D origin = new Vec3D(random(-1.5*width/4,1.5*width/4),random(10,20),random(-50,50))
Vec3D b =
Vec3D su
30,20,50);
in nt coun
origin); public WETriangleMesh convertOBJModel(OBJModel obj) {
//Get vector
l); ;
for (in
Vec3D c = //Put it in the middle
Ball
obj.translateToCenter();
//Add a face to the WETriangleMesh based on those
float
mesh.addFac //Get the overall bounds BoundingBo
bound
BoundingBo (thi
} obj)
GLOBAL PROGRAM LOOP //When we've gone over every face in the segment, return the finished WETriangleMesh
//Two PVectors, centre and axi
return mesh;
PVector cente
center.z);
float distance = V.distanceTo(ball.loc); //This AABB thing
class Ball cl
steer.addSelf(diff);
sum m.addSelf(other.loc); count++;
count++; //--C /// --CLASS -C C VARIABLES---/
if (savePDF) beginRecord(PDF, timestamp()+".pdf");
Vec3D loc =
if (exportDXF) beginRaw w(DXF, "output.dxf");
Vec3D speed
c); if(count >0) {
Vec3D acc =
//------------------------------- co code de aft afte er here
Vec3D grav =
//Checks distance from ball to face ArrayList ptPo
}
d);
} Vec3D steer = sum m.sub(loc); steer.scaleSelf(m magnitude);
//---Model display---//
sum m.scaleSelf(1.0/count);
if(count > 0) { steer.scaleSelf(1.0/count);
background(128);
//---Ball movement---//
} }
} random m(-1,1));
toxi.geom m.m mesh.W WEVertex V = mesh.getClosestVertexToPoint(ball.loc);
Vec3D boundPoin
AABB objBound
diff.normalizeTo(1.0/radius);
---------------------------------------*/ / voi oid d draw w() { // this line will start pdf export, if the variable savePDF was set set e to true
public boolean intersecting(Ball ball, WETriangleMesh mesh) { //Two points - one is the centre, one is at the ax
if (distanc
mechanical// //---BALL CLASS--/
}
PVector wh
Vec3D centrePoin
/*---------------------------------------
steer.scaleSelf(m magnitude); {