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;
 | 
						|
}
 |