Source: css3d.collision.js

/**
 * CSS 3D engine
 *
 * @category    css3d
 * @package     css3d.collision
 * @author      Jan Fischer, bitWorking <info@bitworking.de>
 * @copyright   2014 Jan Fischer
 * @license     http://www.opensource.org/licenses/mit-license.html  MIT License
 */

/**
 * 
 * @name css3d.collision
 * @class
 * @param {Array} elements
 * @returns {css3d.collision}
 */
css3d.collision = (function()
{
    /**
     * 
     * @param {Array} elements
     * @returns {css3d.collision}
     */
    var collision = function(elements)
    {        
        this._elements = elements;
    }
    
    /**
     * 
     * @memberof! css3d.collision
     * @instance
     * @param {css3d.vector3} position
     * @param {css3d.vector3} normal
     * @param {Number} distance
     * @returns {Array}
     */
    collision.prototype.getCollisions = function(position, normal, distance)
    {
        var collisionPoint = new css3d.vector3(
            position.x + (normal.x * distance),
            position.y + (normal.y * distance),
            position.z + (normal.z * distance)
        );

        var elementPosition, elementDistance, elementSize, planeDistance;
        var collisionElements = [];
	
        for (var i=0;i<this._elements.length;i++) {            
            if (null == this._elements[i]._domElement) {
                continue;
            }    
            
            elementPosition = this._elements[i].getTotalTranslation();
            elementDistance = css3d.vector3.prototype.distance(elementPosition, collisionPoint);
            elementSize = Math.max(
                this._elements[i]._domElement.offsetWidth / 2,
                this._elements[i]._domElement.offsetHeight / 2
            );
 
            if (elementDistance < elementSize) {
                elementPosition.sub(collisionPoint);
                planeDistance = css3d.vector3.prototype.dot2(this._elements[i].normalWorld, elementPosition);
                //console.log(planeDistance);
                      
                //if (planeDistance <= 0) {
                if (Math.abs(planeDistance) < distance) { // normally <= 0, but if the steps are too large the collision is missed
                    //this._elements[i]._domElement.style.border = '1px solid red';                    
                    collisionElements.push(this._elements[i]);
                }                
            }
            else {
                //this._elements[i]._domElement.style.border = 'none';
            }            
        }        
        return collisionElements;        
    }

    return collision;
}());