#

API Docs for: 0.6.1
Show: Inherited Protected Private Deprecated

# File: src/constraints/PointToPointConstraint.js

    module.exports = PointToPointConstraint;

    var Constraint = require('./Constraint');
    var ContactEquation = require('../equations/ContactEquation');
    var Vec3 = require('../math/Vec3');

    /**
     * Connects two bodies at given offset points.
     * @class PointToPointConstraint
     * @extends Constraint
     * @constructor
     * @param {Body} bodyA
     * @param {Vec3} pivotA The point relative to the center of mass of bodyA which bodyA is constrained to.
     * @param {Body} bodyB Body that will be constrained in a similar way to the same point as bodyA. We will therefore get a link between bodyA and bodyB. If not specified, bodyA will be constrained to a static point.
     * @param {Vec3} pivotB See pivotA.
     * @param {Number} maxForce The maximum force that should be applied to constrain the bodies.
     *
     * @example
     *     var bodyA = new Body({ mass: 1 });
     *     var bodyB = new Body({ mass: 1 });
     *     bodyA.position.set(-1, 0, 0);
     *     bodyB.position.set(1, 0, 0);
     *     bodyA.addShape(shapeA);
     *     bodyB.addShape(shapeB);
     *     world.addBody(bodyA);
     *     world.addBody(bodyB);
     *     var localPivotA = new Vec3(1, 0, 0);
     *     var localPivotB = new Vec3(-1, 0, 0);
     *     var constraint = new PointToPointConstraint(bodyA, localPivotA, bodyB, localPivotB);
     *     world.addConstraint(constraint);
     */
    function PointToPointConstraint(bodyA,pivotA,bodyB,pivotB,maxForce){
        Constraint.call(this,bodyA,bodyB);

        maxForce = typeof(maxForce) !== 'undefined' ? maxForce : 1e6;

        /**
         * Pivot, defined locally in bodyA.
         * @property {Vec3} pivotA
         */
        this.pivotA = pivotA ? pivotA.clone() : new Vec3();

        /**
         * Pivot, defined locally in bodyB.
         * @property {Vec3} pivotB
         */
        this.pivotB = pivotB ? pivotB.clone() : new Vec3();

        /**
         * @property {ContactEquation} equationX
         */
        var x = this.equationX = new ContactEquation(bodyA,bodyB);

        /**
         * @property {ContactEquation} equationY
         */
        var y = this.equationY = new ContactEquation(bodyA,bodyB);

        /**
         * @property {ContactEquation} equationZ
         */
        var z = this.equationZ = new ContactEquation(bodyA,bodyB);

        // Equations to be fed to the solver
        this.equations.push(x, y, z);

        // Make the equations bidirectional
        x.minForce = y.minForce = z.minForce = -maxForce;
        x.maxForce = y.maxForce = z.maxForce =  maxForce;

        x.ni.set(1, 0, 0);
        y.ni.set(0, 1, 0);
        z.ni.set(0, 0, 1);
    }
    PointToPointConstraint.prototype = new Constraint();

    PointToPointConstraint.prototype.update = function(){
        var bodyA = this.bodyA;
        var bodyB = this.bodyB;
        var x = this.equationX;
        var y = this.equationY;
        var z = this.equationZ;

        // Rotate the pivots to world space
        bodyA.quaternion.vmult(this.pivotA,x.ri);
        bodyB.quaternion.vmult(this.pivotB,x.rj);

        y.ri.copy(x.ri);
        y.rj.copy(x.rj);
        z.ri.copy(x.ri);
        z.rj.copy(x.rj);
    };