Explorar o código

Merge pull request #175 from NASA-AMMOS/mars-demo

Add new data demo w/ multi tileset
Garrett Johnson %!s(int64=4) %!d(string=hai) anos
pai
achega
ae3c828313

+ 4 - 0
CHANGELOG.md

@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
+## Unreleased
+### Fixed
+- Bounding box visualization not displaying correctly with `DebugTilesRenderer` when the bounds have a width of 0 in one dimension.
+
 ## [0.2.9] - 2021-03-03
 ### Added
 - `onLoadTileSet` to the typescript definitions file.

+ 3 - 1
README.md

@@ -4,7 +4,7 @@
 [![build](https://img.shields.io/github/workflow/status/NASA-AMMOS/3DTilesRendererJS/Node.js%20CI?style=flat-square&label=build)](https://github.com/NASA-AMMOS/3DTilesRendererJS/actions)
 [![lgtm code quality](https://img.shields.io/lgtm/grade/javascript/g/NASA-AMMOS/3DTilesRendererJS.svg?style=flat-square&label=code-quality)](https://lgtm.com/projects/g/NASA-AMMOS/3DTilesRendererJS/)
 
-![](./images/header.png)
+![](./images/header-mars.png)
 
 Three.js renderer implementation for the [3D Tiles format](https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/specification/). The renderer supports most of the 3D Tiles spec features with a few exceptions. See [Issue #15](https://github.com/NASA-AMMOS/3DTilesRendererJS/issues/15) for information on which features are not yet implemented.
 
@@ -12,6 +12,8 @@ If a tile set or geometry does not load or render properly please make an issue!
 
 **Examples**
 
+[Dingo Gap Mars dataset with multiple tile sets](https://nasa-ammos.github.io/3DTilesRendererJS/example/bundle/mars.html)!
+
 [Kitchen sink example with all options here](https://nasa-ammos.github.io/3DTilesRendererJS/example/bundle/index.html)!
 
 [Custom material example here](https://nasa-ammos.github.io/3DTilesRendererJS/example/bundle/customMaterial.html)!

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 64 - 0
example/bundle/mars.eb66857f.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
example/bundle/mars.eb66857f.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
example/bundle/mars.html


+ 54 - 0
example/mars.html

@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+		<meta charset="utf-8"/>
+
+		<title>Dingo Gap Tile Set</title>
+
+		<style>
+            * {
+                margin: 0;
+                padding: 0;
+            }
+
+            html {
+                overflow: hidden;
+				font-family: Arial, Helvetica, sans-serif;
+				user-select: none;
+            }
+
+			canvas {
+				image-rendering: pixelated;
+				outline: none;
+			}
+
+			#info {
+				position: absolute;
+				top: 0;
+				left: 0;
+				width: 100%;
+				text-align: center;
+				padding: 5px;
+				pointer-events: none;
+				line-height: 1.5em;
+			}
+
+			#info, #info a {
+				color: #234;
+			}
+
+			#info a {
+				pointer-events: all;
+			}
+        </style>
+    </head>
+    <body>
+		<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>
+        <script src="./mars.js"></script>
+    </body>
+</html>

+ 127 - 0
example/mars.js

@@ -0,0 +1,127 @@
+import {
+	DebugTilesRenderer as TilesRenderer,
+} from '../src/index.js';
+import {
+	Scene,
+	DirectionalLight,
+	AmbientLight,
+	WebGLRenderer,
+	PerspectiveCamera,
+	Group,
+	sRGBEncoding,
+	FogExp2,
+} from 'three';
+import { FlyOrbitControls } from './FlyOrbitControls.js';
+import * as dat from 'three/examples/jsm/libs/dat.gui.module.js';
+
+let camera, controls, scene, renderer;
+let groundTiles, skyTiles;
+
+const params = {
+
+	errorTarget: 12,
+	displayBoxBounds: false,
+	fog: false,
+
+};
+
+init();
+render();
+
+function init() {
+
+	const fog = new FogExp2( 0xd8cec0, .0075, 250 );
+	scene = new Scene();
+
+	// primary camera view
+	renderer = new WebGLRenderer( { antialias: true } );
+	renderer.setPixelRatio( window.devicePixelRatio );
+	renderer.setSize( window.innerWidth, window.innerHeight );
+	renderer.setClearColor( 0xd8cec0 );
+	renderer.outputEncoding = sRGBEncoding;
+
+	document.body.appendChild( renderer.domElement );
+	renderer.domElement.tabIndex = 1;
+
+	camera = new PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 4000 );
+	camera.position.set( 20, 10, 20 );
+
+	// controls
+	controls = new FlyOrbitControls( camera, renderer.domElement );
+	controls.screenSpacePanning = false;
+	controls.minDistance = 1;
+	controls.maxDistance = 2000;
+	controls.maxPolarAngle = Math.PI / 2;
+	controls.baseSpeed = 0.1;
+	controls.fastSpeed = 0.2;
+
+	// lights
+	const dirLight = new DirectionalLight( 0xffffff );
+	dirLight.position.set( 1, 2, 3 );
+	scene.add( dirLight );
+
+	const ambLight = new AmbientLight( 0xffffff, 0.2 );
+	scene.add( ambLight );
+
+	const tilesParent = new Group();
+	tilesParent.rotation.set( Math.PI / 2, 0, 0 );
+	scene.add( tilesParent );
+
+	groundTiles = new TilesRenderer( 'https://raw.githubusercontent.com/NASA-AMMOS/3DTilesSampleData/master/msl-dingo-gap/0528_0260184_to_s64o256_colorize/0528_0260184_to_s64o256_colorize/0528_0260184_to_s64o256_colorize_tileset.json' );
+	groundTiles.fetchOptions.mode = 'cors';
+	groundTiles.lruCache.minSize = 900;
+	groundTiles.lruCache.maxSize = 1300;
+	groundTiles.errorTarget = 12;
+
+	skyTiles = new TilesRenderer( 'https://raw.githubusercontent.com/NASA-AMMOS/3DTilesSampleData/master/msl-dingo-gap/0528_0260184_to_s64o256_colorize/0528_0260184_to_s64o256_sky/0528_0260184_to_s64o256_sky_tileset.json' );
+	skyTiles.fetchOptions.mode = 'cors';
+	skyTiles.lruCache = groundTiles.lruCache;
+
+	tilesParent.add( groundTiles.group, skyTiles.group );
+
+	onWindowResize();
+	window.addEventListener( 'resize', onWindowResize, false );
+
+	const gui = new dat.GUI();
+	gui.add( params, 'fog' ).onChange( v => {
+
+		scene.fog = v ? fog : null;
+
+	} );
+
+	gui.add( params, 'displayBoxBounds' );
+	gui.add( params, 'errorTarget', 0, 100 );
+	gui.open();
+
+}
+
+function onWindowResize() {
+
+	camera.aspect = window.innerWidth / window.innerHeight;
+	camera.updateProjectionMatrix();
+	renderer.setSize( window.innerWidth, window.innerHeight );
+	renderer.setPixelRatio( window.devicePixelRatio );
+
+}
+
+function render() {
+
+	requestAnimationFrame( render );
+
+	camera.updateMatrixWorld();
+
+	groundTiles.errorTarget = params.errorTarget;
+	groundTiles.displayBoxBounds = params.displayBoxBounds;
+	skyTiles.displayBoxBounds = params.displayBoxBounds;
+
+	groundTiles.setCamera( camera );
+	groundTiles.setResolutionFromRenderer( camera, renderer );
+	groundTiles.update();
+
+	skyTiles.setCamera( camera );
+	skyTiles.setResolutionFromRenderer( camera, renderer );
+	skyTiles.update();
+
+	renderer.render( scene, camera );
+
+}

BIN=BIN
images/header-mars.png


+ 3 - 1
src/three/DebugTilesRenderer.js

@@ -356,9 +356,11 @@ export class DebugTilesRenderer extends TilesRenderer {
 					const cachedBoxMat = cached.boxTransform;
 
 					// Create debug bounding box
+					// In some cases the bounding box may have a scale of 0 in one dimension resulting
+					// in the NaNs in an extracted rotation so we disable matrix updates instead.
 					const boxHelperGroup = new Group();
 					boxHelperGroup.matrix.copy( cachedBoxMat );
-					boxHelperGroup.matrix.decompose( boxHelperGroup.position, boxHelperGroup.quaternion, boxHelperGroup.scale );
+					boxHelperGroup.matrixAutoUpdate = false;
 
 					const boxHelper = new Box3Helper( cachedBox );
 					boxHelper.raycast = emptyRaycast;