新增shapecollision 用于计算多边形碰撞

This commit is contained in:
yhh
2020-06-12 20:24:51 +08:00
parent da5a1a0c79
commit 246e9a9511
18 changed files with 714 additions and 22 deletions

View File

@@ -5,7 +5,7 @@ class Composite {
public drawParticles: boolean = true;
public drawConstraints: boolean = true;
public particles: Particle[] = [];
public collidesWithLayers = -1;
public collidesWithLayers = Physics.allLayers;
/**
* 处理解决所有约束条件

View File

@@ -14,7 +14,8 @@ class VerletWorld {
private _composites: Composite[] = [];
private _fixedDeltaTimeSq: number;
private static _colliders = new Array(4);
private static _colliders: Collider[] = new Array(4);
private _tempCircle: Circle = new Circle(1);
constructor(simulationBounds?: Rectangle){
this.simulationBounds = simulationBounds;
@@ -43,8 +44,8 @@ class VerletWorld {
this.constrainParticleToBounds(p);
}
// if (p.collidesWithColliders)
// this.handleCollisions(p, -1);
if (p.collidesWithColliders)
this.handleCollisions(p, composite.collidesWithLayers);
}
}
}
@@ -52,7 +53,26 @@ class VerletWorld {
private handleCollisions(p: Particle, collidesWithLayers: number){
let collidedCount = Physics.overlapCircleAll(p.position, p.radius, VerletWorld._colliders, collidesWithLayers);
// handle
for (let i = 0; i < collidedCount; i ++){
let collider = VerletWorld._colliders[i];
if (collider.isTrigger)
continue;
if (p.radius < 2){
let collisionResult = collider.shape.pointCollidesWithShape(p.position);
if (collisionResult){
p.position = Vector2.subtract(p.position, collisionResult.minimumTranslationVector);
}
}else{
this._tempCircle.radius = p.radius;
this._tempCircle.position = p.position;
let collisionResult = this._tempCircle.collidesWithShape(collider.shape);
if (collisionResult){
p.position = Vector2.subtract(p.position, collisionResult.minimumTranslationVector);
}
}
}
}
private constrainParticleToBounds(p: Particle){