diff --git a/examples/js/ParametricGeometries.js b/examples/js/ParametricGeometries.js index 61cc70e60769295022a3e8c02b41b93c9fc3530a..3f308da20afc32b184b84e9d059d1318f4d19c21 100644 --- a/examples/js/ParametricGeometries.js +++ b/examples/js/ParametricGeometries.js @@ -7,7 +7,9 @@ THREE.ParametricGeometries = { - klein: function ( v, u ) { + klein: function ( v, u, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); u *= Math.PI; v *= 2 * Math.PI; @@ -28,25 +30,29 @@ THREE.ParametricGeometries = { y = - 2 * ( 1 - Math.cos( u ) / 2 ) * Math.sin( v ); - return new THREE.Vector3( x, y, z ); + return result.set( x, y, z ); }, plane: function ( width, height ) { - return function( u, v ) { + return function( u, v, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); var x = u * width; var y = 0; var z = v * height; - return new THREE.Vector3( x, y, z ); + return result.set( x, y, z ); }; }, - mobius: function( u, t ) { + mobius: function( u, t, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); // flat mobius strip // http://www.wolframalpha.com/input/?i=M%C3%B6bius+strip+parametric+equations&lk=1&a=ClashPrefs_*Surface.MoebiusStrip.SurfaceProperty.ParametricEquations- @@ -56,28 +62,36 @@ THREE.ParametricGeometries = { var x, y, z; var a = 2; + x = Math.cos( v ) * ( a + u * Math.cos( v / 2 ) ); y = Math.sin( v ) * ( a + u * Math.cos( v / 2 ) ); z = u * Math.sin( v / 2 ); - return new THREE.Vector3( x, y, z ); + + return result.set( x, y, z ); }, - mobius3d: function( u, t ) { + mobius3d: function( u, t, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); // volumetric mobius strip + u *= Math.PI; t *= 2 * Math.PI; u = u * 2; var phi = u / 2; var major = 2.25, a = 0.125, b = 0.65; + var x, y, z; + x = a * Math.cos( t ) * Math.cos( phi ) - b * Math.sin( t ) * Math.sin( phi ); z = a * Math.cos( t ) * Math.sin( phi ) + b * Math.sin( t ) * Math.cos( phi ); y = ( major + x ) * Math.sin( u ); x = ( major + x ) * Math.cos( u ); - return new THREE.Vector3( x, y, z ); + + return result.set( x, y, z ); } @@ -123,7 +137,9 @@ THREE.ParametricGeometries.TubeGeometry = function( path, segments, radius, segm - var ParametricTube = function( u, v ) { + var ParametricTube = function( u, v, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); v *= 2 * Math.PI; @@ -152,7 +168,7 @@ THREE.ParametricGeometries.TubeGeometry = function( path, segments, radius, segm pos2.y += cx * normal.y + cy * binormal.y; pos2.z += cx * normal.z + cy * binormal.z; - return pos2.clone(); + return result.copy( pos2 ); }; @@ -222,7 +238,9 @@ THREE.ParametricGeometries.TorusKnotGeometry.prototype.constructor = THREE.Param *********************************************/ THREE.ParametricGeometries.SphereGeometry = function( size, u, v ) { - function sphere( u, v ) { + function sphere( u, v, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); u *= Math.PI; v *= 2 * Math.PI; @@ -231,8 +249,7 @@ THREE.ParametricGeometries.SphereGeometry = function( size, u, v ) { var y = size * Math.sin( u ) * Math.sin( v ); var z = size * Math.cos( u ); - - return new THREE.Vector3( x, y, z ); + return result.set( x, y, z ); } @@ -252,13 +269,15 @@ THREE.ParametricGeometries.SphereGeometry.prototype.constructor = THREE.Parametr THREE.ParametricGeometries.PlaneGeometry = function( width, depth, segmentsWidth, segmentsDepth ) { - function plane( u, v ) { + function plane( u, v, optionalTarget ) { + + var result = optionalTarget || new THREE.Vector3(); var x = u * width; var y = 0; var z = v * depth; - return new THREE.Vector3( x, y, z ); + return result.set( x, y, z ); } diff --git a/src/geometries/ParametricGeometry.js b/src/geometries/ParametricGeometry.js index 37fbbeca638a4db19aa4aeb6a60f6190d91902c2..b140a7cf6af9b184b9b4d0a11cc872669abc07d1 100644 --- a/src/geometries/ParametricGeometry.js +++ b/src/geometries/ParametricGeometry.js @@ -58,7 +58,11 @@ function ParametricBufferGeometry( func, slices, stacks ) { var uvs = []; var EPS = 0.00001; - var pu = new Vector3(), pv = new Vector3(), normal = new Vector3(); + + var normal = new Vector3(); + + var p0 = new Vector3(), p1 = new Vector3(); + var pu = new Vector3(), pv = new Vector3(); var i, j; @@ -74,28 +78,36 @@ function ParametricBufferGeometry( func, slices, stacks ) { var u = j / slices; - var p = func( u, v ); - vertices.push( p.x, p.y, p.z ); + // vertex + + p0 = func( u, v, p0 ); + vertices.push( p0.x, p0.y, p0.z ); + + // normal // approximate tangent vectors via finite differences if ( u - EPS >= 0 ) { - pu.subVectors( p, func( u - EPS, v ) ); + p1 = func( u - EPS, v, p1 ); + pu.subVectors( p0, p1 ); } else { - pu.subVectors( func( u + EPS, v ), p ); + p1 = func( u + EPS, v, p1 ); + pu.subVectors( p1, p0 ); } if ( v - EPS >= 0 ) { - pv.subVectors( p, func( u, v - EPS ) ); + p1 = func( u, v - EPS, p1 ); + pv.subVectors( p0, p1 ); } else { - pv.subVectors( func( u, v + EPS ), p ); + p1 = func( u, v + EPS, p1 ); + pv.subVectors( p1, p0 ); } @@ -104,6 +116,8 @@ function ParametricBufferGeometry( func, slices, stacks ) { normal.crossVectors( pu, pv ).normalize(); normals.push( normal.x, normal.y, normal.z ); + // uv + uvs.push( u, v ); }