Browse Source

Merge pull request #12744 from looeee/FBXLoader_apply_geometric_transforms_in_genGeo_method

FBXLoader: Moved geometric transforms to genGeo method
Mr.doob 7 years ago
parent
commit
4a8d744edb
1 changed files with 46 additions and 43 deletions
  1. 46 43
      examples/js/loaders/FBXLoader.js

+ 46 - 43
examples/js/loaders/FBXLoader.js

@@ -675,7 +675,7 @@
 			for ( var nodeID in geometryNodes ) {
 			for ( var nodeID in geometryNodes ) {
 
 
 				var relationships = connections.get( parseInt( nodeID ) );
 				var relationships = connections.get( parseInt( nodeID ) );
-				var geo = parseGeometry( geometryNodes[ nodeID ], relationships, deformers );
+				var geo = parseGeometry( FBXTree, relationships, geometryNodes[ nodeID ], deformers );
 				geometryMap.set( parseInt( nodeID ), geo );
 				geometryMap.set( parseInt( nodeID ), geo );
 
 
 			}
 			}
@@ -687,12 +687,12 @@
 	}
 	}
 
 
 	// Parse single node in FBXTree.Objects.subNodes.Geometry
 	// Parse single node in FBXTree.Objects.subNodes.Geometry
-	function parseGeometry( geometryNode, relationships, deformers ) {
+	function parseGeometry( FBXTree, relationships, geometryNode, deformers ) {
 
 
 		switch ( geometryNode.attrType ) {
 		switch ( geometryNode.attrType ) {
 
 
 			case 'Mesh':
 			case 'Mesh':
-				return parseMeshGeometry( geometryNode, relationships, deformers );
+				return parseMeshGeometry( FBXTree, relationships, geometryNode, deformers );
 				break;
 				break;
 
 
 			case 'NurbsCurve':
 			case 'NurbsCurve':
@@ -704,7 +704,7 @@
 	}
 	}
 
 
 	// Parse single node mesh geometry in FBXTree.Objects.subNodes.Geometry
 	// Parse single node mesh geometry in FBXTree.Objects.subNodes.Geometry
-	function parseMeshGeometry( geometryNode, relationships, deformers ) {
+	function parseMeshGeometry( FBXTree, relationships, geometryNode, deformers ) {
 
 
 		for ( var i = 0; i < relationships.children.length; ++ i ) {
 		for ( var i = 0; i < relationships.children.length; ++ i ) {
 
 
@@ -713,12 +713,47 @@
 
 
 		}
 		}
 
 
-		return genGeometry( geometryNode, deformer );
+		var modelNodes = relationships.parents.map( function ( parent ) {
+
+			var modelNode = FBXTree.Objects.subNodes.Model[ parent.ID ];
+
+			return modelNode;
+
+		} );
+
+		// don't create geometry if it is not associated with any models
+		if ( modelNodes.length === 0 ) return;
+
+		var preTransform = new THREE.Matrix4();
+
+		// TODO: if there is more than one model associated with the geometry, AND the models have
+		// different geometric transforms, then this will cause problems
+		// if ( modelNodes.length > 1 ) { }
+
+		// For now just assume one model and get the preRotations from that
+		var modelNode = modelNodes[ 0 ];
+
+		if ( 'GeometricRotation' in modelNode.properties ) {
+
+			var array = modelNode.properties.GeometricRotation.value.map( THREE.Math.degToRad );
+			array[ 3 ] = 'ZYX';
+
+			preTransform.makeRotationFromEuler( new THREE.Euler().fromArray( array ) );
+
+		}
+
+		if ( 'GeometricTranslation' in modelNode.properties ) {
+
+			preTransform.setPosition( new THREE.Vector3().fromArray( modelNode.properties.GeometricTranslation.value ) );
+
+		}
+
+		return genGeometry( FBXTree, relationships, geometryNode, deformer, preTransform );
 
 
 	}
 	}
 
 
 	// Generate a THREE.BufferGeometry from a node in FBXTree.Objects.subNodes.Geometry
 	// Generate a THREE.BufferGeometry from a node in FBXTree.Objects.subNodes.Geometry
-	function genGeometry( geometryNode, deformer ) {
+	function genGeometry( FBXTree, relationships, geometryNode, deformer, preTransform ) {
 
 
 		var subNodes = geometryNode.subNodes;
 		var subNodes = geometryNode.subNodes;
 
 
@@ -1081,7 +1116,11 @@
 		var geo = new THREE.BufferGeometry();
 		var geo = new THREE.BufferGeometry();
 		geo.name = geometryNode.name;
 		geo.name = geometryNode.name;
 
 
-		geo.addAttribute( 'position', new THREE.Float32BufferAttribute( vertexBuffer, 3 ) );
+		var positionAttribute = new THREE.Float32BufferAttribute( vertexBuffer, 3 );
+
+		preTransform.applyToBufferAttribute( positionAttribute );
+
+		geo.addAttribute( 'position', positionAttribute );
 
 
 		if ( colorsBuffer.length > 0 ) {
 		if ( colorsBuffer.length > 0 ) {
 
 
@@ -1970,42 +2009,6 @@
 
 
 		}
 		}
 
 
-		// rotated pivots - note: rotation must be applied before translation here
-		if ( 'GeometricRotation' in modelNode.properties ) {
-
-			var array = modelNode.properties.GeometricRotation.value.map( THREE.Math.degToRad );
-
-			model.traverse( function ( child ) {
-
-				if ( child.geometry ) {
-
-					child.geometry.rotateX( array[ 0 ] );
-					child.geometry.rotateY( array[ 1 ] );
-					child.geometry.rotateZ( array[ 2 ] );
-
-				}
-
-			} );
-
-		}
-
-		// translated pivots
-		if ( 'GeometricTranslation' in modelNode.properties ) {
-
-			var array = modelNode.properties.GeometricTranslation.value;
-
-			model.traverse( function ( child ) {
-
-				if ( child.geometry ) {
-
-					child.geometry.translate( array[ 0 ], array[ 1 ], array[ 2 ] );
-
-				}
-
-			} );
-
-		}
-
 		if ( 'LookAtProperty' in modelNode.properties ) {
 		if ( 'LookAtProperty' in modelNode.properties ) {
 
 
 			var conns = connections.get( model.FBX_ID );
 			var conns = connections.get( model.FBX_ID );