修复verlet报错

This commit is contained in:
yhh
2021-07-02 20:59:44 +08:00
parent 85bdd97d48
commit 13a001c258
11 changed files with 73 additions and 56 deletions

View File

@@ -1,8 +1,8 @@
///<reference path="./Constraint.ts" />
module es {
export class AngleConstraint extends Constraint {
public stiffness: number;
public angleInRadius: number;
public stiffness: number = 0;
public angleInRadius: number = 0;
_particleA: Particle;
_centerParticle: Particle;

View File

@@ -1,9 +1,9 @@
module es {
export class DistanceConstraint extends Constraint {
public stiffness: number;
public restingDistance: number;
public stiffness: number = 0;
public restingDistance: number = 0;
public tearSensitivity = Number.POSITIVE_INFINITY;
public shouldApproximateCollisionsWithPoints: boolean;
public shouldApproximateCollisionsWithPoints: boolean = false;
public totalPointsToApproximateCollisionsWith = 5;
_particleOne: Particle;
_particleTwo: Particle;
@@ -20,12 +20,12 @@ module es {
if (distance > -1)
this.restingDistance = distance;
else
this.restingDistance = Vector2.distance(first.position, second.position);
this.restingDistance = first.position.distance(second.position);
}
public static create(a: Particle, center: Particle, c: Particle, stiffness: number, angleInDegrees: number) {
const aToCenter = Vector2.distance(a.position, center.position);
const cToCenter = Vector2.distance(c.position, center.position);
const aToCenter = a.position.distance(center.position);
const cToCenter = c.position.distance(center.position);
const distance = Math.sqrt(aToCenter * aToCenter + cToCenter * cToCenter - (2 * aToCenter * cToCenter * Math.cos(angleInDegrees * MathHelper.Deg2Rad)));
return new DistanceConstraint(a, c, stiffness, distance);
@@ -48,7 +48,7 @@ module es {
public solve(): void {
const diff = this._particleOne.position.sub(this._particleTwo.position);
const d = diff.magnitude();
const d = diff.distance();
const difference = (this.restingDistance - d) / d;
if (d / this.restingDistance > this.tearSensitivity) {
@@ -77,7 +77,7 @@ module es {
const maxY = Math.max(this._particleOne.position.y, this._particleTwo.position.y);
DistanceConstraint._polygon.bounds = Rectangle.fromMinMax(minX, minY, maxX, maxY);
let midPoint: Vector2;
let midPoint: Vector2 = Vector2.zero;
this.preparePolygonForCollisionChecks(midPoint);
const colliders = Physics.boxcastBroadphase(DistanceConstraint._polygon.bounds, collidesWithLayers);

View File

@@ -1,13 +1,13 @@
module es {
export class Particle {
public position: Vector2;
public lastPosition: Vector2;
public position: Vector2 = Vector2.zero;
public lastPosition: Vector2 = Vector2.zero;
public mass = 1;
public radius: number;
public radius: number = 0;
public collidesWithColliders: boolean = true;
public isPinned: boolean;
public acceleration: Vector2;
public pinnedPosition: Vector2;
public isPinned: boolean = false;
public acceleration: Vector2 = Vector2.zero;
public pinnedPosition: Vector2 = Vector2.zero;
constructor(position: {x: number, y: number}) {
this.position = new Vector2(position.x, position.y);

View File

@@ -1,6 +1,6 @@
module es {
export class VerletWorld {
public gravity: Vector2 = new Vector2(0, 980);
public gravity: Vector2 = new Vector2(0, -980);
public constraintIterations = 3;
public maximumStepIterations = 5;
public simulationBounds: Rectangle;
@@ -11,14 +11,16 @@ module es {
public static _colliders: Collider[] = [];
_tempCircle: Circle = new Circle(1);
_leftOverTime: number;
_leftOverTime: number = 0;
_fixedDeltaTime: number = 1 / 60;
_iterationSteps: number;
_fixedDeltaTimeSq: number;
_iterationSteps: number = 0;
_fixedDeltaTimeSq: number = 0;
onHandleDrag: Function;
constructor(simulationBounds: Rectangle = null) {
this.simulationBounds = simulationBounds;
this._fixedDeltaTime = Math.pow(this._fixedDeltaTime, 2);
this._fixedDeltaTimeSq = Math.pow(this._fixedDeltaTime, 2);
}
public update() {
@@ -122,7 +124,8 @@ module es {
}
handleDragging() {
if (this.onHandleDrag)
this.onHandleDrag();
}
public getNearestParticle(position: Vector2) {