소스 검색

Added Geometry.computeFlatVertexNormals() (#9222)

* Added computeFlatVertexNormals()

* Compute face normals only when necessary
WestLangley 8 년 전
부모
커밋
e3c5619ffd
2개의 변경된 파일43개의 추가작업 그리고 1개의 파일을 삭제
  1. 5 1
      docs/api/core/Geometry.html
  2. 38 0
      src/core/Geometry.js

+ 5 - 1
docs/api/core/Geometry.html

@@ -256,7 +256,11 @@
 		</div>
 		<div>
 		Computes vertex normals by averaging face normals.<br />
-		Face normals must be existing / computed beforehand.
+		</div>
+
+		<h3>[method:null computeFlatVertexNormals]()</h3>
+		<div>
+		Computes flat vertex normals. Sets the vertex normal of each vertex of each face to be the same as the face's normal.<br />
 		</div>
 
 		<h3>[method:null computeMorphNormals]()</h3>

+ 38 - 0
src/core/Geometry.js

@@ -453,6 +453,8 @@ Object.assign( Geometry.prototype, EventDispatcher.prototype, {
 
 		} else {
 
+			this.computeFaceNormals();
+
 			for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
 
 				face = this.faces[ f ];
@@ -501,6 +503,42 @@ Object.assign( Geometry.prototype, EventDispatcher.prototype, {
 
 	},
 
+	computeFlatVertexNormals: function () {
+
+		var f, fl, face;
+
+		this.computeFaceNormals();
+
+		for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
+
+			face = this.faces[ f ];
+
+			var vertexNormals = face.vertexNormals;
+
+			if ( vertexNormals.length === 3 ) {
+
+				vertexNormals[ 0 ].copy( face.normal );
+				vertexNormals[ 1 ].copy( face.normal );
+				vertexNormals[ 2 ].copy( face.normal );
+
+			} else {
+
+				vertexNormals[ 0 ] = face.normal.clone();
+				vertexNormals[ 1 ] = face.normal.clone();
+				vertexNormals[ 2 ] = face.normal.clone();
+
+			}
+
+		}
+
+		if ( this.faces.length > 0 ) {
+
+			this.normalsNeedUpdate = true;
+
+		}
+
+	},
+
 	computeMorphNormals: function () {
 
 		var i, il, f, fl, face;