function lerp(a, b, p) { return (b - a) * p + a; } var canvas = document.getElementById("scratch"); // canvas dimensions var width = parseInt(canvas.style.width); var height = parseInt(canvas.style.height); // retina var dpr = window.devicePixelRatio || 1; canvas.width = width * dpr; canvas.height = height * dpr; canvas.getContext("2d").scale(dpr, dpr); // simulation var sim = new VerletJS(width, height, canvas); sim.friction = 1; sim.highlightColor = "#fff"; //sim.gravity = new Vec2(0, 0); // entities var min = Math.min(width, height) * 0.5; var segments = 20; var cloth = sim.cloth(new Vec2(width / 2, height / 3), min, min, segments, 6, 0.9); cloth.drawConstraints = function (ctx, composite) { var stride = min / segments; var x, y; for (y = 1; y < segments; ++y) { for (x = 1; x < segments; ++x) { ctx.beginPath(); var i1 = (y - 1) * segments + x - 1; var i2 = (y) * segments + x; ctx.moveTo(cloth.particles[i1].pos.x, cloth.particles[i1].pos.y); ctx.lineTo(cloth.particles[i1 + 1].pos.x, cloth.particles[i1 + 1].pos.y); ctx.lineTo(cloth.particles[i2].pos.x, cloth.particles[i2].pos.y); ctx.lineTo(cloth.particles[i2 - 1].pos.x, cloth.particles[i2 - 1].pos.y); var off = cloth.particles[i2].pos.x - cloth.particles[i1].pos.x; off += cloth.particles[i2].pos.y - cloth.particles[i1].pos.y; off *= 0.25; var coef = Math.round((Math.abs(off) / stride) * 255); if (coef > 255) coef = 255; ctx.fillStyle = "rgba(" + coef + ",0," + (255 - coef) + "," + lerp(0.25, 1, coef / 255.0) + ")"; ctx.fill(); ctx.closePath(); } } var c; for (c in composite.constraints) { if (composite.constraints[c] instanceof PinConstraint) { var point = composite.constraints[c]; ctx.beginPath(); ctx.arc(point.pos.x, point.pos.y, 1.2, 0, 2 * Math.PI); ctx.fillStyle = "rgba(255,255,255,1)"; ctx.fill(); ctx.closePath(); } } } cloth.drawParticles = function (ctx, composite) { // do nothing for particles } // animation loop var legIndex = 0; var loop = function () { sim.frame(16); sim.draw(); requestAnimFrame(loop); }; loop();
<canvas id="scratch" style="width: 800px; height: 500px; background: #000;"></canvas>