LatheGeometry.js 2.0 KB
Newer Older
1 2
/**
 * @author astrodud / http://astrodud.isgreat.org/
3
 * @author zz85 / https://github.com/zz85
4
 * @author bhouston / http://exocortex.com
5 6
 */

7 8 9 10 11 12 13
// 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 ) {
14 15

	THREE.Geometry.call( this );
M
Mr.doob 已提交
16

17 18 19
	segments = segments || 12;
	phiStart = phiStart || 0;
	phiLength = phiLength || 2 * Math.PI;
20

W
WestLangley 已提交
21
	var inversePointLength = 1.0 / ( points.length - 1 );
22
	var inverseSegments = 1.0 / segments;
23

24
	for ( var i = 0, il = segments; i <= il; i ++ ) {
25

26
		var phi = phiStart + i * inverseSegments * phiLength;
27

28 29 30 31
		var c = Math.cos( phi ),
			s = Math.sin( phi );

		for ( var j = 0, jl = points.length; j < jl; j ++ ) {
32

33
			var pt = points[ j ];
Z
zz85 已提交
34

35
			var vertex = new THREE.Vector3();
36

37 38 39
			vertex.x = c * pt.x - s * pt.y;
			vertex.y = s * pt.x + c * pt.y;
			vertex.z = pt.z;
40

41
			this.vertices.push( vertex );
42 43 44

		}

45 46
	}

47
	var np = points.length;
48

49
	for ( var i = 0, il = segments; i < il; i ++ ) {
50

51 52 53 54 55 56 57
		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;
58

59
			this.faces.push( new THREE.Face4( a, b, c, d ) );
60

W
WestLangley 已提交
61
			var u0 = i * inverseSegments;
62
			var v0 = j * inversePointLength;
W
WestLangley 已提交
63
			var u1 = u0 + inverseSegments;
64 65
			var v1 = v0 + inversePointLength;

66
			this.faceVertexUvs[ 0 ].push( [
67

68 69 70 71
				new THREE.Vector2( u0, v0 ), 
				new THREE.Vector2( u1, v0 ),
				new THREE.Vector2( u1, v1 ),
				new THREE.Vector2( u0, v1 )
M
Mr.doob 已提交
72

73 74 75 76 77 78
			] );

		}

	}

W
WestLangley 已提交
79
	this.mergeVertices();
80 81 82 83 84 85
	this.computeCentroids();
	this.computeFaceNormals();
	this.computeVertexNormals();

};

86
THREE.LatheGeometry.prototype = Object.create( THREE.Geometry.prototype );