139 lines
3.3 KiB
JavaScript
139 lines
3.3 KiB
JavaScript
// 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;
|
|
}
|