ParametricGeometry.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /**
  2. * @author zz85 / https://github.com/zz85
  3. *
  4. * Parametric Surfaces Geometry
  5. * based on the brilliant article by @prideout http://prideout.net/blog/?p=44
  6. */
  7. import { Geometry } from '../core/Geometry';
  8. function ParametricGeometry( func, slices, stacks ) {
  9. Geometry.call( this );
  10. this.type = 'ParametricGeometry';
  11. this.parameters = {
  12. func: func,
  13. slices: slices,
  14. stacks: stacks
  15. };
  16. this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );
  17. this.mergeVertices();
  18. }
  19. ParametricGeometry.prototype = Object.create( Geometry.prototype );
  20. ParametricGeometry.prototype.constructor = ParametricGeometry;
  21. /**
  22. * @author Mugen87 / https://github.com/Mugen87
  23. *
  24. * Parametric Surfaces Geometry
  25. * based on the brilliant article by @prideout http://prideout.net/blog/?p=44
  26. */
  27. import { BufferGeometry } from '../core/BufferGeometry';
  28. import { Float32BufferAttribute } from '../core/BufferAttribute';
  29. function ParametricBufferGeometry( func, slices, stacks ) {
  30. BufferGeometry.call( this );
  31. this.type = 'ParametricBufferGeometry';
  32. this.parameters = {
  33. func: func,
  34. slices: slices,
  35. stacks: stacks
  36. };
  37. // buffers
  38. var indices = [];
  39. var vertices = [];
  40. var uvs = [];
  41. var i, j;
  42. // generate vertices and uvs
  43. var sliceCount = slices + 1;
  44. for ( i = 0; i <= stacks; i ++ ) {
  45. var v = i / stacks;
  46. for ( j = 0; j <= slices; j ++ ) {
  47. var u = j / slices;
  48. var p = func( u, v );
  49. vertices.push( p.x, p.y, p.z );
  50. uvs.push( u, v );
  51. }
  52. }
  53. // generate indices
  54. for ( i = 0; i < stacks; i ++ ) {
  55. for ( j = 0; j < slices; j ++ ) {
  56. var a = i * sliceCount + j;
  57. var b = i * sliceCount + j + 1;
  58. var c = ( i + 1 ) * sliceCount + j + 1;
  59. var d = ( i + 1 ) * sliceCount + j;
  60. // faces one and two
  61. indices.push( a, b, d );
  62. indices.push( b, c, d );
  63. }
  64. }
  65. // build geometry
  66. this.setIndexArray( indices );
  67. this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
  68. this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
  69. // generate normals
  70. this.computeVertexNormals();
  71. }
  72. ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
  73. ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;
  74. export { ParametricGeometry, ParametricBufferGeometry };