Prechádzať zdrojové kódy

LDrawLoader: Fix slanted normals (#22181)

* fix ldraw normals

* Clarity
Garrett Johnson 4 rokov pred
rodič
commit
29ed28031c
1 zmenil súbory, kde vykonal 28 pridanie a 23 odobranie
  1. 28 23
      examples/jsm/loaders/LDrawLoader.js

+ 28 - 23
examples/jsm/loaders/LDrawLoader.js

@@ -227,13 +227,6 @@ function smoothNormals( triangles, lineSegments ) {
 
 
 	}
 	}
 
 
-	// NOTE: Some of the normals wind up being skewed in an unexpected way because
-	// quads provide more "influence" to some vertex normals than a triangle due to
-	// the fact that a quad is made up of two triangles and all triangles are weighted
-	// equally. To fix this quads could be tracked separately so their vertex normals
-	// are weighted appropriately or we could try only adding a normal direction
-	// once per normal.
-
 	// Iterate until we've tried to connect all triangles to share normals
 	// Iterate until we've tried to connect all triangles to share normals
 	while ( true ) {
 	while ( true ) {
 
 
@@ -253,14 +246,14 @@ function smoothNormals( triangles, lineSegments ) {
 			const faceNormal = tri.faceNormal;
 			const faceNormal = tri.faceNormal;
 			if ( tri.n0 === null ) {
 			if ( tri.n0 === null ) {
 
 
-				tri.n0 = faceNormal.clone();
+				tri.n0 = faceNormal.clone().multiplyScalar( tri.fromQuad ? 0.5 : 1.0 );
 				normals.push( tri.n0 );
 				normals.push( tri.n0 );
 
 
 			}
 			}
 
 
 			if ( tri.n1 === null ) {
 			if ( tri.n1 === null ) {
 
 
-				tri.n1 = faceNormal.clone();
+				tri.n1 = faceNormal.clone().multiplyScalar( tri.fromQuad ? 0.5 : 1.0 );
 				normals.push( tri.n1 );
 				normals.push( tri.n1 );
 
 
 			}
 			}
@@ -322,7 +315,9 @@ function smoothNormals( triangles, lineSegments ) {
 
 
 								const norm = tri[ `n${ next }` ];
 								const norm = tri[ `n${ next }` ];
 								otherTri[ `n${ otherIndex }` ] = norm;
 								otherTri[ `n${ otherIndex }` ] = norm;
-								norm.add( otherTri.faceNormal );
+
+								const isDoubledVert = otherTri.fromQuad && otherIndex !== 2;
+								norm.addScaledVector( otherTri.faceNormal, isDoubledVert ? 0.5 : 1.0 );
 
 
 							}
 							}
 
 
@@ -330,7 +325,9 @@ function smoothNormals( triangles, lineSegments ) {
 
 
 								const norm = tri[ `n${ index }` ];
 								const norm = tri[ `n${ index }` ];
 								otherTri[ `n${ otherNext }` ] = norm;
 								otherTri[ `n${ otherNext }` ] = norm;
-								norm.add( otherTri.faceNormal );
+
+								const isDoubledVert = otherTri.fromQuad && otherNext !== 2;
+								norm.addScaledVector( otherTri.faceNormal, isDoubledVert ? 0.5 : 1.0 );
 
 
 							}
 							}
 
 
@@ -1521,7 +1518,8 @@ class LDrawLoader extends Loader {
 						faceNormal: faceNormal,
 						faceNormal: faceNormal,
 						n0: null,
 						n0: null,
 						n1: null,
 						n1: null,
-						n2: null
+						n2: null,
+						fromQuad: false,
 					} );
 					} );
 
 
 					if ( doubleSided === true ) {
 					if ( doubleSided === true ) {
@@ -1535,7 +1533,8 @@ class LDrawLoader extends Loader {
 							faceNormal: faceNormal,
 							faceNormal: faceNormal,
 							n0: null,
 							n0: null,
 							n1: null,
 							n1: null,
-							n2: null
+							n2: null,
+							fromQuad: false,
 						} );
 						} );
 
 
 					}
 					}
@@ -1573,16 +1572,19 @@ class LDrawLoader extends Loader {
 						.crossVectors( _tempVec0, _tempVec1 )
 						.crossVectors( _tempVec0, _tempVec1 )
 						.normalize();
 						.normalize();
 
 
+					// specifically place the triangle diagonal in the v0 and v1 slots so we can
+					// account for the doubling of vertices later when smoothing normals.
 					triangles.push( {
 					triangles.push( {
 						material: material,
 						material: material,
 						colourCode: material.userData.code,
 						colourCode: material.userData.code,
-						v0: v0,
-						v1: v1,
-						v2: v2,
+						v0: v2,
+						v1: v0,
+						v2: v1,
 						faceNormal: faceNormal,
 						faceNormal: faceNormal,
 						n0: null,
 						n0: null,
 						n1: null,
 						n1: null,
-						n2: null
+						n2: null,
+						fromQuad: true,
 					} );
 					} );
 
 
 					triangles.push( {
 					triangles.push( {
@@ -1594,7 +1596,8 @@ class LDrawLoader extends Loader {
 						faceNormal: faceNormal,
 						faceNormal: faceNormal,
 						n0: null,
 						n0: null,
 						n1: null,
 						n1: null,
-						n2: null
+						n2: null,
+						fromQuad: true,
 					} );
 					} );
 
 
 					if ( doubleSided === true ) {
 					if ( doubleSided === true ) {
@@ -1608,19 +1611,21 @@ class LDrawLoader extends Loader {
 							faceNormal: faceNormal,
 							faceNormal: faceNormal,
 							n0: null,
 							n0: null,
 							n1: null,
 							n1: null,
-							n2: null
+							n2: null,
+							fromQuad: true,
 						} );
 						} );
 
 
 						triangles.push( {
 						triangles.push( {
 							material: material,
 							material: material,
 							colourCode: material.userData.code,
 							colourCode: material.userData.code,
-							v0: v0,
-							v1: v3,
-							v2: v2,
+							v0: v2,
+							v1: v0,
+							v2: v3,
 							faceNormal: faceNormal,
 							faceNormal: faceNormal,
 							n0: null,
 							n0: null,
 							n1: null,
 							n1: null,
-							n2: null
+							n2: null,
+							fromQuad: true,
 						} );
 						} );
 
 
 					}
 					}