<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>src/objects/Spring.js - cannon</title> <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css"> <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css"> <link rel="stylesheet" href="../assets/css/main.css" id="site_styles"> <link rel="icon" href="../assets/favicon.ico"> <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script> </head> <body class="yui3-skin-sam"> <div id="doc"> <div id="hd" class="yui3-g header"> <div class="yui3-u-3-4"> <h1><img src="../assets/css/logo.png" title="cannon" width="117" height="52"></h1> </div> <div class="yui3-u-1-4 version"> <em>API Docs for: 0.6.1</em> </div> </div> <div id="bd" class="yui3-g"> <div class="yui3-u-1-4"> <div id="docs-sidebar" class="sidebar apidocs"> <div id="api-list"> <h2 class="off-left">APIs</h2> <div id="api-tabview" class="tabview"> <ul class="tabs"> <li><a href="#api-classes">Classes</a></li> <li><a href="#api-modules">Modules</a></li> </ul> <div id="api-tabview-filter"> <input type="search" id="api-filter" placeholder="Type to filter APIs"> </div> <div id="api-tabview-panel"> <ul id="api-classes" class="apis classes"> <li><a href="../classes/AABB.html">AABB</a></li> <li><a href="../classes/ArrayCollisionMatrix.html">ArrayCollisionMatrix</a></li> <li><a href="../classes/Body.html">Body</a></li> <li><a href="../classes/Box.html">Box</a></li> <li><a href="../classes/Broadphase.html">Broadphase</a></li> <li><a href="../classes/ConeEquation.html">ConeEquation</a></li> <li><a href="../classes/ConeTwistConstraint.html">ConeTwistConstraint</a></li> <li><a href="../classes/Constraint.html">Constraint</a></li> <li><a href="../classes/ContactEquation.html">ContactEquation</a></li> <li><a href="../classes/ContactMaterial.html">ContactMaterial</a></li> <li><a href="../classes/ConvexPolyhedron.html">ConvexPolyhedron</a></li> <li><a href="../classes/Cylinder.html">Cylinder</a></li> <li><a href="../classes/Demo.html">Demo</a></li> <li><a href="../classes/DistanceConstraint.html">DistanceConstraint</a></li> <li><a href="../classes/Equation.html">Equation</a></li> <li><a href="../classes/EventTarget.html">EventTarget</a></li> <li><a href="../classes/FrictionEquation.html">FrictionEquation</a></li> <li><a href="../classes/GridBroadphase.html">GridBroadphase</a></li> <li><a href="../classes/GSSolver.html">GSSolver</a></li> <li><a href="../classes/Heightfield.html">Heightfield</a></li> <li><a href="../classes/HingeConstraint.html">HingeConstraint</a></li> <li><a href="../classes/JacobianElement.html">JacobianElement</a></li> <li><a href="../classes/LockConstraint.html">LockConstraint</a></li> <li><a href="../classes/Mat3.html">Mat3</a></li> <li><a href="../classes/Material.html">Material</a></li> <li><a href="../classes/NaiveBroadphase.html">NaiveBroadphase</a></li> <li><a href="../classes/Narrowphase.html">Narrowphase</a></li> <li><a href="../classes/ObjectCollisionMatrix.html">ObjectCollisionMatrix</a></li> <li><a href="../classes/Octree.html">Octree</a></li> <li><a href="../classes/OctreeNode.html">OctreeNode</a></li> <li><a href="../classes/Particle.html">Particle</a></li> <li><a href="../classes/Plane.html">Plane</a></li> <li><a href="../classes/PointToPointConstraint.html">PointToPointConstraint</a></li> <li><a href="../classes/Pool.html">Pool</a></li> <li><a href="../classes/Quaternion.html">Quaternion</a></li> <li><a href="../classes/Ray.html">Ray</a></li> <li><a href="../classes/RaycastResult.html">RaycastResult</a></li> <li><a href="../classes/RaycastVehicle.html">RaycastVehicle</a></li> <li><a href="../classes/RigidVehicle.html">RigidVehicle</a></li> <li><a href="../classes/RotationalEquation.html">RotationalEquation</a></li> <li><a href="../classes/RotationalMotorEquation.html">RotationalMotorEquation</a></li> <li><a href="../classes/SAPBroadphase.html">SAPBroadphase</a></li> <li><a href="../classes/Shape.html">Shape</a></li> <li><a href="../classes/Solver.html">Solver</a></li> <li><a href="../classes/Sphere.html">Sphere</a></li> <li><a href="../classes/SPHSystem.html">SPHSystem</a></li> <li><a href="../classes/SplitSolver.html">SplitSolver</a></li> <li><a href="../classes/Spring.html">Spring</a></li> <li><a href="../classes/Transform.html">Transform</a></li> <li><a href="../classes/Trimesh.html">Trimesh</a></li> <li><a href="../classes/TupleDictionary.html">TupleDictionary</a></li> <li><a href="../classes/Vec3.html">Vec3</a></li> <li><a href="../classes/Vec3Pool.html">Vec3Pool</a></li> <li><a href="../classes/WheelInfo.html">WheelInfo</a></li> <li><a href="../classes/World.html">World</a></li> </ul> <ul id="api-modules" class="apis modules"> </ul> </div> </div> </div> </div> </div> <div class="yui3-u-3-4"> <div id="api-options"> Show: <label for="api-show-inherited"> <input type="checkbox" id="api-show-inherited" checked> Inherited </label> <label for="api-show-protected"> <input type="checkbox" id="api-show-protected"> Protected </label> <label for="api-show-private"> <input type="checkbox" id="api-show-private"> Private </label> <label for="api-show-deprecated"> <input type="checkbox" id="api-show-deprecated"> Deprecated </label> </div> <div class="apidocs"> <div id="docs-main"> <div class="content"> <h1 class="file-heading">File: src/objects/Spring.js</h1> <div class="file"> <pre class="code prettyprint linenums"> var Vec3 = require('../math/Vec3'); module.exports = Spring; /** * A spring, connecting two bodies. * * @class Spring * @constructor * @param {Body} bodyA * @param {Body} bodyB * @param {Object} [options] * @param {number} [options.restLength] A number > 0. Default: 1 * @param {number} [options.stiffness] A number >= 0. Default: 100 * @param {number} [options.damping] A number >= 0. Default: 1 * @param {Vec3} [options.worldAnchorA] Where to hook the spring to body A, in world coordinates. * @param {Vec3} [options.worldAnchorB] * @param {Vec3} [options.localAnchorA] Where to hook the spring to body A, in local body coordinates. * @param {Vec3} [options.localAnchorB] */ function Spring(bodyA,bodyB,options){ options = options || {}; /** * Rest length of the spring. * @property restLength * @type {number} */ this.restLength = typeof(options.restLength) === "number" ? options.restLength : 1; /** * Stiffness of the spring. * @property stiffness * @type {number} */ this.stiffness = options.stiffness || 100; /** * Damping of the spring. * @property damping * @type {number} */ this.damping = options.damping || 1; /** * First connected body. * @property bodyA * @type {Body} */ this.bodyA = bodyA; /** * Second connected body. * @property bodyB * @type {Body} */ this.bodyB = bodyB; /** * Anchor for bodyA in local bodyA coordinates. * @property localAnchorA * @type {Vec3} */ this.localAnchorA = new Vec3(); /** * Anchor for bodyB in local bodyB coordinates. * @property localAnchorB * @type {Vec3} */ this.localAnchorB = new Vec3(); if(options.localAnchorA){ this.localAnchorA.copy(options.localAnchorA); } if(options.localAnchorB){ this.localAnchorB.copy(options.localAnchorB); } if(options.worldAnchorA){ this.setWorldAnchorA(options.worldAnchorA); } if(options.worldAnchorB){ this.setWorldAnchorB(options.worldAnchorB); } } /** * Set the anchor point on body A, using world coordinates. * @method setWorldAnchorA * @param {Vec3} worldAnchorA */ Spring.prototype.setWorldAnchorA = function(worldAnchorA){ this.bodyA.pointToLocalFrame(worldAnchorA,this.localAnchorA); }; /** * Set the anchor point on body B, using world coordinates. * @method setWorldAnchorB * @param {Vec3} worldAnchorB */ Spring.prototype.setWorldAnchorB = function(worldAnchorB){ this.bodyB.pointToLocalFrame(worldAnchorB,this.localAnchorB); }; /** * Get the anchor point on body A, in world coordinates. * @method getWorldAnchorA * @param {Vec3} result The vector to store the result in. */ Spring.prototype.getWorldAnchorA = function(result){ this.bodyA.pointToWorldFrame(this.localAnchorA,result); }; /** * Get the anchor point on body B, in world coordinates. * @method getWorldAnchorB * @param {Vec3} result The vector to store the result in. */ Spring.prototype.getWorldAnchorB = function(result){ this.bodyB.pointToWorldFrame(this.localAnchorB,result); }; var applyForce_r = new Vec3(), applyForce_r_unit = new Vec3(), applyForce_u = new Vec3(), applyForce_f = new Vec3(), applyForce_worldAnchorA = new Vec3(), applyForce_worldAnchorB = new Vec3(), applyForce_ri = new Vec3(), applyForce_rj = new Vec3(), applyForce_ri_x_f = new Vec3(), applyForce_rj_x_f = new Vec3(), applyForce_tmp = new Vec3(); /** * Apply the spring force to the connected bodies. * @method applyForce */ Spring.prototype.applyForce = function(){ var k = this.stiffness, d = this.damping, l = this.restLength, bodyA = this.bodyA, bodyB = this.bodyB, r = applyForce_r, r_unit = applyForce_r_unit, u = applyForce_u, f = applyForce_f, tmp = applyForce_tmp; var worldAnchorA = applyForce_worldAnchorA, worldAnchorB = applyForce_worldAnchorB, ri = applyForce_ri, rj = applyForce_rj, ri_x_f = applyForce_ri_x_f, rj_x_f = applyForce_rj_x_f; // Get world anchors this.getWorldAnchorA(worldAnchorA); this.getWorldAnchorB(worldAnchorB); // Get offset points worldAnchorA.vsub(bodyA.position,ri); worldAnchorB.vsub(bodyB.position,rj); // Compute distance vector between world anchor points worldAnchorB.vsub(worldAnchorA,r); var rlen = r.norm(); r_unit.copy(r); r_unit.normalize(); // Compute relative velocity of the anchor points, u bodyB.velocity.vsub(bodyA.velocity,u); // Add rotational velocity bodyB.angularVelocity.cross(rj,tmp); u.vadd(tmp,u); bodyA.angularVelocity.cross(ri,tmp); u.vsub(tmp,u); // F = - k * ( x - L ) - D * ( u ) r_unit.mult(-k*(rlen-l) - d*u.dot(r_unit), f); // Add forces to bodies bodyA.force.vsub(f,bodyA.force); bodyB.force.vadd(f,bodyB.force); // Angular force ri.cross(f,ri_x_f); rj.cross(f,rj_x_f); bodyA.torque.vsub(ri_x_f,bodyA.torque); bodyB.torque.vadd(rj_x_f,bodyB.torque); }; </pre> </div> </div> </div> </div> </div> </div> </div> <script src="../assets/vendor/prettify/prettify-min.js"></script> <script>prettyPrint();</script> <script src="../assets/js/yui-prettify.js"></script> <script src="../assets/../api.js"></script> <script src="../assets/js/api-filter.js"></script> <script src="../assets/js/api-list.js"></script> <script src="../assets/js/api-search.js"></script> <script src="../assets/js/apidocs.js"></script> </body> </html>