Verlet integration

with constraints

by jmchen

HTML

<div id="info">Verlet Integration</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/three.js/r70/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;
var particles = [];
var constraints = [];

var f_damp = 0.01;

var Particle = function (mymesh, pos0) {
    this.pos = new THREE.Vector3();
    if (pos0 !== undefined) this.pos.copy(pos0);
    this.pos_old = this.pos.clone();
    this.force = new THREE.Vector3();
    this.mesh = mymesh; // threejs mesh
    //// for anchoring particles
    this.anchor = false;
    this.initpos = this.pos.clone();
};

Particle.prototype.update = function (dt) {
    var tmp = this.pos.clone();
    tmp.multiplyScalar(2 - f_damp);
    tmp.sub(this.pos_old.clone().multiplyScalar(1 - f_damp));
    tmp.add(this.force.clone().multiplyScalar(dt * dt));
    this.pos_old.copy(this.pos);
    this.pos.copy(tmp);
};

Constraint = function (p1, p2) {
    var tmp = p1.pos.clone();
    this.length = tmp.sub(p2.pos).length();
    this.p1 = p1;
    this.p2 = p2;
    // this.mesh = ;
}

Particle.prototype.accumForce = function () {
    this.force.copy(new THREE.Vector3(0, -50, 0));
    // mouse spring ...
};

function reflect(n, v) {
    var tmp = n.clone();
    tmp.multiplyScalar(tmp.dot(v) * 2);
    return v.clone().sub(tmp);
}

function buildLine(c) {
    var geometry = new THREE.Geometry;
    geometry.vertices.push(c.p1.pos.clone());
    geometry.vertices.push(c.p2.pos.clone());
    var line = new THREE.Line(geometry,
    new THREE.LineBasicMaterial());
    c.mesh = line;
    scene.add(line);
}

function initPBM() {
    var geometry = new THREE.SphereGeometry(0.5);
    var material = new THREE.MeshBasicMaterial({
        color: 0xff0000
    });

    var mesh = new THREE.Mesh(geometry, material);

    // particles
    var p1mesh = mesh.clone();
    scene.add(p1mesh);
    var p1 = new Particle(p1mesh, new THREE.Vector3(0, 10, 0));
    particles.push(p1);
    p1.anchor = true;

    var p2mesh = mesh.clone();
    scene.add(p2mesh);
    var p2 = new Particle(p2mesh, new THREE.Vector3(-3, 8, 0));
    particles.push(p2);

    var p3mesh = mesh.clone();
   ...