diff options
Diffstat (limited to 'assets')
| -rw-r--r-- | assets/javascripts/rectangles/engine/rooms/projector.js | 30 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/engine/scenery/_scenery.js | 2 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/models/mat4.js | 78 | ||||
| -rw-r--r-- | assets/javascripts/rectangles/models/vec3.js | 26 |
4 files changed, 135 insertions, 1 deletions
diff --git a/assets/javascripts/rectangles/engine/rooms/projector.js b/assets/javascripts/rectangles/engine/rooms/projector.js new file mode 100644 index 0000000..2eac314 --- /dev/null +++ b/assets/javascripts/rectangles/engine/rooms/projector.js @@ -0,0 +1,30 @@ + +rooms.projector = new function(){ + + projector = new THREE.Projector(); + vector = new THREE.Vector3( mouse.x, mouse.y, 0.5 ); + projector.unprojectVector( vector, camera ); + + raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() ); + intersects = raycaster.intersectObjects( scene.children, true ); + +} + + + +THREE.Projector = function () { + + _viewProjectionMatrix = new THREE.Matrix4(), + + this.unprojectVector = function ( vector, camera ) { + camera.projectionMatrixInverse.getInverse( camera.projectionMatrix ); + + _viewProjectionMatrix.multiplyMatrices( + camera.matrixWorld, + camera.projectionMatrixInverse + ); + + return vector.applyProjection( _viewProjectionMatrix ); + }; + +} diff --git a/assets/javascripts/rectangles/engine/scenery/_scenery.js b/assets/javascripts/rectangles/engine/scenery/_scenery.js index 867bb6f..9e9e2bf 100644 --- a/assets/javascripts/rectangles/engine/scenery/_scenery.js +++ b/assets/javascripts/rectangles/engine/scenery/_scenery.js @@ -20,7 +20,7 @@ var Scenery = new function(){ var loader = new Loader(function(){ base.load(loader.images) }) - loader.preloadImages(urls) + // loader.preloadImages(urls) } base.load = function(images){ diff --git a/assets/javascripts/rectangles/models/mat4.js b/assets/javascripts/rectangles/models/mat4.js new file mode 100644 index 0000000..b061199 --- /dev/null +++ b/assets/javascripts/rectangles/models/mat4.js @@ -0,0 +1,78 @@ +function mat4(e){ + this.elements = [ 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 ] + return this +} +mat4.prototype.set = function (a) { + var els = this.elements + a.forEach(function(n,i){ els[i] = n }) + return this +} +mat4.prototype.clone = function(){ + return (new mat4).set(this.els) +} +mat4.prototype.identity = function () { + this.set([ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ]); + return this; +} +mat4.prototype.getInverse = function (m, throwOnInvertible) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements; + var me = m.elements; + + var n11 = me[0], n12 = me[4], n13 = me[8], n14 = me[12]; + var n21 = me[1], n22 = me[5], n23 = me[9], n24 = me[13]; + var n31 = me[2], n32 = me[6], n33 = me[10], n34 = me[14]; + var n41 = me[3], n42 = me[7], n43 = me[11], n44 = me[15]; + + te[0] = n23*n34*n42 - n24*n33*n42 + n24*n32*n43 - n22*n34*n43 - n23*n32*n44 + n22*n33*n44; + te[4] = n14*n33*n42 - n13*n34*n42 - n14*n32*n43 + n12*n34*n43 + n13*n32*n44 - n12*n33*n44; + te[8] = n13*n24*n42 - n14*n23*n42 + n14*n22*n43 - n12*n24*n43 - n13*n22*n44 + n12*n23*n44; + te[12] = n14*n23*n32 - n13*n24*n32 - n14*n22*n33 + n12*n24*n33 + n13*n22*n34 - n12*n23*n34; + te[1] = n24*n33*n41 - n23*n34*n41 - n24*n31*n43 + n21*n34*n43 + n23*n31*n44 - n21*n33*n44; + te[5] = n13*n34*n41 - n14*n33*n41 + n14*n31*n43 - n11*n34*n43 - n13*n31*n44 + n11*n33*n44; + te[9] = n14*n23*n41 - n13*n24*n41 - n14*n21*n43 + n11*n24*n43 + n13*n21*n44 - n11*n23*n44; + te[13] = n13*n24*n31 - n14*n23*n31 + n14*n21*n33 - n11*n24*n33 - n13*n21*n34 + n11*n23*n34; + te[2] = n22*n34*n41 - n24*n32*n41 + n24*n31*n42 - n21*n34*n42 - n22*n31*n44 + n21*n32*n44; + te[6] = n14*n32*n41 - n12*n34*n41 - n14*n31*n42 + n11*n34*n42 + n12*n31*n44 - n11*n32*n44; + te[10] = n12*n24*n41 - n14*n22*n41 + n14*n21*n42 - n11*n24*n42 - n12*n21*n44 + n11*n22*n44; + te[14] = n14*n22*n31 - n12*n24*n31 - n14*n21*n32 + n11*n24*n32 + n12*n21*n34 - n11*n22*n34; + te[3] = n23*n32*n41 - n22*n33*n41 - n23*n31*n42 + n21*n33*n42 + n22*n31*n43 - n21*n32*n43; + te[7] = n12*n33*n41 - n13*n32*n41 + n13*n31*n42 - n11*n33*n42 - n12*n31*n43 + n11*n32*n43; + te[11] = n13*n22*n41 - n12*n23*n41 - n13*n21*n42 + n11*n23*n42 + n12*n21*n43 - n11*n22*n43; + te[15] = n12*n23*n31 - n13*n22*n31 + n13*n21*n32 - n11*n23*n32 - n12*n21*n33 + n11*n22*n33; + + var det = n11 * te[ 0 ] + n21 * te[ 4 ] + n31 * te[ 8 ] + n41 * te[ 12 ]; + + if ( det == 0 ) { + var msg = "Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnInvertible || false ) { + throw new Error( msg ) + } + else { + console.warn( msg ) + } + this.identity(); + return this + } + this.multiplyScalar( 1 / det ); + return this +} +mat4.prototype.multiplyScalar = function (n) { + var els = this.elements + els[0] *= n; els[4] *= n; els[8] *= n; els[12] *= n + els[1] *= n; els[5] *= n; els[9] *= n; els[13] *= n + els[2] *= n; els[6] *= n; els[10] *= n; els[14] *= n + els[3] *= n; els[7] *= n; els[11] *= n; els[15] *= n + return this +} + diff --git a/assets/javascripts/rectangles/models/vec3.js b/assets/javascripts/rectangles/models/vec3.js index 4e9f3cb..4e00b0c 100644 --- a/assets/javascripts/rectangles/models/vec3.js +++ b/assets/javascripts/rectangles/models/vec3.js @@ -3,3 +3,29 @@ function vec3(a,b,c){ this.b = b this.c = c } +vec3.prototype.add = function(v){ + this.a += v.a + this.b += v.b + this.c += v.c + return this +} +vec3.prototype.sub = function(v){ + this.a -= v.a + this.b -= v.b + this.c -= v.c + return this +} + +// input: mat4 projection matrix +vec3.prototype.apply_projection = function (m) { + var x = this.a, y = this.b, z = this.c; + + var e = m.elements; + var d = 1 / ( e[3] * x + e[7] * y + e[11] * z + e[15] ); // perspective divide + + this.x = ( e[0] * x + e[4] * y + e[8] * z + e[12] ) * d; + this.y = ( e[1] * x + e[5] * y + e[9] * z + e[13] ) * d; + this.z = ( e[2] * x + e[6] * y + e[10] * z + e[14] ) * d; + + return this; +} |
