examples/FBXLoader.js
function ( parentGeo, parentGeoNode, morphGeoNode, preTransform ) {

			var morphGeo = new THREE.BufferGeometry();
			if ( morphGeoNode.attrName ) morphGeo.name = morphGeoNode.attrName;

			var vertexIndices = ( parentGeoNode.PolygonVertexIndex !== undefined ) ? parentGeoNode.PolygonVertexIndex.a : [];

			// make a copy of the parent's vertex positions
			var vertexPositions = ( parentGeoNode.Vertices !== undefined ) ? parentGeoNode.Vertices.a.slice() : [];

			var morphPositions = ( morphGeoNode.Vertices !== undefined ) ? morphGeoNode.Vertices.a : [];
			var indices = ( morphGeoNode.Indexes !== undefined ) ? morphGeoNode.Indexes.a : [];

			for ( var i = 0; i < indices.length; i ++ ) {

				var morphIndex = indices[ i ] * 3;

				// FBX format uses blend shapes rather than morph targets. This can be converted
				// by additively combining the blend shape positions with the original geometry's positions
				vertexPositions[ morphIndex ] += morphPositions[ i * 3 ];
				vertexPositions[ morphIndex + 1 ] += morphPositions[ i * 3 + 1 ];
				vertexPositions[ morphIndex + 2 ] += morphPositions[ i * 3 + 2 ];

			}

			// TODO: add morph normal support
			var morphGeoInfo = {
				vertexIndices: vertexIndices,
				vertexPositions: vertexPositions,
			};

			var morphBuffers = this.genBuffers( morphGeoInfo );

			var positionAttribute = new THREE.Float32BufferAttribute( morphBuffers.vertex, 3 );
			positionAttribute.name = morphGeoNode.attrName;

			preTransform.applyToBufferAttribute( positionAttribute );

			parentGeo.morphAttributes.position.push( positionAttribute );

		}
function ( parentGeo, parentGeoNode, morphGeoNode, preTransform ) {

			var morphGeo = new THREE.BufferGeometry();
			if ( morphGeoNode.attrName ) morphGeo.name = morphGeoNode.attrName;

			var vertexIndices = ( parentGeoNode.PolygonVertexIndex !== undefined ) ? parentGeoNode.PolygonVertexIndex.a : [];

			// make a copy of the parent's vertex positions
			var vertexPositions = ( parentGeoNode.Vertices !== undefined ) ? parentGeoNode.Vertices.a.slice() : [];

			var morphPositions = ( morphGeoNode.Vertices !== undefined ) ? morphGeoNode.Vertices.a : [];
			var indices = ( morphGeoNode.Indexes !== undefined ) ? morphGeoNode.Indexes.a : [];

			for ( var i = 0; i < indices.length; i ++ ) {

				var morphIndex = indices[ i ] * 3;

				// FBX format uses blend shapes rather than morph targets. This can be converted
				// by additively combining the blend shape positions with the original geometry's positions
				vertexPositions[ morphIndex ] += morphPositions[ i * 3 ];
				vertexPositions[ morphIndex + 1 ] += morphPositions[ i * 3 + 1 ];
				vertexPositions[ morphIndex + 2 ] += morphPositions[ i * 3 + 2 ];

			}

			// TODO: add morph normal support
			var morphGeoInfo = {
				vertexIndices: vertexIndices,
				vertexPositions: vertexPositions,
			};

			var morphBuffers = this.genBuffers( morphGeoInfo );

			var positionAttribute = new THREE.Float32BufferAttribute( morphBuffers.vertex, 3 );
			positionAttribute.name = morphGeoNode.attrName;

			preTransform.applyToBufferAttribute( positionAttribute );

			parentGeo.morphAttributes.position.push( positionAttribute );

		}
function ( parentGeo , parentGeoNode , morphGeoNode , preTransform ) { var morphGeo = new THREE . BufferGeometry ( ) ; if ( morphGeoNode . attrName ) morphGeo . name = morphGeoNode . attrName ; var vertexIndices = ( parentGeoNode . PolygonVertexIndex !== undefined ) ? parentGeoNode . PolygonVertexIndex . a : [ ] ; // make a copy of the parent's vertex positions var vertexPositions = ( parentGeoNode . Vertices !== undefined ) ? parentGeoNode . Vertices . a . slice ( ) : [ ] ; var morphPositions = ( morphGeoNode . Vertices !== undefined ) ? morphGeoNode . Vertices . a : [ ] ; var indices = ( morphGeoNode . Indexes !== undefined ) ? morphGeoNode . Indexes . a : [ ] ; for ( var i = 0 ; i < indices . length ; i ++ ) { var morphIndex = indices [ i ] * 3 ; // FBX format uses blend shapes rather than morph targets. This can be converted // by additively combining the blend shape positions with the original geometry's positions vertexPositions [ morphIndex ] += morphPositions [ i * 3 ] ; vertexPositions [ morphIndex + 1 ] += morphPositions [ i * 3 + 1 ] ; vertexPositions [ morphIndex + 2 ] += morphPositions [ i * 3 + 2 ] ; } // TODO: add morph normal support var morphGeoInfo = { vertexIndices : vertexIndices , vertexPositions : vertexPositions , } ; var morphBuffers = this . genBuffers ( morphGeoInfo ) ; var positionAttribute = new THREE . Float32BufferAttribute ( morphBuffers . vertex , 3 ) ; positionAttribute . name = morphGeoNode . attrName ; preTransform . applyToBufferAttribute ( positionAttribute ) ; parentGeo . morphAttributes . position . push ( positionAttribute ) ; }
a morph geometry node is similar to a standard  node, and the node is also contained in FBXTree.Objects.Geometry, however it can only have attributes for position, normal and a special attribute Index defining which vertices of the original geometry are affected Normal and position attributes only have data for the vertices that are affected by the morph
a morph geometry node is similar to a standard node and the node is also contained in FBXTree . Objects . Geometry however it can only have attributes for position normal and a special attribute Index defining which vertices of the original geometry are affected Normal and position attributes only have data for the vertices that are affected by the morph