1 | /**
|
---|
2 | * @author zz85 / https://github.com/zz85
|
---|
3 | * Parametric Surfaces Geometry
|
---|
4 | * based on the brilliant article by @prideout http://prideout.net/blog/?p=44
|
---|
5 | *
|
---|
6 | * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements );
|
---|
7 | *
|
---|
8 | */
|
---|
9 |
|
---|
10 | THREE.ParametricGeometry = function ( func, slices, stacks ) {
|
---|
11 |
|
---|
12 | THREE.Geometry.call( this );
|
---|
13 |
|
---|
14 | var verts = this.vertices;
|
---|
15 | var faces = this.faces;
|
---|
16 | var uvs = this.faceVertexUvs[ 0 ];
|
---|
17 |
|
---|
18 | var i, il, j, p;
|
---|
19 | var u, v;
|
---|
20 |
|
---|
21 | var stackCount = stacks + 1;
|
---|
22 | var sliceCount = slices + 1;
|
---|
23 |
|
---|
24 | for ( i = 0; i <= stacks; i ++ ) {
|
---|
25 |
|
---|
26 | v = i / stacks;
|
---|
27 |
|
---|
28 | for ( j = 0; j <= slices; j ++ ) {
|
---|
29 |
|
---|
30 | u = j / slices;
|
---|
31 |
|
---|
32 | p = func( u, v );
|
---|
33 | verts.push( p );
|
---|
34 |
|
---|
35 | }
|
---|
36 | }
|
---|
37 |
|
---|
38 | var a, b, c, d;
|
---|
39 | var uva, uvb, uvc, uvd;
|
---|
40 |
|
---|
41 | for ( i = 0; i < stacks; i ++ ) {
|
---|
42 |
|
---|
43 | for ( j = 0; j < slices; j ++ ) {
|
---|
44 |
|
---|
45 | a = i * sliceCount + j;
|
---|
46 | b = i * sliceCount + j + 1;
|
---|
47 | c = (i + 1) * sliceCount + j + 1;
|
---|
48 | d = (i + 1) * sliceCount + j;
|
---|
49 |
|
---|
50 | uva = new THREE.Vector2( j / slices, i / stacks );
|
---|
51 | uvb = new THREE.Vector2( ( j + 1 ) / slices, i / stacks );
|
---|
52 | uvc = new THREE.Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks );
|
---|
53 | uvd = new THREE.Vector2( j / slices, ( i + 1 ) / stacks );
|
---|
54 |
|
---|
55 | faces.push( new THREE.Face3( a, b, d ) );
|
---|
56 | uvs.push( [ uva, uvb, uvd ] );
|
---|
57 |
|
---|
58 | faces.push( new THREE.Face3( b, c, d ) );
|
---|
59 | uvs.push( [ uvb.clone(), uvc, uvd.clone() ] );
|
---|
60 |
|
---|
61 | }
|
---|
62 |
|
---|
63 | }
|
---|
64 |
|
---|
65 | // console.log(this);
|
---|
66 |
|
---|
67 | // magic bullet
|
---|
68 | // var diff = this.mergeVertices();
|
---|
69 | // console.log('removed ', diff, ' vertices by merging');
|
---|
70 |
|
---|
71 | this.computeCentroids();
|
---|
72 | this.computeFaceNormals();
|
---|
73 | this.computeVertexNormals();
|
---|
74 |
|
---|
75 | };
|
---|
76 |
|
---|
77 | THREE.ParametricGeometry.prototype = Object.create( THREE.Geometry.prototype );
|
---|