| 184 | } |
| 185 | |
| 186 | export function applySpringStep(pos: Vec3, target: Vec3, vel: Vec3 | null | undefined, dt: number, config: ISpringConfig) { |
| 187 | // default to critically damped |
| 188 | let friction = config.friction ?? 2 * Math.sqrt(config.mass * config.tension); |
| 189 | let dtS = dt / 1000; |
| 190 | vel = vel ?? new Vec3(); |
| 191 | let dist = pos.sub(target); |
| 192 | let springExtra = dist.lenSq() === 0.0 ? new Vec3() : dist.normalize().mul(config.extra ?? 0); |
| 193 | let springF = (dist.add(springExtra)).mul(-config.tension); |
| 194 | let dampF = vel.mul(-friction); |
| 195 | let accel = springF.add(dampF).mul(1.0 / config.mass); |
| 196 | |
| 197 | vel = vel.add(accel.mul(dtS)); |
| 198 | pos = pos.add(vel.mul(dtS)); |
| 199 | return { pos, vel }; |
| 200 | } |