浏览代码

Merge pull request #199 from Gmadges/geometric-error-for-spheres

Supporting boundingSpheres for GeometricError calculations
Garrett Johnson 4 年之前
父节点
当前提交
0443a576d2
共有 1 个文件被更改,包括 24 次插入10 次删除
  1. 24 10
      src/three/TilesRenderer.js

+ 24 - 10
src/three/TilesRenderer.js

@@ -429,6 +429,8 @@ export class TilesRenderer extends TilesRendererBase {
 
 		}
 
+		const transformInverse = new Matrix4().copy( transform ).invert();
+
 		let box = null;
 		let boxTransform = null;
 		let boxTransformInverse = null;
@@ -517,6 +519,8 @@ export class TilesRenderer extends TilesRendererBase {
 
 			loadIndex: 0,
 			transform,
+			transformInverse,
+
 			active: false,
 			inFrustum: [],
 
@@ -794,10 +798,14 @@ export class TilesRenderer extends TilesRendererBase {
 		// TODO: We should use the largest distance to the tile between
 		// all available bounding volume types.
 		const boundingVolume = tile.boundingVolume;
-		if ( 'box' in boundingVolume ) {
 
+		if ( 'box' in boundingVolume || 'sphere' in boundingVolume ) {
+
+			const boundingSphere = cached.sphere;
 			const boundingBox = cached.box;
 			const boxTransformInverse = cached.boxTransformInverse;
+			const transformInverse = cached.transformInverse;
+			const useBox = boundingBox && boxTransformInverse;
 
 			let maxError = - Infinity;
 			let minDistance = Infinity;
@@ -814,8 +822,6 @@ export class TilesRenderer extends TilesRendererBase {
 				const camera = cameras[ i ];
 				const info = cameraInfo[ i ];
 				const invScale = info.invScale;
-				tempVector.copy( info.position );
-				tempVector.applyMatrix4( boxTransformInverse );
 
 				let error;
 				if ( camera.isOrthographicCamera ) {
@@ -825,7 +831,21 @@ export class TilesRenderer extends TilesRendererBase {
 
 				} else {
 
-					const distance = boundingBox.distanceToPoint( tempVector );
+					tempVector.copy( info.position );
+
+					let distance;
+					if ( useBox ) {
+
+						tempVector.applyMatrix4( boxTransformInverse );
+						distance = boundingBox.distanceToPoint( tempVector );
+
+					} else {
+
+						tempVector.applyMatrix4( transformInverse );
+						distance = boundingSphere.distanceToPoint( tempVector );
+
+					}
+
 					const scaledDistance = distance * invScale;
 					const sseDenominator = info.sseDenominator;
 					error = tile.geometricError / ( scaledDistance * sseDenominator );
@@ -841,12 +861,6 @@ export class TilesRenderer extends TilesRendererBase {
 			tile.__distanceFromCamera = minDistance;
 			tile.__error = maxError;
 
-		} else if ( 'sphere' in boundingVolume ) {
-
-			// const sphere = cached.sphere;
-
-			console.warn( 'ThreeTilesRenderer : Sphere bounds not supported.' );
-
 		} else if ( 'region' in boundingVolume ) {
 
 			// unsupported