PositionSolverManifold
class
Hide inherited
class PositionSolverManifold {
Vector2 normal;
Vector2 point;
num separation;
/** Pooling */
Vector2 pointA;
Vector2 pointB;
Vector2 temp;
Vector2 planePoint;
Vector2 clipPoint;
PositionSolverManifold() :
normal = new Vector2.zero(),
point = new Vector2.zero(),
separation = 0,
// Initialize pool variables.
pointA = new Vector2.zero(),
pointB = new Vector2.zero(),
temp = new Vector2.zero(),
planePoint = new Vector2.zero(),
clipPoint = new Vector2.zero();
void initialize(ContactConstraint cc, int index) {
assert(cc.pointCount > 0);
switch (cc.type) {
case ManifoldType.CIRCLES:
cc.bodyA.getWorldPointToOut(cc.localPoint, pointA);
cc.bodyB.getWorldPointToOut(cc.points[0].localPoint, pointB);
if (MathBox.distanceSquared(pointA, pointB) >
Settings.EPSILON * Settings.EPSILON){
normal.setFrom(pointB).sub(pointA);
normal.normalize();
} else {
normal.setValues(1.0, 0.0);
}
point.setFrom(pointA).add(pointB).scale(.5);
temp.setFrom(pointB).sub(pointA);
separation = temp.dot(normal) - cc.radius;
break;
case ManifoldType.FACE_A:
cc.bodyA.getWorldVectorToOut(cc.localNormal, normal);
cc.bodyA.getWorldPointToOut(cc.localPoint, planePoint);
cc.bodyB.getWorldPointToOut(cc.points[index].localPoint,
clipPoint);
temp.setFrom(clipPoint).sub(planePoint);
separation = temp.dot(normal) - cc.radius;
point.setFrom(clipPoint);
break;
case ManifoldType.FACE_B:
cc.bodyB.getWorldVectorToOut(cc.localNormal, normal);
cc.bodyB.getWorldPointToOut(cc.localPoint, planePoint);
cc.bodyA.getWorldPointToOut(cc.points[index].localPoint, clipPoint);
temp.setFrom(clipPoint).sub(planePoint);
separation = temp.dot(normal) - cc.radius;
point.setFrom(clipPoint);
// Ensure normal points from A to B
normal.negate();
break;
}
}
}
Constructors
Code
new PositionSolverManifold () #
PositionSolverManifold() :
normal = new Vector2.zero(),
point = new Vector2.zero(),
separation = 0,
// Initialize pool variables.
pointA = new Vector2.zero(),
pointB = new Vector2.zero(),
temp = new Vector2.zero(),
planePoint = new Vector2.zero(),
clipPoint = new Vector2.zero();
Methods
void initialize(ContactConstraint cc, int index) {
assert(cc.pointCount > 0);
switch (cc.type) {
case ManifoldType.CIRCLES:
cc.bodyA.getWorldPointToOut(cc.localPoint, pointA);
cc.bodyB.getWorldPointToOut(cc.points[0].localPoint, pointB);
if (MathBox.distanceSquared(pointA, pointB) >
Settings.EPSILON * Settings.EPSILON){
normal.setFrom(pointB).sub(pointA);
normal.normalize();
} else {
normal.setValues(1.0, 0.0);
}
point.setFrom(pointA).add(pointB).scale(.5);
temp.setFrom(pointB).sub(pointA);
separation = temp.dot(normal) - cc.radius;
break;
case ManifoldType.FACE_A:
cc.bodyA.getWorldVectorToOut(cc.localNormal, normal);
cc.bodyA.getWorldPointToOut(cc.localPoint, planePoint);
cc.bodyB.getWorldPointToOut(cc.points[index].localPoint,
clipPoint);
temp.setFrom(clipPoint).sub(planePoint);
separation = temp.dot(normal) - cc.radius;
point.setFrom(clipPoint);
break;
case ManifoldType.FACE_B:
cc.bodyB.getWorldVectorToOut(cc.localNormal, normal);
cc.bodyB.getWorldPointToOut(cc.localPoint, planePoint);
cc.bodyA.getWorldPointToOut(cc.points[index].localPoint, clipPoint);
temp.setFrom(clipPoint).sub(planePoint);
separation = temp.dot(normal) - cc.radius;
point.setFrom(clipPoint);
// Ensure normal points from A to B
normal.negate();
break;
}
}