xzw пре 2 година
родитељ
комит
068fcc05ec
6 измењених фајлова са 217 додато и 22 уклоњено
  1. 2 2
      example/mars.html
  2. 196 17
      example/mars.js
  3. 5 1
      src/base/TilesRendererBase.js
  4. 12 0
      src/index.js
  5. 1 1
      src/three/DebugTilesRenderer.js
  6. 1 1
      src/three/TilesRenderer.js

+ 2 - 2
example/mars.html

@@ -44,11 +44,11 @@
         </style>
     </head>
     <body>
-		<div id="info">
+		<!-- <div id="info">
 			Dingo Gap site reconstructed from multiple sols of Curiosity Rover and Mars Reconnaissance Orbiter images.
 			<br/>
 			See more information <a href="https://github.com/NASA-AMMOS/3DTilesSampleData/tree/master/msl-dingo-gap">here</a>.
-		</div>
+		</div> -->
         <script src="./mars.js" type="module"></script>
     </body>
 </html>

+ 196 - 17
example/mars.js

@@ -1,5 +1,5 @@
 import {
-	DebugTilesRenderer as TilesRenderer,
+	DebugTilesRenderer as TilesRenderer, InfiniteGridHelper
 } from '../src/index.js';
 import {
 	Scene,
@@ -10,23 +10,26 @@ import {
 	Group,
 	sRGBEncoding,
 	FogExp2,
+    CameraHelper,
+    Color
 } from 'three';
 import { FlyOrbitControls } from './FlyOrbitControls.js';
 import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';
 import { LoadingManager } from 'three';
 import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';
 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
-
+import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils';
 let camera, controls, scene, renderer;
+let thirdPersonCamera, thirdPersonRenderer, thirdPersonControls, cameraHelper
 let groundTiles, skyTiles;
 let tilesRendererArr = [];
-
+let statsContainer
 const params = {
 
-	errorTarget: 12,
+	errorTarget: 45,
 	displayBoxBounds: false,
 	fog: false,
-
+    showThirdPerson: false,
 };
 
 init();
@@ -49,16 +52,56 @@ function init() {
 
 	camera = new PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 4000 );
 	camera.position.set( 20, 10, 20 );
-
+    cameraHelper = new CameraHelper( camera );
+	scene.add( cameraHelper );
+    
+    
 	// controls
 	controls = new FlyOrbitControls( camera, renderer.domElement );
 	controls.screenSpacePanning = false;
 	controls.minDistance = 1;
 	controls.maxDistance = 2000;
-	controls.maxPolarAngle = Math.PI / 2;
+	//controls.maxPolarAngle = Math.PI / 2;
 	controls.baseSpeed = 0.1;
 	controls.fastSpeed = 0.2;
 
+
+    //加
+
+	// Third person camera view
+	thirdPersonCamera = new PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 4000 );
+	thirdPersonCamera.position.set( 50, 40, 40 );
+	thirdPersonCamera.lookAt( 0, 0, 0 );
+
+	thirdPersonRenderer = new WebGLRenderer( { antialias: true } );
+	thirdPersonRenderer.setPixelRatio( window.devicePixelRatio );
+	thirdPersonRenderer.setSize( window.innerWidth, window.innerHeight );
+	thirdPersonRenderer.setClearColor( 0x0f1416 );
+	thirdPersonRenderer.outputEncoding = sRGBEncoding;
+
+	document.body.appendChild( thirdPersonRenderer.domElement );
+	thirdPersonRenderer.domElement.style.position = 'fixed';
+	thirdPersonRenderer.domElement.style.left = '5px';
+	thirdPersonRenderer.domElement.style.bottom = '5px';
+    thirdPersonRenderer.domElement.style.width = '30%';
+    thirdPersonRenderer.domElement.style.height = '50%';
+	thirdPersonRenderer.domElement.tabIndex = 1;
+    
+    
+
+	thirdPersonControls = new FlyOrbitControls( thirdPersonCamera, thirdPersonRenderer.domElement );
+	thirdPersonControls.screenSpacePanning = false;
+	thirdPersonControls.minDistance = 1;
+	thirdPersonControls.maxDistance = 2000;
+
+
+
+
+    let ground = new InfiniteGridHelper(1, 10000, new Color('#fff'), 10000, 0.2, 0.3)
+    scene.add(ground)
+    ground.lookAt(0,1,0)
+
+
 	// lights
 	const dirLight = new DirectionalLight( 0xffffff );
 	dirLight.position.set( 1, 2, 3 );
