Foamy Ether - A Framework for a
Theory Of Everything

Conceived and written by Peter C.M. Hahn C.E.T.
 
Copyright © 2005-2007

 

//////////////////////////////////////////////////

// 2DetherArrayAndParticle.thd

// This shows a 2D ether with particle in middle.

//////////////////////////////////////////////////

 

// set background color

scene.backColor=RGB(70,70,70);

 

// turn gravity off

scene.gravity={0,0,0};

 

// remove shadows for faster rendering

scene.shadow = false;

 

// use degrees as metric for angles

factory.useDegrees = true;

 

// turn collision detection off so things don't blow up

factory.detectCollision = false;

 

// set colors

var green = RGB(108, 255, 108);

var white = RGB(200, 200, 200);

 

// choose some default material

//Material (density, springConstant, dampingConstant, staticFriction, dynamicFriction, thresholdVelocity);

var mat = Material(1e-7, .0001, .00001, 1, 1);

factory.material = mat ;

 

var spngCnst = .00000001; // set spring constant

var  dmpCnst = .0000001; // set damper constant

 

// build array of balls

var width = 40; // enter number of balls for array width

var depth = width; // enter number of balls for array depth

var spacing = 20; // enter spacing between balls

var ball = "";

 

// position camera in middle of array

// consider camera to be hovering over array looking down on x z plane

scene.camera = {width*spacing/2,15*width,depth*spacing/2};

// point camera down at middle of array

scene.lookAt = {width*spacing/2, 0, depth*spacing/2};

 

// build 2D array of spheres

var s = array();

for (var x=0; x < width; x++) {

   s.append(array());

      for (var z=0; z < depth; z++) {

         var ball = Sphere(2, {x*spacing,0,z*spacing});

         // color every 5th ball on z & x axis

         if((x+1)%5 == 1 || (z+1)%5 == 1){

            ball.color = green;

         }else{

            ball.color = white;

         }

         s[x].append(ball);

         // set all outer edge balls as stationary

         if (x==0||x==width-1||z==0||z==depth-1){

            ball.static = true;

         }

      }

}

// build array of springs and dampers attaching to balls on x axis

var spx = array();

var dpx = array();

var dmpr = "";

var sprng = "";

for (x=0; x < width-1; x++) {

   spx.append(array());

   dpx.append(array());

      for (var z=0; z < depth; z++) {

         sprng = Spring(s[x][z],{0,0,0},s[x+1][z],{0,0,0});

         sprng.springConstant = spngCnst;

         spx[x].append(sprng);

         dmpr = Damper(s[x][z],{0,0,0},s[x+1][z],{0,0,0});

         dmpr.damperConstant = dmpCnst;

         // color every 5th damper on x axis

         if((z+1)%5 == 1){

            dmpr.color = green;

         }else{

            dmpr.color = white;

         }

         dpx[x].append(dmpr);

      }//z

}//x

 

// build array of springs and dampers attaching to balls on z axis

var spz = array();

var dpz = array();

for (x=0; x < width; x++) {

   spz.append(array());

   dpz.append(array());

      for (var z=0; z < depth-1; z++) {

         var sprng = Spring(s[x][z],{0,0,0},s[x][z+1],{0,0,0});

         sprng.springConstant = spngCnst;

         spz[x].append(sprng);

         var dmpr = Damper(s[x][z],{0,0,0},s[x][z+1],{0,0,0});

         // color every 5th damper on z axis

         dmpr.damperConstant = dmpCnst;

         if((x+1)%5 == 1){

            dmpr.color = green;

         }else{

            dmpr.color = white;

         }

         dpz[x].append(dmpr);

      }//z

}//x

 

 

// make particle in middle of array

var imp = 0.8; // enter implode ratio

var rad = 10; // enter radius of particle (by number of spacings)

var lower = ceil((width-1)/2 - rad); // calc lower limit of array index

var upper = ceil((width-1)/2 + rad+1); // calc upper limit of array index

var center = {spacing*(width-1)/2, 0, spacing*(depth-1)/2}; // calc center location of array

var centerX = spacing*(width-1)/2;

var centerZ = spacing*(depth-1)/2;

 

for (x=lower; x<upper; x++) {

  for (var z=lower; z<upper; z++) {

      if( norm(s[x][z].position-center) <= rad*spacing ){ // only move if balls are within radius (round off corners)

         s[x][z].move( (centerX-x*spacing)*(imp), 0, (centerZ-z*spacing)*(imp) );

         s[x][z].static = true;

      }

   }//z

}//x

 

// simulate scene

WaitFrame();

simulator.stepsize = .1;

while (simulator.time < 100) {

   simulator.run(1);

   WaitFrame();

};

   

Peter C.M. Hahn C.E.T.