three.js + ammo.js + jsfiddle = physics playground (v2)

Original Example by Eric Mixon and "fiddlization" and various cleanups and enhancements by strelz and Jeremy Jones

by loleg

HTML

<script src="http://bigcat.cs.usm.edu/~emixon/sandbox/physics/js/ammo.js"></script>
<script src="https://github.com/mrdoob/three.js/raw/master/build/Three.js"></script>
<script src="https://github.com/mrdoob/three.js/raw/master/examples/js/RequestAnimationFrame.js"></script>
<script src="https://github.com/mrdoob/three.js/raw/master/examples/js/Stats.js"></script>
<script src="https://github.com/mrdoob/three.js/raw/master/examples/js/Detector.js"></script>

<div style="position:absolute;left:10px;top:10px;z-index:2000;font-size:100%"><b>Three.js + ammo.js + jsfiddle = physics playground</b><i> ...enjoy</i><br>point and dbl-click to fire block at wall<br>mouse keys to move view</div>

JavaScript

//PHYSICS SECTION
//ammo.js
// try changing physical properties
var mygravity = -25;
var mytargetmass = 1;
var myprojectilemass = 10;
var myprojectiletype = "box"; //"sphere" //"cone"  
var myprojectilespeed = 50;

var NUM = 25;
var NUMRANGE = [];
for (var i = 0; i <= NUM; i++)
NUMRANGE[i] = i + 1;
// Bullet-interfacing code
var collisionConfiguration = new Ammo.btDefaultCollisionConfiguration();
var dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);
var overlappingPairCache = new Ammo.btDbvtBroadphase();
var solver = new Ammo.btSequentialImpulseConstraintSolver();
var dynamicsWorld = new Ammo.btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
dynamicsWorld.setGravity(new Ammo.btVector3(0, mygravity, 0));

var groundShape = new Ammo.btBoxShape(new Ammo.btVector3(1000, 50, 1000));

var bodies = [];

var groundTransform = new Ammo.btTransform();
groundTransform.setIdentity();
groundTransform.setOrigin(new Ammo.btVector3(0, -50, 0));

function addStaticBody(shape, trans) {
    var mass = 0;
    var localInertia = new Ammo.btVector3(0, 0, 0);
    var myMotionState = new Ammo.btDefaultMotionState(trans);
    var rbInfo = new Ammo.btRigidBodyConstructionInfo(0, myMotionState, shape, localInertia);
    var body = new Ammo.btRigidBody(rbInfo);

    dynamicsWorld.addRigidBody(body);
    bodies.push(body);
}

addStaticBody(groundShape, groundTransform);        

NUMRANGE.forEach(function(i) {
    if((myprojectiletype == "sphere") &&(i==1)){
       var boxShape = new Ammo.btSphereShape(2);
    }
    else if((myprojectiletype == "cone") &&(i==1)){
       var boxShape = new Ammo.btConeShape(1,2);
    }
    else{        
       var boxShape = new Ammo.btBoxShape(new Ammo.btVector3(1, 1, 1));
    }
    var startTransform = new Ammo.btTransform();
    startTransform.setIdentity();
    if (i == 1) var mass = myprojectilemass;
    else
    mass = mytargetmass;
    var localInertia = new Ammo.btVector3(0, 0, 0);
   ...