@@ -102,8 +145,30 @@ function init() {
 
 	gui.add( params, 'displayBoxBounds' );
 	gui.add( params, 'errorTarget', 0, 100 );
+	gui.add( params, 'showThirdPerson'  );
+    
+    
 	gui.open();
 
+    statsContainer = document.createElement( 'div' );
+	statsContainer.style.position = 'absolute';
+	statsContainer.style.top = 0;
+	statsContainer.style.left = 0;
+	statsContainer.style.color = 'white';
+	statsContainer.style.width = '100%';
+	statsContainer.style.textAlign = 'center';
+	statsContainer.style.padding = '5px';
+	statsContainer.style.pointerEvents = 'none';
+	statsContainer.style.lineHeight = '1.5em';
+	document.body.appendChild( statsContainer );
+
+	/* // Stats
+	stats = new Stats();
+	stats.showPanel( 0 );
+	document.body.appendChild( stats.dom ); */
+
+
+
 }
 
 function loadTileSet(qzpath,camera,renderer){
@@ -118,6 +183,7 @@ function loadTileSet(qzpath,camera,renderer){
 		const tilesetArr = data.root.children
 		for (const tilese of tilesetArr) {
 		  // console.log(qzpath + tilese.content.uri)
+           
 		  const tilesRenderer = new TilesRenderer( qzpath + tilese.content.uri )
 
 		  const gltfLoader = new GLTFLoader( tilesRenderer.manager );
@@ -133,6 +199,15 @@ function loadTileSet(qzpath,camera,renderer){
 		  tilesObj.rotation.set(-Math.PI / 2, 0, 0)
 		  scene.add( tilesObj )
 		  tilesRendererArr.push(tilesRenderer)
+          
+          //xzw:        Multiple TilesRenderers with Shared Caches and Queues
+          if(tilesRendererArr[0]){
+              // set the second renderer to share the cache and queues from the first, 否则卡顿.
+                tilesRenderer.lruCache = tilesRendererArr[0].lruCache;
+                tilesRenderer.downloadQueue = tilesRendererArr[0].downloadQueue;
+                tilesRenderer.parseQueue = tilesRendererArr[0].parseQueue;
+          } //但还是比只有一个tileRenderer卡顿
+          
 		}
 	});
 
@@ -159,6 +234,12 @@ function onWindowResize() {
 	renderer.setSize( window.innerWidth, window.innerHeight );
 	renderer.setPixelRatio( window.devicePixelRatio );
 
+	thirdPersonCamera.aspect = thirdPersonRenderer.domElement.clientWidth / thirdPersonRenderer.domElement.clientHeight;
+	thirdPersonCamera.updateProjectionMatrix();
+	thirdPersonRenderer.setSize( thirdPersonRenderer.domElement.clientWidth, thirdPersonRenderer.domElement.clientHeight, false);
+	thirdPersonRenderer.setPixelRatio( window.devicePixelRatio );
+
+
 }
 
 function render() {
@@ -166,22 +247,120 @@ function render() {
 	requestAnimationFrame( render );
 
 	camera.updateMatrixWorld();
+    cameraHelper.visible = false;
+    
+    let downloading = 0, parsing = 0, visibles = 0,  count = 0
+    
+     
+    
+    
 	for (const tilesRenderer of tilesRendererArr) {
+        //xzw add ---------
+        tilesRenderer.errorTarget = params.errorTarget; 
+        tilesRenderer.displayBoxBounds = params.displayBoxBounds;   
+        //-----------------
 		tilesRenderer.update()
-	  }
+        
+        downloading += tilesRenderer.stats.downloading
+        parsing += tilesRenderer.stats.parsing
+        visibles += tilesRenderer.group.children.length - 2
+       
+        
+        const geomSet = new Set();
+		tilesRenderer.traverse( tile => { 
+			const scene = tile.cached.scene;
+			if ( scene ) { 
+				scene.traverse( c => { 
+					if ( c.geometry ) { 
+						geomSet.add( c.geometry ); 
+					} 
+				} ); 
+			} 
+		} );
+     
+		geomSet.forEach( g => { 
+            let u = BufferGeometryUtils.estimateBytesUsed( g ); 
+			count += u 
+            //console.log(g.uuid)
+		} );
+       
+    }   
+        
+     
+	let cacheFullness = tilesRendererArr[0] ? tilesRendererArr[0].lruCache.itemList.length / tilesRendererArr[0].lruCache.maxSize : 0;
+    
+    
+    
+	// render third person view
+	thirdPersonRenderer.domElement.style.visibility = params.showThirdPerson ? 'visible' : 'hidden';
 	
-	// groundTiles.errorTarget = params.errorTarget;
-	// groundTiles.displayBoxBounds = params.displayBoxBounds;
-	// skyTiles.displayBoxBounds = params.displayBoxBounds;
 
-	// groundTiles.setCamera( camera );
-	// groundTiles.setResolutionFromRenderer( camera, renderer );
-	// groundTiles.update();
+    if ( params.showThirdPerson ) {
+        if(thirdPersonRenderer.domElement.style != 'block'){
+            thirdPersonRenderer.domElement.style.display = 'block'
+            onWindowResize()
+        }
+        
+		cameraHelper.update();
+		cameraHelper.visible = true//! params.orthographic;
+
+		  
+		/* if ( params.showSecondView ) {
+
+			secondCameraHelper.update();
+			secondCameraHelper.visible = true; 
+		}
+        */
+		//const dist = thirdPersonCamera.position.distanceTo( rayIntersect.position );
+		//rayIntersect.scale.setScalar( dist * thirdPersonCamera.fov / 6000 );
+		thirdPersonRenderer.render( scene, thirdPersonCamera );
 
-	// skyTiles.setCamera( camera );
-	// skyTiles.setResolutionFromRenderer( camera, renderer );
-	// skyTiles.update();
+	}else{
+        thirdPersonRenderer.domElement.style.display = 'none'
+    }
+
+    
+ 
 
 	renderer.render( scene, camera );
 
+
+
+
+
+    
+	let str = `Downloading: ${  downloading } Parsing: ${  parsing } Visible: ${visibles}`;
+
+	//if ( params.enableCacheDisplay ) {
+
+		str += `<br/>Cache: ${ ( 100 * cacheFullness ).toFixed( 2 ) }% ~${ ( count / 1000 / 1000 ).toFixed( 2 ) }mb`;
+
+	//}
+
+	//if ( params.enableRendererStats ) {
+
+		const memory = renderer.info.memory;
+		const programCount = renderer.info.programs.length;
+		str += `<br/>Geometries: ${ memory.geometries } Textures: ${ memory.textures } Programs: ${ programCount }`;
+
+	//}
+
+	//if ( statsContainer.innerHTML !== str ) {
+
+		statsContainer.innerHTML = str;
+
+	//}
+
+
+    
+
+
+
+
+
+
+
+
+
+
 }

+ 5 - 1
src/base/TilesRendererBase.js

@@ -341,7 +341,11 @@ export class TilesRendererBase {
 				// remove trailing slash and last path-segment from the URL
 				let basePath = url.replace( /\/[^\/]*\/?$/, '' );
 				basePath = new URL( basePath, window.location.href ).toString();
-
+                
+                if(this.onJsonLoaded){//xzw add
+                    this.onJsonLoaded(json)
+                }
+                
 				traverseSet(
 					json.root,
 					( node, parent ) => this.preprocessNode( node, parent, basePath ),

+ 12 - 0
src/index.js

@@ -27,6 +27,9 @@ import { CMPTLoaderBase } from './base/CMPTLoaderBase.js';
 
 import { LRUCache } from './utilities/LRUCache.js';
 import { PriorityQueue } from './utilities/PriorityQueue.js';
+import InfiniteGridHelper from './three/InfiniteGridHelper.js';
+
+
 
 export {
 	DebugTilesRenderer,
@@ -57,4 +60,13 @@ export {
 	RANDOM_COLOR,
 	RANDOM_NODE_COLOR,
 	CUSTOM_COLOR,
+    
+    
+    
+    InfiniteGridHelper,
+    
+    
+    
+    
+    
 };

+ 1 - 1
src/three/DebugTilesRenderer.js

@@ -266,7 +266,7 @@ export class DebugTilesRenderer extends TilesRenderer {
 
 						delete c.material[ HAS_RANDOM_NODE_COLOR ];
 
-					}
+					} 
 
 					// Set the color on the basic material
 					switch ( colorMode ) {

+ 1 - 1
src/three/TilesRenderer.js

@@ -603,7 +603,7 @@ export class TilesRenderer extends TilesRendererBase {
 
 		const fileType = readMagicBytes( buffer ) || extension;
 		switch ( fileType ) {
-
+           
 			case 'b3dm': {
 
 				const loader = new B3DMLoader( manager );