/** * @author kile / http://kile.stravaganza.org/ */ var Cylinder = function (numSegs, topRad, botRad, height, topOffset, botOffset) { THREE.Geometry.call(this); var scope = this, i; // VERTICES // Top circle vertices for (i = 0; i < numSegs; i++) { v( Math.sin(2 * 3.1415 * i / numSegs)*topRad, Math.cos(2 * 3.1415 * i / numSegs)*topRad, 0); } // Bottom circle vertices for (i = 0; i < numSegs; i++) { v( Math.sin(2 * 3.1415 * i / numSegs)*botRad, Math.cos(2 * 3.1415 * i / numSegs)*botRad, height); } // FACES // Body for (i = 0; i < numSegs; i++) { f4(i, i + numSegs, numSegs + (i + 1) % numSegs, (i + 1) % numSegs, '#ff0000'); } // Bottom circle if (botRad != 0) { v(0, 0, -topOffset); for (i = numSegs; i < numSegs + (numSegs / 2); i++) { f4(2 * numSegs, (2 * i - 2 * numSegs) % numSegs, (2 * i - 2 * numSegs + 1) % numSegs, (2 * i - 2 * numSegs + 2) % numSegs); } } // Top circle if (topRad != 0) { v(0, 0, height + topOffset); for (i = numSegs + (numSegs / 2); i < 2 * numSegs; i++) { f4( (2 * i - 2 * numSegs + 2) % numSegs + numSegs, (2 * i - 2 * numSegs + 1) % numSegs + numSegs, (2 * i - 2 * numSegs) % numSegs+numSegs, 2 * numSegs + 1); } } this.computeCentroids(); this.computeNormals(); function v(x, y, z) { scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) ); } function f4(a, b, c, d) { scope.faces.push( new THREE.Face4( a, b, c, d ) ); } } Cylinder.prototype = new THREE.Geometry(); Cylinder.prototype.constructor = Cylinder;