Quellcode durchsuchen

Merge pull request #260 from Michelle1009/master

fix the problem of CMPT file loaded incorrectly
Garrett Johnson vor 3 Jahren
Ursprung
Commit
3e3bbeb9a6
4 geänderte Dateien mit 50 neuen und 25 gelöschten Zeilen
  1. 7 1
      src/three/B3DMLoader.js
  2. 7 1
      src/three/CMPTLoader.js
  3. 6 1
      src/three/I3DMLoader.js
  4. 30 22
      src/three/TilesRenderer.js

+ 7 - 1
src/three/B3DMLoader.js

@@ -1,5 +1,5 @@
 import { B3DMLoaderBase } from '../base/B3DMLoaderBase.js';
-import { DefaultLoadingManager } from 'three';
+import { DefaultLoadingManager, Matrix4 } from 'three';
 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
 
 export class B3DMLoader extends B3DMLoaderBase {
@@ -8,6 +8,7 @@ export class B3DMLoader extends B3DMLoaderBase {
 
 		super();
 		this.manager = manager;
+		this.adjustmentTransform = new Matrix4();
 
 	}
 
@@ -47,6 +48,8 @@ export class B3DMLoader extends B3DMLoaderBase {
 
 			}
 
+			const adjustmentTransform = this.adjustmentTransform;
+
 			loader.parse( gltfBuffer, workingPath, model => {
 
 				const { batchTable, featureTable } = b3dm;
@@ -61,6 +64,9 @@ export class B3DMLoader extends B3DMLoaderBase {
 
 				}
 
+				model.scene.matrix.multiply( adjustmentTransform );
+				model.scene.matrix.decompose( model.scene.position, model.scene.quaternion, model.scene.scale );
+
 				model.batchTable = batchTable;
 				model.featureTable = featureTable;
 

+ 7 - 1
src/three/CMPTLoader.js

@@ -1,4 +1,4 @@
-import { Group, DefaultLoadingManager } from 'three';
+import { Group, DefaultLoadingManager, Matrix4 } from 'three';
 import { CMPTLoaderBase } from '../base/CMPTLoaderBase.js';
 import { B3DMLoader } from './B3DMLoader.js';
 import { PNTSLoader } from './PNTSLoader.js';
@@ -10,6 +10,7 @@ export class CMPTLoader extends CMPTLoaderBase {
 
 		super();
 		this.manager = manager;
+		this.adjustmentTransform = new Matrix4();
 
 	}
 
@@ -17,6 +18,7 @@ export class CMPTLoader extends CMPTLoaderBase {
 
 		const result = super.parse( buffer );
 		const manager = this.manager;
+		const adjustmentTransform = this.adjustmentTransform;
 		const promises = [];
 
 		for ( const i in result.tiles ) {
@@ -31,6 +33,8 @@ export class CMPTLoader extends CMPTLoaderBase {
 					loader.workingPath = this.workingPath;
 					loader.fetchOptions = this.fetchOptions;
 
+					loader.adjustmentTransform.copy( adjustmentTransform );
+
 					const promise = loader.parse( slicedBuffer.buffer );
 					promises.push( promise );
 					break;
@@ -56,6 +60,8 @@ export class CMPTLoader extends CMPTLoaderBase {
 					loader.workingPath = this.workingPath;
 					loader.fetchOptions = this.fetchOptions;
 
+					loader.adjustmentTransform.copy( adjustmentTransform );
+
 					const promise = loader.parse( slicedBuffer.buffer );
 					promises.push( promise );
 					break;

+ 6 - 1
src/three/I3DMLoader.js

@@ -15,6 +15,7 @@ export class I3DMLoader extends I3DMLoaderBase {
 
 		super();
 		this.manager = manager;
+		this.adjustmentTransform = new Matrix4();
 
 	}
 
@@ -64,6 +65,8 @@ export class I3DMLoader extends I3DMLoaderBase {
 
 					}
 
+					const adjustmentTransform = this.adjustmentTransform;
+
 					loader.parse( gltfBuffer, workingPath, model => {
 
 						const INSTANCES_LENGTH = featureTable.getData( 'INSTANCES_LENGTH' );
@@ -201,7 +204,8 @@ export class I3DMLoader extends I3DMLoaderBase {
 
 							}
 
-							tempMat.compose( tempPos, tempQuat, tempSca );
+
+							tempMat.compose( tempPos, tempQuat, tempSca ).multiply( adjustmentTransform );
 
 							for ( let j = 0, l = instances.length; j < l; j ++ ) {
 
@@ -212,6 +216,7 @@ export class I3DMLoader extends I3DMLoaderBase {
 
 						}
 
+
 						model.batchTable = batchTable;
 						model.featureTable = featureTable;
 

+ 30 - 22
src/three/TilesRenderer.js

@@ -580,6 +580,26 @@ export class TilesRenderer extends TilesRendererBase {
 		const loadIndex = tile._loadIndex;
 		let promise = null;
 
+		const upAxis = this.rootTileSet.asset && this.rootTileSet.asset.gltfUpAxis || 'y';
+		const cached = tile.cached;
+		const cachedTransform = cached.transform;
+
+		switch ( upAxis.toLowerCase() ) {
+
+			case 'x':
+				tempMat.makeRotationAxis( Y_AXIS, - Math.PI / 2 );
+				break;
+
+			case 'y':
+				tempMat.makeRotationAxis( X_AXIS, Math.PI / 2 );
+				break;
+
+			case 'z':
+				tempMat.identity();
+				break;
+
+		}
+
 		switch ( extension ) {
 
 			case 'b3dm': {
@@ -587,6 +607,9 @@ export class TilesRenderer extends TilesRendererBase {
 				const loader = new B3DMLoader( manager );
 				loader.workingPath = workingPath;
 				loader.fetchOptions = fetchOptions;
+
+				loader.adjustmentTransform.copy( tempMat );
+
 				promise = loader
 					.parse( buffer )
 					.then( res => res.scene );
@@ -611,6 +634,9 @@ export class TilesRenderer extends TilesRendererBase {
 				const loader = new I3DMLoader( manager );
 				loader.workingPath = workingPath;
 				loader.fetchOptions = fetchOptions;
+
+				loader.adjustmentTransform.copy( tempMat );
+
 				promise = loader
 					.parse( buffer )
 					.then( res => res.scene );
@@ -623,6 +649,9 @@ export class TilesRenderer extends TilesRendererBase {
 				const loader = new CMPTLoader( manager );
 				loader.workingPath = workingPath;
 				loader.fetchOptions = fetchOptions;
+
+				loader.adjustmentTransform.copy( tempMat );
+
 				promise = loader
 					.parse( buffer )
 					.then( res => res.scene	);
@@ -655,27 +684,6 @@ export class TilesRenderer extends TilesRendererBase {
 				return;
 
 			}
-
-			const upAxis = this.rootTileSet.asset && this.rootTileSet.asset.gltfUpAxis || 'y';
-			const cached = tile.cached;
-			const cachedTransform = cached.transform;
-
-			switch ( upAxis.toLowerCase() ) {
-
-				case 'x':
-					tempMat.makeRotationAxis( Y_AXIS, - Math.PI / 2 );
-					break;
-
-				case 'y':
-					tempMat.makeRotationAxis( X_AXIS, Math.PI / 2 );
-					break;
-
-				case 'z':
-					tempMat.identity();
-					break;
-
-			}
-
 			// ensure the matrix is up to date in case the scene has a transform applied
 			scene.updateMatrix();
 
@@ -684,7 +692,7 @@ export class TilesRenderer extends TilesRendererBase {
 			// any transformations applied to it can be assumed to be applied after load
 			// (such as applying RTC_CENTER) meaning they should happen _after_ the z-up
 			// rotation fix which is why "multiply" happens here.
-			if ( extension !== 'pnts' ) {
+			if ( extension === 'glb' || extension === 'gltf' ) {
 
 				scene.matrix.multiply( tempMat );