PositionSolverManifold
class
Hide inherited
class PositionSolverManifold {
Vector normal;
Vector point;
num separation;
/** Pooling */
Vector pointA;
Vector pointB;
Vector temp;
Vector planePoint;
Vector clipPoint;
PositionSolverManifold() :
normal = new Vector(),
point = new Vector(),
separation = 0,
// Initialize pool variables.
pointA = new Vector(),
pointB = new Vector(),
temp = new Vector(),
planePoint = new Vector(),
clipPoint = new Vector();
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).subLocal(pointA);
normal.normalize();
} else {
normal.setCoords(1.0, 0.0);
}
point.setFrom(pointA).addLocal(pointB).mulLocal(.5);
temp.setFrom(pointB).subLocal(pointA);
separation = Vector.dot(temp, 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).subLocal(planePoint);
separation = Vector.dot(temp, 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).subLocal(planePoint);
separation = Vector.dot(temp, normal) - cc.radius;
point.setFrom(clipPoint);
// Ensure normal points from A to B
normal.negateLocal();
break;
}
}
}
Constructors
Code
new PositionSolverManifold () #
PositionSolverManifold() :
normal = new Vector(),
point = new Vector(),
separation = 0,
// Initialize pool variables.
pointA = new Vector(),
pointB = new Vector(),
temp = new Vector(),
planePoint = new Vector(),
clipPoint = new Vector();
Methods
Code
void initialize (ContactConstraint cc, int index) #
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).subLocal(pointA);
normal.normalize();
} else {
normal.setCoords(1.0, 0.0);
}
point.setFrom(pointA).addLocal(pointB).mulLocal(.5);
temp.setFrom(pointB).subLocal(pointA);
separation = Vector.dot(temp, 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).subLocal(planePoint);
separation = Vector.dot(temp, 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).subLocal(planePoint);
separation = Vector.dot(temp, normal) - cc.radius;
point.setFrom(clipPoint);
// Ensure normal points from A to B
normal.negateLocal();
break;
}
}