ParametricGeometry.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /**
  2. * @author zz85 / https://github.com/zz85
  3. * Parametric Surfaces Geometry
  4. * based on the brilliant article by @prideout http://prideout.net/blog/?p=44
  5. *
  6. * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements );
  7. *
  8. */
  9. THREE.ParametricGeometry = function ( func, slices, stacks ) {
  10. THREE.Geometry.call( this );
  11. this.type = 'ParametricGeometry';
  12. this.parameters = {
  13. func: func,
  14. slices: slices,
  15. stacks: stacks
  16. };
  17. var verts = this.vertices;
  18. var faces = this.faces;
  19. var uvs = this.faceVertexUvs[ 0 ];
  20. var i, j, p;
  21. var u, v;
  22. var sliceCount = slices + 1;
  23. for ( i = 0; i <= stacks; i ++ ) {
  24. v = i / stacks;
  25. for ( j = 0; j <= slices; j ++ ) {
  26. u = j / slices;
  27. p = func( u, v );
  28. verts.push( p );
  29. }
  30. }
  31. var a, b, c, d;
  32. var uva, uvb, uvc, uvd;
  33. for ( i = 0; i < stacks; i ++ ) {
  34. for ( j = 0; j < slices; j ++ ) {
  35. a = i * sliceCount + j;
  36. b = i * sliceCount + j + 1;
  37. c = (i + 1) * sliceCount + j + 1;
  38. d = (i + 1) * sliceCount + j;
  39. uva = new THREE.Vector2( j / slices, i / stacks );
  40. uvb = new THREE.Vector2( ( j + 1 ) / slices, i / stacks );
  41. uvc = new THREE.Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks );
  42. uvd = new THREE.Vector2( j / slices, ( i + 1 ) / stacks );
  43. faces.push( new THREE.Face3( a, b, d ) );
  44. uvs.push( [ uva, uvb, uvd ] );
  45. faces.push( new THREE.Face3( b, c, d ) );
  46. uvs.push( [ uvb.clone(), uvc, uvd.clone() ] );
  47. }
  48. }
  49. // THREE.log(this);
  50. // magic bullet
  51. // var diff = this.mergeVertices();
  52. // THREE.log('removed ', diff, ' vertices by merging');
  53. this.computeFaceNormals();
  54. this.computeVertexNormals();
  55. };
  56. THREE.ParametricGeometry.prototype = Object.create( THREE.Geometry.prototype );
  57. THREE.ParametricGeometry.prototype.constructor = THREE.ParametricGeometry;