106 lines
2.3 KiB
JavaScript
106 lines
2.3 KiB
JavaScript
/**
|
|
* @author astrodud / http://astrodud.isgreat.org/
|
|
* @author zz85 / https://github.com/zz85
|
|
* @author bhouston / http://exocortex.com
|
|
*/
|
|
|
|
// points - to create a closed torus, one must use a set of points
|
|
// like so: [ a, b, c, d, a ], see first is the same as last.
|
|
// segments - the number of circumference segments to create
|
|
// phiStart - the starting radian
|
|
// phiLength - the radian (0 to 2*PI) range of the lathed section
|
|
// 2*pi is a closed lathe, less than 2PI is a portion.
|
|
|
|
THREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) {
|
|
|
|
THREE.Geometry.call( this );
|
|
|
|
this.type = 'LatheGeometry';
|
|
|
|
this.parameters = {
|
|
points: points,
|
|
segments: segments,
|
|
phiStart: phiStart,
|
|
phiLength: phiLength
|
|
};
|
|
|
|
segments = segments || 12;
|
|
phiStart = phiStart || 0;
|
|
phiLength = phiLength || 2 * Math.PI;
|
|
|
|
var inversePointLength = 1.0 / ( points.length - 1 );
|
|
var inverseSegments = 1.0 / segments;
|
|
|
|
for ( var i = 0, il = segments; i <= il; i ++ ) {
|
|
|
|
var phi = phiStart + i * inverseSegments * phiLength;
|
|
|
|
var c = Math.cos( phi ),
|
|
s = Math.sin( phi );
|
|
|
|
for ( var j = 0, jl = points.length; j < jl; j ++ ) {
|
|
|
|
var pt = points[ j ];
|
|
|
|
var vertex = new THREE.Vector3();
|
|
|
|
vertex.x = c * pt.x - s * pt.y;
|
|
vertex.y = s * pt.x + c * pt.y;
|
|
vertex.z = pt.z;
|
|
|
|
this.vertices.push( vertex );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var np = points.length;
|
|
|
|
for ( var i = 0, il = segments; i < il; i ++ ) {
|
|
|
|
for ( var j = 0, jl = points.length - 1; j < jl; j ++ ) {
|
|
|
|
var base = j + np * i;
|
|
var a = base;
|
|
var b = base + np;
|
|
var c = base + 1 + np;
|
|
var d = base + 1;
|
|
|
|
var u0 = i * inverseSegments;
|
|
var v0 = j * inversePointLength;
|
|
var u1 = u0 + inverseSegments;
|
|
var v1 = v0 + inversePointLength;
|
|
|
|
this.faces.push( new THREE.Face3( a, b, d ) );
|
|
|
|
this.faceVertexUvs[ 0 ].push( [
|
|
|
|
new THREE.Vector2( u0, v0 ),
|
|
new THREE.Vector2( u1, v0 ),
|
|
new THREE.Vector2( u0, v1 )
|
|
|
|
] );
|
|
|
|
this.faces.push( new THREE.Face3( b, c, d ) );
|
|
|
|
this.faceVertexUvs[ 0 ].push( [
|
|
|
|
new THREE.Vector2( u1, v0 ),
|
|
new THREE.Vector2( u1, v1 ),
|
|
new THREE.Vector2( u0, v1 )
|
|
|
|
] );
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.mergeVertices();
|
|
this.computeFaceNormals();
|
|
this.computeVertexNormals();
|
|
|
|
};
|
|
|
|
THREE.LatheGeometry.prototype = Object.create( THREE.Geometry.prototype );
|
|
THREE.LatheGeometry.prototype.constructor = THREE.LatheGeometry;
|