Foamy Ether - A Framework for a
Theory Of Everything

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

 

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

// emitPhoton.thd

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

// Part of its outer shell rotates,

// which causes the emission of a photon.

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

 

// set background color

scene.backColor=RGB(92,92,98);

 

// 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 ;

factory.detectCollision = false;

 

// use degrees as metric for angles

factory.useDegrees = true;

 

var spngCnst = .00000001; // set spring constant

var  dmpCnst = .0000001; // set damper constant

 

// build array of balls

var width = 71; // 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,5*width,depth*spacing/2};

// point camera down at middle of array

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

 

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});

         ball.visible = false;

         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);

      }

}

// 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});

         dmpr.damperConstant = dmpCnst;

         // color every 5th damper on z axis

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

            dmpr.color = green;

         }else{

            dmpr.color = white;

         }

         dpz[x].append(dmpr);

      }

}

 

// make particle in middle of array

var imp = 0.8; // enter implode ratio

var rad = 9; // 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)

         //print("x=", x, " z=", z, " . ", s[x][z].position, " . ", norm(s[x][z].position-center), newline);

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

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

      }

   }//z

}//x

 

// make red line

for (var line=width/2; line<width-1; line++){

   dpx[line][depth/2].color = RGB(255, 0, 0);

}

 

// simulate scene, implode

simulator.stepsize = .5;

while (simulator.time < 250) {

   simulator.run(1);

// WaitFrame();

}

 

// pause for ten frames

for (var f=0; f<10; f++){

   WaitFrame();

}

 

//rotate opposite

var rot = -45; // enter degrees to rotate

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

   for (var z=lower+rad/2; z<upper-rad/2; z++) { // rotate 1/4 of particle

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

         s[x][z].rotateAround({centerX , 0, centerZ},{0,1,0},rot);

      }

   }//z

}//x

 

 

// simulate scene

simulator.stepsize = .1;

simulator.resetTime();

while (simulator.time < 500) {

   simulator.run(10);

   WaitFrame();

};

   

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