// This THREEx helper provide various basic functions for ```THREE.Geometry```. // It is able to scale, translate, center a geometry. Other functions may be // added soon. // The API is chained for convenience. // // ## Scale // To make the geometry twice larger in ```y``` // ``` // var scale = new THREE.Vector3(1,2,1); // THREEx.GeometryUtils.scale(geometry, scale); // ``` // ## Translate // To make the geometry move 100 further in ```x``` // ``` // var translation = new THREE.Vector3(100,0,0); // THREEx.GeometryUtils.translate(geometry, translation); // ``` // ## Center // To center the geometry on its middle point // ``` // THREEx.GeometryUtils.center(geometry); // ``` // ## middlePoint // To compute the middle point of a geometry // ``` // THREEx.GeometryUtils.middlePoint(geometry); // ``` // # Code // /** @namespace */ var THREEx = THREEx || {}; THREEx.GeometryUtils = THREEx.GeometryUtils || {}; // TODO // - chained API // - possibility a matrix to reduce computation ? /** * Change the scale of a geometry * * @params {THREE.Geometry} geometry the geometry to compute on * @params {THREE.Vector3} scale the middlepoint of the geometry */ THREEx.GeometryUtils.scale = function(geometry, scale) { // change all geometry.vertices for(var i = 0; i < geometry.vertices.length; i++) { var vertex = geometry.vertices[i]; vertex.position.multiplySelf(scale); } // mark the vertices as dirty geometry.__dirtyVertices = true; // return this, to get chained API return this; } THREEx.GeometryUtils.translate = function(geometry, delta) { // change all geometry.vertices for(var i = 0; i < geometry.vertices.length; i++) { var vertex = geometry.vertices[i]; vertex.position.addSelf(delta); } // mark the vertices as dirty geometry.__dirtyVertices = true; // return this, to get chained API return this; } /** * Compute the "middlePoint" aka the point at the middle of the boundingBox * * @params {THREE.Geometry} the geometry to compute on * @returns {THREE.Vector3} the middlepoint of the geometry */ THREEx.GeometryUtils.middlePoint = function(geometry) { // compute bounding box geometry.computeBoundingBox(); // compute middle var middle = new THREE.Vector3() middle.x = ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2; middle.y = ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2; middle.z = ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2; // return the just computed middle return middle; } /** * Center the geometry on its middlepoint */ THREEx.GeometryUtils.center = function(geometry, noX, noY, noZ) { // compute delta var delta = this.middlePoint(geometry).negate(); if( noX ) delta.x = 0; if( noY ) delta.y = 0; if( noZ ) delta.z = 0; return this.translate(geometry, delta) } /** * Initial version of attachement * - geometry2 is the one which is moved * - TODO make something more flexible... especially on the attachement config */ THREEx.GeometryUtils.attachRightLeft = function(geometry1, geometry2, delta) { if( delta === undefined ) delta = 0; // compute bounding box geometry1.computeBoundingBox(); geometry2.computeBoundingBox(); var maxX1 = geometry1.boundingBox.x[ 1 ] var minX2 = geometry2.boundingBox.x[ 0 ]; var vector = new THREE.Vector3(); vector.x = maxX1+ (-minX2) + delta; this.translate(geometry2, vector); return this; }