فهرست منبع

Lathe with Vector2

LatheGeometry modified to use Vector2 and allowing axe choice by the
called.
The axe is designed by a letter because I didn't know where I should put
a constance definition.
The loop that create the geometry is not optimized for speed => the axis
test is in the inner loop.
Should not break any existing code.
Doc and exemple not updated yet.
rfm1201 10 سال پیش
والد
کامیت
2108a4eb30
4فایلهای تغییر یافته به همراه76 افزوده شده و 29 حذف شده
  1. 13 13
      editor/js/Menubar.Add.js
  2. 14 3
      editor/js/Sidebar.Geometry.LatheGeometry.js
  3. 47 12
      src/extras/geometries/LatheGeometry.js
  4. 2 1
      src/loaders/ObjectLoader.js

+ 13 - 13
editor/js/Menubar.Add.js

@@ -254,19 +254,19 @@ Menubar.Add = function ( editor ) {
 		var phiStart = 0;
 		var phiLength = 2 * Math.PI;
 
-		points.push( new THREE.Vector3( 0, 0, 0 ) );
-		points.push( new THREE.Vector3( 4, 0, 0 ) );
-		points.push( new THREE.Vector3( 3.5, 0, 0.5 ) );
-		points.push( new THREE.Vector3( 1, 0, 0.75 ) );
-		points.push( new THREE.Vector3( 0.8, 0, 1 ) );
-		points.push( new THREE.Vector3( 0.8, 0, 4 ) );
-		points.push( new THREE.Vector3( 1, 0, 4.2 ) );
-		points.push( new THREE.Vector3( 1.4, 0, 4.8 ) );
-		points.push( new THREE.Vector3( 2, 0, 5 ) );
-		points.push( new THREE.Vector3( 2.5, 0, 5.4 ) );
-		points.push( new THREE.Vector3( 2.5, 0, 12 ) );
-
-		var geometry = new THREE.LatheGeometry( points, segments, phiStart, phiLength );
+		points.push( new THREE.Vector2( 0, 0 ) );
+		points.push( new THREE.Vector2( 4, 0 ) );
+		points.push( new THREE.Vector2( 3.5, 0.5 ) );
+		points.push( new THREE.Vector2( 1, 0.75 ) );
+		points.push( new THREE.Vector2( 0.8, 1 ) );
+		points.push( new THREE.Vector2( 0.8, 4 ) );
+		points.push( new THREE.Vector2( 1, 4.2 ) );
+		points.push( new THREE.Vector2( 1.4, 4.8 ) );
+		points.push( new THREE.Vector2( 2, 5 ) );
+		points.push( new THREE.Vector2( 2.5, 5.4 ) );
+		points.push( new THREE.Vector2( 3, 12 ) );
+
+		var geometry = new THREE.LatheGeometry( points, segments, phiStart, phiLength, 'Y' );
 		var mesh = new THREE.Mesh( geometry, new THREE.MeshStandardMaterial( { side: THREE.DoubleSide } ) );
 		mesh.name = 'Lathe ' + ( ++ meshCount );
 

+ 14 - 3
editor/js/Sidebar.Geometry.LatheGeometry.js

@@ -40,6 +40,16 @@ Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 
 	container.add( phiLengthRow );
 
+	// axe
+
+	var axeRow = new UI.Row();
+	var axe = new UI.Input( parameters.axe ).setWidth( '10px' ).onChange( update );
+
+	axeRow.add( new UI.Text( 'Axe' ).setWidth( '90px' ) );
+	axeRow.add( axe );
+
+	container.add( axeRow );
+
 	// points
 
 	var lastPointIdx = 0;
@@ -57,7 +67,7 @@ Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 	for ( var i = 0; i < parameters.points.length; i ++ ) {
 
 		var point = parameters.points[ i ];
-		pointsList.add( createPointRow( point.x, point.z ) );
+		pointsList.add( createPointRow( point.x, point.y ) );
 
 	}
 
@@ -119,7 +129,7 @@ Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 
 			if ( ! pointUI ) continue;
 
-			points.push( new THREE.Vector3( pointUI.x.getValue(), 0, pointUI.y.getValue() ) );
+			points.push( new THREE.Vector2( pointUI.x.getValue(), pointUI.y.getValue() ) );
 			count ++;
 			pointUI.lbl.setValue( count );
 
@@ -129,7 +139,8 @@ Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 			points,
 			segments.getValue(),
 			phiStart.getValue() / 180 * Math.PI,
-			phiLength.getValue() / 180 * Math.PI
+			phiLength.getValue() / 180 * Math.PI,
+			axe.getValue()
 		);
 
 		editor.execute( new SetGeometryCommand( object, geometry ) );

