<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>src/shapes/Box.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/shapes/Box.js</h1> <div class="file"> <pre class="code prettyprint linenums"> module.exports = Box; var Shape = require('./Shape'); var Vec3 = require('../math/Vec3'); var ConvexPolyhedron = require('./ConvexPolyhedron'); /** * A 3d box shape. * @class Box * @constructor * @param {Vec3} halfExtents * @author schteppe * @extends Shape */ function Box(halfExtents){ Shape.call(this); this.type = Shape.types.BOX; /** * @property halfExtents * @type {Vec3} */ this.halfExtents = halfExtents; /** * Used by the contact generator to make contacts with other convex polyhedra for example * @property convexPolyhedronRepresentation * @type {ConvexPolyhedron} */ this.convexPolyhedronRepresentation = null; this.updateConvexPolyhedronRepresentation(); this.updateBoundingSphereRadius(); } Box.prototype = new Shape(); Box.prototype.constructor = Box; /** * Updates the local convex polyhedron representation used for some collisions. * @method updateConvexPolyhedronRepresentation */ Box.prototype.updateConvexPolyhedronRepresentation = function(){ var sx = this.halfExtents.x; var sy = this.halfExtents.y; var sz = this.halfExtents.z; var V = Vec3; var vertices = [ new V(-sx,-sy,-sz), new V( sx,-sy,-sz), new V( sx, sy,-sz), new V(-sx, sy,-sz), new V(-sx,-sy, sz), new V( sx,-sy, sz), new V( sx, sy, sz), new V(-sx, sy, sz) ]; var indices = [ [3,2,1,0], // -z [4,5,6,7], // +z [5,4,0,1], // -y [2,3,7,6], // +y [0,4,7,3], // -x [1,2,6,5], // +x ]; var axes = [ new V(0, 0, 1), new V(0, 1, 0), new V(1, 0, 0) ]; var h = new ConvexPolyhedron(vertices, indices); this.convexPolyhedronRepresentation = h; h.material = this.material; }; /** * @method calculateLocalInertia * @param {Number} mass * @param {Vec3} target * @return {Vec3} */ Box.prototype.calculateLocalInertia = function(mass,target){ target = target || new Vec3(); Box.calculateInertia(this.halfExtents, mass, target); return target; }; Box.calculateInertia = function(halfExtents,mass,target){ var e = halfExtents; target.x = 1.0 / 12.0 * mass * ( 2*e.y*2*e.y + 2*e.z*2*e.z ); target.y = 1.0 / 12.0 * mass * ( 2*e.x*2*e.x + 2*e.z*2*e.z ); target.z = 1.0 / 12.0 * mass * ( 2*e.y*2*e.y + 2*e.x*2*e.x ); }; /** * Get the box 6 side normals * @method getSideNormals * @param {array} sixTargetVectors An array of 6 vectors, to store the resulting side normals in. * @param {Quaternion} quat Orientation to apply to the normal vectors. If not provided, the vectors will be in respect to the local frame. * @return {array} */ Box.prototype.getSideNormals = function(sixTargetVectors,quat){ var sides = sixTargetVectors; var ex = this.halfExtents; sides[0].set( ex.x, 0, 0); sides[1].set( 0, ex.y, 0); sides[2].set( 0, 0, ex.z); sides[3].set( -ex.x, 0, 0); sides[4].set( 0, -ex.y, 0); sides[5].set( 0, 0, -ex.z); if(quat!==undefined){ for(var i=0; i!==sides.length; i++){ quat.vmult(sides[i],sides[i]); } } return sides; }; Box.prototype.volume = function(){ return 8.0 * this.halfExtents.x * this.halfExtents.y * this.halfExtents.z; }; Box.prototype.updateBoundingSphereRadius = function(){ this.boundingSphereRadius = this.halfExtents.norm(); }; var worldCornerTempPos = new Vec3(); var worldCornerTempNeg = new Vec3(); Box.prototype.forEachWorldCorner = function(pos,quat,callback){ var e = this.halfExtents; var corners = [[ e.x, e.y, e.z], [ -e.x, e.y, e.z], [ -e.x, -e.y, e.z], [ -e.x, -e.y, -e.z], [ e.x, -e.y, -e.z], [ e.x, e.y, -e.z], [ -e.x, e.y, -e.z], [ e.x, -e.y, e.z]]; for(var i=0; i<corners.length; i++){ worldCornerTempPos.set(corners[i][0],corners[i][1],corners[i][2]); quat.vmult(worldCornerTempPos,worldCornerTempPos); pos.vadd(worldCornerTempPos,worldCornerTempPos); callback(worldCornerTempPos.x, worldCornerTempPos.y, worldCornerTempPos.z); } }; var worldCornersTemp = [ new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3() ]; Box.prototype.calculateWorldAABB = function(pos,quat,min,max){ var e = this.halfExtents; worldCornersTemp[0].set(e.x, e.y, e.z); worldCornersTemp[1].set(-e.x, e.y, e.z); worldCornersTemp[2].set(-e.x, -e.y, e.z); worldCornersTemp[3].set(-e.x, -e.y, -e.z); worldCornersTemp[4].set(e.x, -e.y, -e.z); worldCornersTemp[5].set(e.x, e.y, -e.z); worldCornersTemp[6].set(-e.x, e.y, -e.z); worldCornersTemp[7].set(e.x, -e.y, e.z); var wc = worldCornersTemp[0]; quat.vmult(wc, wc); pos.vadd(wc, wc); max.copy(wc); min.copy(wc); for(var i=1; i<8; i++){ var wc = worldCornersTemp[i]; quat.vmult(wc, wc); pos.vadd(wc, wc); var x = wc.x; var y = wc.y; var z = wc.z; if(x > max.x){ max.x = x; } if(y > max.y){ max.y = y; } if(z > max.z){ max.z = z; } if(x < min.x){ min.x = x; } if(y < min.y){ min.y = y; } if(z < min.z){ min.z = z; } } // Get each axis max // min.set(Infinity,Infinity,Infinity); // max.set(-Infinity,-Infinity,-Infinity); // this.forEachWorldCorner(pos,quat,function(x,y,z){ // if(x > max.x){ // max.x = x; // } // if(y > max.y){ // max.y = y; // } // if(z > max.z){ // max.z = z; // } // if(x < min.x){ // min.x = x; // } // if(y < min.y){ // min.y = y; // } // if(z < min.z){ // min.z = z; // } // }); }; </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>