123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- /**
- * @author zz85 / http://www.lab4games.net/zz85/blog
- *
- **/
- /**************************************************************
- * Curved Path - a curve path is simply a array of connected
- * curves, but retains the api of a curve
- **************************************************************/
- THREE.CurvePath = function () {
- this.curves = [];
- this.bends = [];
- };
- THREE.CurvePath.prototype = new THREE.Curve();
- THREE.CurvePath.prototype.constructor = THREE.CurvePath;
- THREE.CurvePath.prototype.add = function ( curve ) {
- this.curves.push( curve );
- };
- THREE.CurvePath.prototype.checkConnection = function() {
- };
- // Add a line curve if start and end of lines are not connected
- THREE.CurvePath.prototype.closePath = function() {
- };
- // To get accurate point with reference to
- // entire path distance at time t,
- // following has to be done:
- // 1. Length of each sub path have to be known
- // 2. Locate and identify type of curve
- // 3. Get t for the curve
- // 4. Return curve.getPointAt(t')
- THREE.CurvePath.prototype.getPoint = function( t ) {
- var d = t * this.getLength();
- var curveLengths = this.getCurveLengths();
- var i = 0, diff, curve;
- // To think about boundaries points.
- while ( i < curveLengths.length ) {
- if ( curveLengths[ i ] >= d ) {
- diff = curveLengths[ i ] - d;
- curve = this.curves[ i ];
- var u = 1 - diff / curve.getLength();
- return curve.getPointAt( u );
- break;
- }
- i ++;
- }
- return null;
- // loop where sum != 0, sum > d , sum+1 <d
- };
- /*
- THREE.CurvePath.prototype.getTangent = function( t ) {
- };*/
- // We cannot use the default THREE.Curve getPoint() with getLength() because in
- // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath
- // getPoint() depends on getLength
- THREE.CurvePath.prototype.getLength = function() {
- var lens = this.getCurveLengths();
- return lens[ lens.length - 1 ];
- };
- // Compute lengths and cache them
- // We cannot overwrite getLengths() because UtoT mapping uses it.
- THREE.CurvePath.prototype.getCurveLengths = function() {
- // We use cache values if curves and cache array are same length
- if ( this.cacheLengths && this.cacheLengths.length == this.curves.length ) {
- return this.cacheLengths;
- };
- // Get length of subsurve
- // Push sums into cached array
- var lengths = [], sums = 0;
- var i, il = this.curves.length;
- for ( i = 0; i < il; i ++ ) {
- sums += this.curves[ i ].getLength();
- lengths.push( sums );
- }
- this.cacheLengths = lengths;
- return lengths;
- };
- // Returns min and max coordinates, as well as centroid
- THREE.CurvePath.prototype.getBoundingBox = function () {
- var points = this.getPoints();
- var maxX, maxY;
- var minX, minY;
- maxX = maxY = Number.NEGATIVE_INFINITY;
- minX = minY = Number.POSITIVE_INFINITY;
- var p, i, il, sum;
- sum = new THREE.Vector2();
- for ( i = 0, il = points.length; i < il; i ++ ) {
- p = points[ i ];
- if ( p.x > maxX ) maxX = p.x;
- else if ( p.x < minX ) minX = p.x;
- if ( p.y > maxY ) maxY = p.y;
- else if ( p.y < maxY ) minY = p.y;
- sum.addSelf( p.x, p.y );
- }
- return {
- minX: minX,
- minY: minY,
- maxX: maxX,
- maxY: maxY,
- centroid: sum.divideScalar( il )
- };
- };
- /**************************************************************
- * Create Geometries Helpers
- **************************************************************/
- /// Generate geometry from path points (for Line or ParticleSystem objects)
- THREE.CurvePath.prototype.createPointsGeometry = function( divisions ) {
- var pts = this.getPoints( divisions, true );
- return this.createGeometry( pts );
- };
- // Generate geometry from equidistance sampling along the path
- THREE.CurvePath.prototype.createSpacedPointsGeometry = function( divisions ) {
- var pts = this.getSpacedPoints( divisions, true );
- return this.createGeometry( pts );
- };
- THREE.CurvePath.prototype.createGeometry = function( points ) {
- var geometry = new THREE.Geometry();
- for( var i = 0; i < points.length; i ++ ) {
- geometry.vertices.push( new THREE.Vertex( new THREE.Vector3( points[ i ].x, points[ i ].y, 0 ) ) );
- }
- return geometry;
- };
- /**************************************************************
- * Bend / Wrap Helper Methods
- **************************************************************/
- // Wrap path / Bend modifiers?
- THREE.CurvePath.prototype.addWrapPath = function ( bendpath ) {
- this.bends.push( bendpath );
- };
- THREE.CurvePath.prototype.getTransformedPoints = function( segments, bends ) {
- var oldPts = this.getPoints( segments ); // getPoints getSpacedPoints
- var i, il;
- if ( !bends ) {
- bends = this.bends;
- }
- for ( i = 0, il = bends.length; i < il; i ++ ) {
- oldPts = this.getWrapPoints( oldPts, bends[ i ] );
- }
- return oldPts;
- };
- THREE.CurvePath.prototype.getTransformedSpacedPoints = function( segments, bends ) {
- var oldPts = this.getSpacedPoints( segments );
- var i, il;
- if ( !bends ) {
- bends = this.bends;
- }
- for ( i = 0, il = bends.length; i < il; i ++ ) {
- oldPts = this.getWrapPoints( oldPts, bends[ i ] );
- }
- return oldPts;
- };
- // This returns getPoints() bend/wrapped around the contour of a path.
- // Read http://www.planetclegg.com/projects/WarpingTextToSplines.html
- THREE.CurvePath.prototype.getWrapPoints = function ( oldPts, path ) {
- var bounds = this.getBoundingBox();
- var i, il, p, oldX, oldY, xNorm;
- for ( i = 0, il = oldPts.length; i < il; i ++ ) {
- p = oldPts[ i ];
- oldX = p.x;
- oldY = p.y;
- var xNorm = oldX/ bounds.maxX;
- // If using actual distance, for length > path, requires line extrusions
- //xNorm = path.getUtoTmapping(xNorm, oldX); // 3 styles. 1) wrap stretched. 2) wrap stretch by arc length 3) warp by actual distance
- xNorm = path.getUtoTmapping( xNorm, oldX );
- // check for out of bounds?
- var pathPt = path.getPoint( xNorm );
- var normal = path.getNormalVector( xNorm ).multiplyScalar( oldY );
- p.x = pathPt.x + normal.x;
- p.y = pathPt.y + normal.y;
- }
- return oldPts;
- };
|