修复verlet报错
This commit is contained in:
@@ -67,13 +67,13 @@ module es {
|
||||
* @param results
|
||||
* @param layerMask
|
||||
*/
|
||||
public static overlapCircleAll(center: Vector2, randius: number, results: any[], layerMask = -1) {
|
||||
if (results.length == 0) {
|
||||
console.warn("传入了一个空的结果数组。不会返回任何结果");
|
||||
return;
|
||||
}
|
||||
|
||||
return this._spatialHash.overlapCircle(center, randius, results, layerMask);
|
||||
public static overlapCircleAll(center: Vector2, radius: number, results: Collider[], layerMask: number = this.allLayers) {
|
||||
return this._spatialHash.overlapCircle(
|
||||
center,
|
||||
radius,
|
||||
results,
|
||||
layerMask
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -263,13 +263,13 @@ module es {
|
||||
* @param layerMask
|
||||
*/
|
||||
public overlapCircle(circleCenter: Vector2, radius: number, results: Collider[], layerMask): number {
|
||||
let bounds = new Rectangle(circleCenter.x - radius, circleCenter.y - radius, radius * 2, radius * 2);
|
||||
const bounds = new Rectangle(circleCenter.x - radius, circleCenter.y - radius, radius * 2, radius * 2);
|
||||
|
||||
this._overlapTestCircle.radius = radius;
|
||||
this._overlapTestCircle.position = circleCenter.clone();
|
||||
this._overlapTestCircle.position = circleCenter;
|
||||
|
||||
let resultCounter = 0;
|
||||
let potentials = this.aabbBroadphase(bounds, null, layerMask);
|
||||
const potentials = this.aabbBroadphase(bounds, null, layerMask);
|
||||
for (let collider of potentials) {
|
||||
if (collider instanceof BoxCollider) {
|
||||
if (collider.shape.overlaps(this._overlapTestCircle)) {
|
||||
@@ -291,7 +291,7 @@ module es {
|
||||
}
|
||||
|
||||
// 如果我们所有的结果数据有了则返回
|
||||
if (resultCounter == results.length)
|
||||
if (resultCounter === results.length)
|
||||
return resultCounter;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user