verlet integration

by jmcjc5u

HTML

<div id="info">Verlet Integration
</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js"></script>

CSS

#info {
  position: absolute;
  top: 0px;
  width: 100%;
  padding: 10px;
  text-align: center;
  color: #ffff00
}

body {
  overflow: hidden;
}

JavaScript

var camera, scene, renderer;
const G = 10;
const H = 25;
var elapsedT = 0;
var exact = {
  p: new THREE.Vector3(-20, 0, 0),
  p0: new THREE.Vector3(-20, 0, 0),
  v: new THREE.Vector3(),
  v0: new THREE.Vector3(),
  tHit: 0, // time of last collision,
  ball: new THREE.Mesh(new THREE.CircleGeometry(3, 20), new THREE.MeshBasicMaterial({
    color: 'red'
  }))
}

var euler = {
  p: new THREE.Vector3(20, 0, 0),
  v: new THREE.Vector3(),
  ball: new THREE.Mesh(new THREE.CircleGeometry(3, 20), new THREE.MeshBasicMaterial({
    color: 'green'
  }))
}

var verlet = {
  p: new THREE.Vector3(),
  p0: new THREE.Vector3(),
  ball: new THREE.Mesh(new THREE.CircleGeometry(3, 20), new THREE.MeshBasicMaterial({
    color: 'cyan'
  }))

}
var force = new THREE.Vector3(0, -10, 0)
var tmp;
var count = 1;


init();
animate();

function init() {
  renderer = new THREE.WebGLRenderer({
    antialias: true
  });


  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.setClearColor(0x888888);
  document.body.appendChild(renderer.domElement);

  scene = new THREE.Scene();
  camera = new THREE.OrthographicCamera(-50, 50, 50, -50, -10, 100);
  camera.position.z = 10;

  ball = new THREE.Mesh(new THREE.CircleGeometry(3, 20), new THREE.MeshBasicMaterial({
    color: 'red'
  }))
  //  scene.add(ball)

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

  let wall = new THREE.Mesh(new THREE.PlaneGeometry(100, 50), new THREE.MeshBasicMaterial({
    color: 0x128834
  }))
  scene.add(wall)
  wall.position.y = -50

  window.addEventListener('resize', onWindowResize, false);

  force = new THREE.Vector3(0, -10, 0)

  tmp = new THREE.Vector3()

  scene.add(exact.ball, verlet.ball, euler.ball)
}

function onWindowResize() {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
}


// exact: 
// y(t) = y0 + v(0)t - 0.5*g*t*t
// v(t) = v(0) - gt
// ground at y = -25


function animate() {
 ...