Browse Source

re-adding alternative normal generation

zz85 13 years ago
parent
commit
643a338c5f
1 changed files with 46 additions and 21 deletions
  1. 46 21
      src/extras/geometries/TubeGeometry.js

+ 46 - 21
src/extras/geometries/TubeGeometry.js

@@ -74,35 +74,60 @@ THREE.TubeGeometry = function( path, segments, radius, segmentsRadius, closed, d
 
 
 	}
 	}
 
 
+	initialNormal3();
+
+	function initialNormal1() {
+		// fixed start binormal. Has dangers of 0 vectors
+		normals[ 0 ] = new THREE.Vector3();
+		binormals[ 0 ] = new THREE.Vector3();
+		var lastBinormal = new THREE.Vector3( 0, 0, 1 );
+		normals[ 0 ].cross( lastBinormal, tangents[ 0 ] ).normalize();
+		binormals[ 0 ].cross( tangents[ 0 ], normals[ 0 ] ).normalize();
+	}
 
 
-	// select an initial normal vector perpenicular to the first tangent vector,
-	// and in the direction of the smallest tangent xyz component
+	function initialNormal2() {
 
 
-	normals[ 0 ] = new THREE.Vector3();
-	binormals[ 0 ] = new THREE.Vector3();
-	smallest = Number.MAX_VALUE;
-	tx = Math.abs( tangents[ 0 ].x );
-	ty = Math.abs( tangents[ 0 ].y );
-	tz = Math.abs( tangents[ 0 ].z );
+		// This uses the Frenet-Serret formula for deriving binormal
+		var t2 = path.getTangentAt( epsilon );
 
 
-	if ( tx <= smallest ) {
-		smallest = tx;
-		normal.set( 1, 0, 0 );
-	}
+		normals[ 0 ] = new THREE.Vector3().sub( t2, tangents[ 0 ] ).normalize()
+		binormals[ 0 ] = new THREE.Vector3().cross( tangents[ 0 ], normals[ 0 ] );
 
 
-	if ( ty <= smallest ) {
-		smallest = ty;
-		normal.set( 0, 1, 0 );
-	}
+		normals[ 0 ].cross( binormals[ 0 ], tangents[ 0 ] ).normalize(); // last binormal x tangent
+		binormals[ 0 ].cross( tangents[ 0 ], normals[ 0 ] ).normalize();
 
 
-	if ( tz <= smallest ) {
-		normal.set( 0, 0, 1 );
 	}
 	}
 
 
-	vec.cross( tangents[ 0 ], normal ).normalize();
+	function initialNormal3() {
+		// select an initial normal vector perpenicular to the first tangent vector,
+		// and in the direction of the smallest tangent xyz component
+
+		normals[ 0 ] = new THREE.Vector3();
+		binormals[ 0 ] = new THREE.Vector3();
+		smallest = Number.MAX_VALUE;
+		tx = Math.abs( tangents[ 0 ].x );
+		ty = Math.abs( tangents[ 0 ].y );
+		tz = Math.abs( tangents[ 0 ].z );
+
+		if ( tx <= smallest ) {
+			smallest = tx;
+			vec.set( 1, 0, 0 );
+		}
+
+		if ( ty <= smallest ) {
+			smallest = ty;
+			vec.set( 0, 1, 0 );
+		}
+
+		if ( tz <= smallest ) {
+			vec.set( 0, 0, 1 );
+		}
+
+		// vec.cross( tangents[ 0 ], normal ).normalize();
 
 
-	normals[ 0 ].cross( tangents[ 0 ], vec );
-	binormals[ 0 ].cross( tangents[ 0 ], normals[ 0 ] );
+		normals[ 0 ].cross( tangents[ 0 ], vec );
+		binormals[ 0 ].cross( tangents[ 0 ], normals[ 0 ] );
+	}
 
 
 
 
 	// compute the slowly-varying normal and binormal vectors for each segment on the path
 	// compute the slowly-varying normal and binormal vectors for each segment on the path