#

API Docs for: 0.6.1
Show: Inherited Protected Private Deprecated

# File: src/equations/RotationalEquation.js

    module.exports = RotationalEquation;

    var Vec3 = require('../math/Vec3');
    var Mat3 = require('../math/Mat3');
    var Equation = require('./Equation');

    /**
     * Rotational constraint. Works to keep the local vectors orthogonal to each other in world space.
     * @class RotationalEquation
     * @constructor
     * @author schteppe
     * @param {Body} bodyA
     * @param {Body} bodyB
     * @param {Vec3} [options.axisA]
     * @param {Vec3} [options.axisB]
     * @param {number} [options.maxForce]
     * @extends Equation
     */
    function RotationalEquation(bodyA, bodyB, options){
        options = options || {};
        var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;

        Equation.call(this,bodyA,bodyB,-maxForce, maxForce);

        this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1, 0, 0);
        this.axisB = options.axisB ? options.axisB.clone() : new Vec3(0, 1, 0);

        this.maxAngle = Math.PI / 2;
    }

    RotationalEquation.prototype = new Equation();
    RotationalEquation.prototype.constructor = RotationalEquation;

    var tmpVec1 = new Vec3();
    var tmpVec2 = new Vec3();

    RotationalEquation.prototype.computeB = function(h){
        var a = this.a,
            b = this.b,

            ni = this.axisA,
            nj = this.axisB,

            nixnj = tmpVec1,
            njxni = tmpVec2,

            GA = this.jacobianElementA,
            GB = this.jacobianElementB;

        // Caluclate cross products
        ni.cross(nj, nixnj);
        nj.cross(ni, njxni);

        // g = ni * nj
        // gdot = (nj x ni) * wi + (ni x nj) * wj
        // G = [0 njxni 0 nixnj]
        // W = [vi wi vj wj]
        GA.rotational.copy(njxni);
        GB.rotational.copy(nixnj);

        var g = Math.cos(this.maxAngle) - ni.dot(nj),
            GW = this.computeGW(),
            GiMf = this.computeGiMf();

        var B = - g * a - GW * b - h * GiMf;

        return B;
    };