Sfoglia il codice sorgente

assign an "adjustmentTransform" to loaders

fwang 3 anni fa
parent
commit
d2de4c5bc3
4 ha cambiato i file con 42 aggiunte e 15 eliminazioni
  1. 7 2
      src/three/B3DMLoader.js
  2. 8 3
      src/three/CMPTLoader.js
  3. 11 9
      src/three/I3DMLoader.js
  4. 16 1
      src/three/TilesRenderer.js

+ 7 - 2
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,7 +8,7 @@ export class B3DMLoader extends B3DMLoaderBase {
 
 		super();
 		this.manager = manager;
-
+		this.adjustmentTransform = new Matrix4();
 	}
 
 	parse( buffer ) {
@@ -47,6 +47,8 @@ export class B3DMLoader extends B3DMLoaderBase {
 
 			}
 
+			let adjustmentTransform = this.adjustmentTransform;
+
 			loader.parse( gltfBuffer, workingPath, model => {
 
 				const { batchTable, featureTable } = b3dm;
@@ -61,6 +63,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;
 

+ 8 - 3
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,13 +10,14 @@ export class CMPTLoader extends CMPTLoaderBase {
 
 		super();
 		this.manager = manager;
-
+		this.adjustmentTransform = new Matrix4();
 	}
 
 	parse( buffer ) {
 
 		const result = super.parse( buffer );
 		const manager = this.manager;
+		const adjustmentTransform = this.adjustmentTransform;
 		const promises = [];
 
 		for ( const i in result.tiles ) {
@@ -31,6 +32,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;
@@ -55,7 +58,9 @@ export class CMPTLoader extends CMPTLoaderBase {
 					const loader = new I3DMLoader( manager );
 					loader.workingPath = this.workingPath;
 					loader.fetchOptions = this.fetchOptions;
-
+					
+					loader.adjustmentTransform.copy( adjustmentTransform );
+					
 					const promise = loader.parse( slicedBuffer.buffer );
 					promises.push( promise );
 					break;

+ 11 - 9
src/three/I3DMLoader.js

@@ -1,5 +1,5 @@
 import { I3DMLoaderBase } from '../base/I3DMLoaderBase.js';
-import { DefaultLoadingManager, Matrix4, InstancedMesh, Vector3, Quaternion,Euler } from 'three';
+import { DefaultLoadingManager, Matrix4, InstancedMesh, Vector3, Quaternion } from 'three';
 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
 
 const tempFwd = new Vector3();
@@ -15,7 +15,7 @@ export class I3DMLoader extends I3DMLoaderBase {
 
 		super();
 		this.manager = manager;
-
+		this.adjustmentTransform = new Matrix4();
 	}
 
 	resolveExternalURL( url ) {
@@ -64,6 +64,8 @@ export class I3DMLoader extends I3DMLoaderBase {
 
 					}
 
+					let adjustmentTransform = this.adjustmentTransform;
+
 					loader.parse( gltfBuffer, workingPath, model => {
 
 						const INSTANCES_LENGTH = featureTable.getData( 'INSTANCES_LENGTH' );
@@ -202,13 +204,14 @@ export class I3DMLoader extends I3DMLoaderBase {
 							}
 
 
-							const m = new Matrix4();
-							m.set(1.0, 0.0,  0.0, 0.0,
-								0.0, 0.0, -1.0, 0.0,
-								0.0, 1.0,  0.0, 0.0,
-								0.0, 0.0,  0.0, 1.0);
-							tempMat.compose( tempPos, tempQuat, tempSca ).multiply(m);
+							// const m = new Matrix4();
+							// m.set(1.0, 0.0,  0.0, 0.0,
+							// 	0.0, 0.0, -1.0, 0.0,
+							// 	0.0, 1.0,  0.0, 0.0,
+							// 	0.0, 0.0,  0.0, 1.0);
+							// tempMat.compose( tempPos, tempQuat, tempSca ).multiply(m);
 							// tempMat.compose( tempPos, tempQuat, tempSca );
+							tempMat.compose( tempPos, tempQuat, tempSca ).multiply(adjustmentTransform);
 
 							for ( let j = 0, l = instances.length; j < l; j ++ ) {
 
@@ -219,7 +222,6 @@ export class I3DMLoader extends I3DMLoaderBase {
 
 						}
 
-						model.scene.rotation.copy(new Euler(model.scene.rotation.x - Math.PI/2,model.scene.rotation.y,model.scene.rotation.z,'XYZ'))
 
 						model.batchTable = batchTable;
 						model.featureTable = featureTable;

+ 16 - 1
src/three/TilesRenderer.js

@@ -580,6 +580,12 @@ export class TilesRenderer extends TilesRendererBase {
 		const loadIndex = tile._loadIndex;
 		let promise = null;
 
+		const m = new Matrix4();
+		m.set(1.0, 0.0,  0.0, 0.0,
+			0.0, 0.0, -1.0, 0.0,
+			0.0, 1.0,  0.0, 0.0,
+			0.0, 0.0,  0.0, 1.0);
+
 		switch ( extension ) {
 
 			case 'b3dm': {
@@ -587,6 +593,9 @@ export class TilesRenderer extends TilesRendererBase {
 				const loader = new B3DMLoader( manager );
 				loader.workingPath = workingPath;
 				loader.fetchOptions = fetchOptions;
+
+				loader.adjustmentTransform.copy(m);
+
 				promise = loader
 					.parse( buffer )
 					.then( res => res.scene );
@@ -611,6 +620,9 @@ export class TilesRenderer extends TilesRendererBase {
 				const loader = new I3DMLoader( manager );
 				loader.workingPath = workingPath;
 				loader.fetchOptions = fetchOptions;
+
+				loader.adjustmentTransform.copy(m);
+
 				promise = loader
 					.parse( buffer )
 					.then( res => res.scene );
@@ -623,6 +635,9 @@ export class TilesRenderer extends TilesRendererBase {
 				const loader = new CMPTLoader( manager );
 				loader.workingPath = workingPath;
 				loader.fetchOptions = fetchOptions;
+
+				loader.adjustmentTransform.copy(m);
+
 				promise = loader
 					.parse( buffer )
 					.then( res => res.scene	);
@@ -684,7 +699,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 );