1
- var EPSILON = 1e-6 ;
1
+ var DEFAULT_NORMALS_EPSILON = 1e-6 ;
2
+ var DEFAULT_FACE_EPSILON = 1e-6 ;
2
3
3
4
//Estimate the vertex normals of a mesh
4
- exports . vertexNormals = function ( faces , positions ) {
5
-
5
+ exports . vertexNormals = function ( faces , positions , specifiedEpsilon ) {
6
+
6
7
var N = positions . length ;
7
8
var normals = new Array ( N ) ;
8
-
9
+ var epsilon = specifiedEpsilon === void ( 0 ) ? DEFAULT_NORMALS_EPSILON : specifiedEpsilon ;
10
+
9
11
//Initialize normal array
10
12
for ( var i = 0 ; i < N ; ++ i ) {
11
13
normals [ i ] = [ 0.0 , 0.0 , 0.0 ] ;
12
14
}
13
-
15
+
14
16
//Walk over all the faces and add per-vertex contribution to normal weights
15
17
for ( var i = 0 ; i < faces . length ; ++ i ) {
16
18
var f = faces [ i ] ;
17
19
var p = 0 ;
18
20
var c = f [ f . length - 1 ] ;
19
21
var n = f [ 0 ] ;
20
22
for ( var j = 0 ; j < f . length ; ++ j ) {
21
-
23
+
22
24
//Shift indices back
23
25
p = c ;
24
26
c = n ;
25
27
n = f [ ( j + 1 ) % f . length ] ;
26
-
28
+
27
29
var v0 = positions [ p ] ;
28
30
var v1 = positions [ c ] ;
29
31
var v2 = positions [ n ] ;
30
-
32
+
31
33
//Compute infineteismal arcs
32
34
var d01 = new Array ( 3 ) ;
33
35
var m01 = 0.0 ;
@@ -41,7 +43,7 @@ exports.vertexNormals = function(faces, positions) {
41
43
}
42
44
43
45
//Accumulate values in normal
44
- if ( m01 * m21 > EPSILON ) {
46
+ if ( m01 * m21 > epsilon ) {
45
47
var norm = normals [ c ] ;
46
48
var w = 1.0 / Math . sqrt ( m01 * m21 ) ;
47
49
for ( var k = 0 ; k < 3 ; ++ k ) {
@@ -52,15 +54,15 @@ exports.vertexNormals = function(faces, positions) {
52
54
}
53
55
}
54
56
}
55
-
57
+
56
58
//Scale all normals to unit length
57
59
for ( var i = 0 ; i < N ; ++ i ) {
58
60
var norm = normals [ i ] ;
59
61
var m = 0.0 ;
60
62
for ( var k = 0 ; k < 3 ; ++ k ) {
61
63
m += norm [ k ] * norm [ k ] ;
62
64
}
63
- if ( m > EPSILON ) {
65
+ if ( m > epsilon ) {
64
66
var w = 1.0 / Math . sqrt ( m ) ;
65
67
for ( var k = 0 ; k < 3 ; ++ k ) {
66
68
norm [ k ] *= w ;
@@ -77,24 +79,26 @@ exports.vertexNormals = function(faces, positions) {
77
79
}
78
80
79
81
//Compute face normals of a mesh
80
- exports . faceNormals = function ( faces , positions ) {
82
+ exports . faceNormals = function ( faces , positions , specifiedEpsilon ) {
83
+
81
84
var N = faces . length ;
82
85
var normals = new Array ( N ) ;
83
-
86
+ var epsilon = specifiedEpsilon === void ( 0 ) ? DEFAULT_FACE_EPSILON : specifiedEpsilon ;
87
+
84
88
for ( var i = 0 ; i < N ; ++ i ) {
85
89
var f = faces [ i ] ;
86
90
var pos = new Array ( 3 ) ;
87
91
for ( var j = 0 ; j < 3 ; ++ j ) {
88
92
pos [ j ] = positions [ f [ j ] ] ;
89
93
}
90
-
94
+
91
95
var d01 = new Array ( 3 ) ;
92
96
var d21 = new Array ( 3 ) ;
93
97
for ( var j = 0 ; j < 3 ; ++ j ) {
94
98
d01 [ j ] = pos [ 1 ] [ j ] - pos [ 0 ] [ j ] ;
95
99
d21 [ j ] = pos [ 2 ] [ j ] - pos [ 0 ] [ j ] ;
96
100
}
97
-
101
+
98
102
var n = new Array ( 3 ) ;
99
103
var l = 0.0 ;
100
104
for ( var j = 0 ; j < 3 ; ++ j ) {
@@ -103,7 +107,7 @@ exports.faceNormals = function(faces, positions) {
103
107
n [ j ] = d01 [ u ] * d21 [ v ] - d01 [ v ] * d21 [ u ] ;
104
108
l += n [ j ] * n [ j ] ;
105
109
}
106
- if ( l > EPSILON ) {
110
+ if ( l > epsilon ) {
107
111
l = 1.0 / Math . sqrt ( l ) ;
108
112
} else {
109
113
l = 0.0 ;
0 commit comments