+ 47 - 12
src/extras/geometries/LatheGeometry.js

@@ -4,31 +4,50 @@
  * @author bhouston / http://clara.io
  */
 
-// points - to create a closed torus, one must use a set of points 
+// points - to create a closed torus, one must use a set of points
 //    like so: [ a, b, c, d, a ], see first is the same as last.
 // segments - the number of circumference segments to create
 // phiStart - the starting radian
 // phiLength - the radian (0 to 2*PI) range of the lathed section
 //    2*pi is a closed lathe, less than 2PI is a portion.
+// axe - the axis of revolution ('X', 'Y' or 'Z')
 
-THREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) {
+THREE.LatheGeometry = function( points, segments, phiStart, phiLength, axe ) {
+
+	var thePoints = points;
+	if ( points.length && points[ 0 ] instanceof THREE.Vector3 ) {
+
+		console.warn( 'THREE.LatheGeometry has been updated. Use an array of THREE.Vector2 as first parameter.' );
+
+		thePoints = [];
+		axe = 'Z';
+		for ( var i = 0; i < points.length; i ++ ) {
+
+			var pt = points[ i ];
+			thePoints.push( new THREE.Vector2( Math.sqrt( pt.x * pt.x + pt.y * pt.y ), pt.z ) );
+
+		}
+
+	}
 
 	THREE.Geometry.call( this );
 
 	this.type = 'LatheGeometry';
 
 	this.parameters = {
-		points: points,
+		points: thePoints,
 		segments: segments,
 		phiStart: phiStart,
-		phiLength: phiLength
+		phiLength: phiLength,
+		axe: axe
 	};
 
 	segments = segments || 12;
 	phiStart = phiStart || 0;
 	phiLength = phiLength || 2 * Math.PI;
+	axe = axe || 'Y';
 
-	var inversePointLength = 1.0 / ( points.length - 1 );
+	var inversePointLength = 1.0 / ( thePoints.length - 1 );
 	var inverseSegments = 1.0 / segments;
 
 	for ( var i = 0, il = segments; i <= il; i ++ ) {
@@ -38,15 +57,31 @@ THREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) {
 		var c = Math.cos( phi ),
 			s = Math.sin( phi );
 
-		for ( var j = 0, jl = points.length; j < jl; j ++ ) {
+		for ( var j = 0, jl = thePoints.length; j < jl; j ++ ) {
 
-			var pt = points[ j ];
+			var pt = thePoints[ j ];
 
 			var vertex = new THREE.Vector3();
 
-			vertex.x = c * pt.x - s * pt.y;
-			vertex.y = s * pt.x + c * pt.y;
-			vertex.z = pt.z;
+			if ( axe === 'Z' ) {
+
+				vertex.x = c * pt.x;
+				vertex.y = s * pt.x;
+				vertex.z = pt.y;
+
+			} else if ( axe === 'X' ) {
+
+				vertex.y = c * pt.x;
+				vertex.z = s * pt.x;
+				vertex.x = pt.y;
+
+			} else {
+
+				vertex.z = c * pt.x;
+				vertex.x = s * pt.x;
+				vertex.y = pt.y;
+
+			}
 
 			this.vertices.push( vertex );
 
@@ -54,11 +89,11 @@ THREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) {
 
 	}
 
-	var np = points.length;
+	var np = thePoints.length;
 
 	for ( var i = 0, il = segments; i < il; i ++ ) {
 
-		for ( var j = 0, jl = points.length - 1; j < jl; j ++ ) {
+		for ( var j = 0, jl = thePoints.length - 1; j < jl; j ++ ) {
 
 			var base = j + np * i;
 			var a = base;

+ 2 - 1
src/loaders/ObjectLoader.js

@@ -263,7 +263,8 @@ THREE.ObjectLoader.prototype = {
 							data.points,
 							data.segments,
 							data.phiStart,
-							data.phiLength
+							data.phiLength,
+							data.axe
 						);
 
 						break;