Cylinder.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /**
  2. * @author kile / http://kile.stravaganza.org/
  3. */
  4. var Cylinder = function (numSegs, topRad, botRad, height, topOffset, botOffset) {
  5. THREE.Geometry.call(this);
  6. var scope = this, i;
  7. // VERTICES
  8. // Top circle vertices
  9. for (i = 0; i < numSegs; i++) {
  10. v(
  11. Math.sin(2 * 3.1415 * i / numSegs)*topRad,
  12. Math.cos(2 * 3.1415 * i / numSegs)*topRad,
  13. 0);
  14. }
  15. // Bottom circle vertices
  16. for (i = 0; i < numSegs; i++) {
  17. v(
  18. Math.sin(2 * 3.1415 * i / numSegs)*botRad,
  19. Math.cos(2 * 3.1415 * i / numSegs)*botRad,
  20. height);
  21. }
  22. // FACES
  23. // Body
  24. for (i = 0; i < numSegs; i++) {
  25. f4(i, i + numSegs, numSegs + (i + 1) % numSegs, (i + 1) % numSegs, '#ff0000');
  26. }
  27. // Bottom circle
  28. if (botRad != 0) {
  29. v(0, 0, -topOffset);
  30. for (i = numSegs; i < numSegs + (numSegs / 2); i++) {
  31. f4(2 * numSegs,
  32. (2 * i - 2 * numSegs) % numSegs,
  33. (2 * i - 2 * numSegs + 1) % numSegs,
  34. (2 * i - 2 * numSegs + 2) % numSegs);
  35. }
  36. }
  37. // Top circle
  38. if (topRad != 0) {
  39. v(0, 0, height + topOffset);
  40. for (i = numSegs + (numSegs / 2); i < 2 * numSegs; i++) {
  41. f4( (2 * i - 2 * numSegs + 2) % numSegs + numSegs,
  42. (2 * i - 2 * numSegs + 1) % numSegs + numSegs,
  43. (2 * i - 2 * numSegs) % numSegs+numSegs,
  44. 2 * numSegs + 1);
  45. }
  46. }
  47. this.computeCentroids();
  48. this.computeNormals();
  49. function v(x, y, z) {
  50. scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
  51. }
  52. function f4(a, b, c, d) {
  53. scope.faces.push( new THREE.Face4( a, b, c, d ) );
  54. }
  55. }
  56. Cylinder.prototype = new THREE.Geometry();
  57. Cylinder.prototype.constructor = Cylinder;