|
@@ -0,0 +1,52 @@
|
|
|
+/**
|
|
|
+ * Spline from Tween.js, slightly optimized
|
|
|
+ * http://sole.github.com/tween.js/examples/05_spline.html
|
|
|
+ *
|
|
|
+ * @author mrdoob / http://mrdoob.com/
|
|
|
+ */
|
|
|
+
|
|
|
+THREE.Spline = function () {
|
|
|
+
|
|
|
+ var c = [], v3 = { x: 0, y: 0, z: 0 },
|
|
|
+ point, intPoint, weight, w2, w3,
|
|
|
+ pa, pb, pc, pd;
|
|
|
+
|
|
|
+ this.get2DPoint = function ( points, k ) {
|
|
|
+
|
|
|
+ point = ( points.length - 1 ) * k;
|
|
|
+ intPoint = Math.floor( point );
|
|
|
+ weight = point - intPoint;
|
|
|
+
|
|
|
+ c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;
|
|
|
+ c[ 1 ] = intPoint;
|
|
|
+ c[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1;
|
|
|
+ c[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2;
|
|
|
+
|
|
|
+ pa = points[ c[ 0 ] ];
|
|
|
+ pb = points[ c[ 1 ] ];
|
|
|
+ pc = points[ c[ 2 ] ];
|
|
|
+ pd = points[ c[ 3 ] ];
|
|
|
+
|
|
|
+ w2 = weight * weight;
|
|
|
+ w3 = weight * w2;
|
|
|
+
|
|
|
+ v3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );
|
|
|
+ v3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );
|
|
|
+ v3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );
|
|
|
+
|
|
|
+ return v3;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // Catmull-Rom
|
|
|
+
|
|
|
+ function interpolate( p0, p1, p2, p3, t, t2, t3 ) {
|
|
|
+
|
|
|
+ var v0 = ( p2 - p0 ) * 0.5,
|
|
|
+ v1 = ( p3 - p1 ) * 0.5;
|
|
|
+
|
|
|
+ return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+};
|