同一种用法
sim.tire(new Vec2(200,50), 50, 30, 0.3, 0.9);
官方实现
VerletJS.prototype.tire = function(origin, radius, segments, spokeStiffness, treadStiffness) {
var stride = (2*Math.PI)/segments;
var i;
var composite = new this.Composite();
// particles
for (i=0;i<segments;++i) {
var theta = i*stride;
composite.particles.push(new Particle(new Vec2(origin.x + Math.cos(theta)*radius, origin.y + Math.sin(theta)*radius)));
}
var center = new Particle(origin);
composite.particles.push(center);
// constraints
for (i=0;i<segments;++i) {
composite.constraints.push(new DistanceConstraint(composite.particles[i], composite.particles[(i+1)%segments], treadStiffness));
composite.constraints.push(new DistanceConstraint(composite.particles[i], center, spokeStiffness))
composite.constraints.push(new DistanceConstraint(composite.particles[i], composite.particles[(i+5)%segments], treadStiffness));
}
this.composites.push(composite);
return composite;
}
用上 AngleConstraint
VerletJS.prototype.tire = function(origin, radius, segments, spokeStiffness, treadStiffness) {
var stride = (2*Math.PI)/segments;
var i;
var composite = new this.Composite();
// particles
for (i=0;i<segments;++i) {
var theta = i*stride;
composite.particles.push(new Particle(new Vec2(origin.x + Math.cos(theta)*radius, origin.y + Math.sin(theta)*radius)));
}
// constraints
for (i=0;i<segments;++i) {
composite.constraints.push(new DistanceConstraint(composite.particles[i], composite.particles[(i+1)%segments], treadStiffness));
composite.constraints.push(new AngleConstraint(composite.particles[i], composite.particles[(i+1)%segments], composite.particles[(i+2)%segments], treadStiffness));
}
this.composites.push(composite);
return composite;
}