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