THREEx.GeometryUtils.js | |
---|---|
This THREEx helper provide various basic functions for ScaleTo make the geometry twice larger in | |
| |
TranslateTo make the geometry move 100 further in | |
| |
CenterTo center the geometry on its middle point | |
| |
middlePointTo compute the middle point of a 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;
}
|