mars.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import {
  2. DebugTilesRenderer as TilesRenderer,
  3. } from '../src/index.js';
  4. import {
  5. Scene,
  6. DirectionalLight,
  7. AmbientLight,
  8. WebGLRenderer,
  9. PerspectiveCamera,
  10. Group,
  11. sRGBEncoding,
  12. FogExp2,
  13. } from 'three';
  14. import { FlyOrbitControls } from './FlyOrbitControls.js';
  15. import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';
  16. import { LoadingManager } from 'three';
  17. import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';
  18. import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
  19. let camera, controls, scene, renderer;
  20. let groundTiles, skyTiles;
  21. let tilesRendererArr = [];
  22. const params = {
  23. errorTarget: 12,
  24. displayBoxBounds: false,
  25. fog: false,
  26. };
  27. init();
  28. render();
  29. function init() {
  30. const fog = new FogExp2( 0xd8cec0, .0075, 250 );
  31. scene = new Scene();
  32. // primary camera view
  33. renderer = new WebGLRenderer( { antialias: true } );
  34. renderer.setPixelRatio( window.devicePixelRatio );
  35. renderer.setSize( window.innerWidth, window.innerHeight );
  36. renderer.setClearColor( 0xd8cec0 );
  37. renderer.outputEncoding = sRGBEncoding;
  38. document.body.appendChild( renderer.domElement );
  39. renderer.domElement.tabIndex = 1;
  40. camera = new PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 4000 );
  41. camera.position.set( 20, 10, 20 );
  42. // controls
  43. controls = new FlyOrbitControls( camera, renderer.domElement );
  44. controls.screenSpacePanning = false;
  45. controls.minDistance = 1;
  46. controls.maxDistance = 2000;
  47. controls.maxPolarAngle = Math.PI / 2;
  48. controls.baseSpeed = 0.1;
  49. controls.fastSpeed = 0.2;
  50. // lights
  51. const dirLight = new DirectionalLight( 0xffffff );
  52. dirLight.position.set( 1, 2, 3 );
  53. scene.add( dirLight );
  54. const ambLight = new AmbientLight( 0xffffff, 0.2 );
  55. scene.add( ambLight );
  56. const tilesParent = new Group();
  57. tilesParent.rotation.set( Math.PI / 2, 0, 0 );
  58. scene.add( tilesParent );
  59. /*
  60. //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' );
  61. groundTiles = new TilesRenderer('https://testgis.4dage.com/LVBADUI_qp/tileset.json');
  62. groundTiles.fetchOptions.mode = 'cors';
  63. groundTiles.lruCache.minSize = 900;
  64. groundTiles.lruCache.maxSize = 1300;
  65. groundTiles.errorTarget = 12;
  66. */
  67. //https://testgis.4dage.com/gaoling0805-qp/
  68. loadTileSet('https://testgis.4dage.com/LVBADUI_qp/',camera,renderer);
  69. //loadTileSet('https://testgis.4dage.com/gaoling0805-qp/',camera,renderer);
  70. // 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' );
  71. // skyTiles.fetchOptions.mode = 'cors';
  72. // skyTiles.lruCache = groundTiles.lruCache;
  73. // tilesParent.add( groundTiles.group, skyTiles.group );
  74. onWindowResize();
  75. window.addEventListener( 'resize', onWindowResize, false );
  76. const gui = new GUI();
  77. gui.add( params, 'fog' ).onChange( v => {
  78. scene.fog = v ? fog : null;
  79. } );
  80. gui.add( params, 'displayBoxBounds' );
  81. gui.add( params, 'errorTarget', 0, 100 );
  82. gui.open();
  83. }
  84. function loadTileSet(qzpath,camera,renderer){
  85. // 加载json,解析json 取出children中的路径进行拼装加载
  86. //const qzpath = 'http://192.168.1.136:8077/sqsftilte/'
  87. //get(qzpath + 'tileset.json').then((res)=>{
  88. //debugger;
  89. fetch(qzpath + 'tileset.json').then(response => response.json()).then(data => {
  90. console.log(data)
  91. const tilesetArr = data.root.children
  92. for (const tilese of tilesetArr) {
  93. // console.log(qzpath + tilese.content.uri)
  94. const tilesRenderer = new TilesRenderer( qzpath + tilese.content.uri )
  95. const gltfLoader = new GLTFLoader( tilesRenderer.manager );
  96. const dracoLoader = new DRACOLoader( tilesRenderer.manager );
  97. dracoLoader.setDecoderPath( 'https://unpkg.com/three@0.128.0/examples/js/libs/draco/gltf/' );
  98. gltfLoader.setDRACOLoader( dracoLoader );
  99. tilesRenderer.manager.addHandler( /\.gltf$/, gltfLoader );
  100. tilesRenderer.manager.addHandler( /\.glb$/, gltfLoader );
  101. tilesRenderer.setCamera( camera )
  102. tilesRenderer.setResolutionFromRenderer( camera, renderer )
  103. const tilesObj = tilesRenderer.group
  104. tilesObj.rotation.set(-Math.PI / 2, 0, 0)
  105. scene.add( tilesObj )
  106. tilesRendererArr.push(tilesRenderer)
  107. }
  108. });
  109. // fetch(qzpath + 'tileset.json').then((res)=>{
  110. // // console.log(res)
  111. // const tilesetArr = res.root.children
  112. // for (const tilese of tilesetArr) {
  113. // // console.log(qzpath + tilese.content.uri)
  114. // const tilesRenderer = new TilesRenderer( qzpath + tilese.content.uri )
  115. // tilesRenderer.setCamera( camera )
  116. // tilesRenderer.setResolutionFromRenderer( camera, renderer )
  117. // const tilesObj = tilesRenderer.group
  118. // tilesObj.rotation.set(-Math.PI / 2, 0, 0)
  119. // scene.add( tilesObj )
  120. // tilesRendererArr.push(tilesRenderer)
  121. // }
  122. //})
  123. }
  124. function onWindowResize() {
  125. camera.aspect = window.innerWidth / window.innerHeight;
  126. camera.updateProjectionMatrix();
  127. renderer.setSize( window.innerWidth, window.innerHeight );
  128. renderer.setPixelRatio( window.devicePixelRatio );
  129. }
  130. function render() {
  131. requestAnimationFrame( render );
  132. camera.updateMatrixWorld();
  133. for (const tilesRenderer of tilesRendererArr) {
  134. tilesRenderer.update()
  135. }
  136. // groundTiles.errorTarget = params.errorTarget;
  137. // groundTiles.displayBoxBounds = params.displayBoxBounds;
  138. // skyTiles.displayBoxBounds = params.displayBoxBounds;
  139. // groundTiles.setCamera( camera );
  140. // groundTiles.setResolutionFromRenderer( camera, renderer );
  141. // groundTiles.update();
  142. // skyTiles.setCamera( camera );
  143. // skyTiles.setResolutionFromRenderer( camera, renderer );
  144. // skyTiles.update();
  145. renderer.render( scene, camera );
  146. }