MergeScene.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import {
  2. Scene,
  3. PerspectiveCamera,
  4. WebGLRenderer,
  5. Clock,
  6. Matrix4,
  7. Euler,
  8. sRGBEncoding,
  9. Math as ThreeMath
  10. } from 'three';
  11. import { OrbitControls } from './lib/OrbitControls.js';
  12. import { TransformControls } from './lib/TransformControls.js';
  13. import LoaderTileFiles from './LoaderTileFiles.js';
  14. import { Loader3DTiles } from 'three-loader-3dtiles';
  15. import { CameraRig, FreeMovementControls } from 'three-story-controls'
  16. import Stats from './lib/stats.module.js';
  17. import StatsWidget from '@probe.gl/stats-widget';
  18. import Control from './Control.js';
  19. import {render} from './Render.js';
  20. const queryParams = new URLSearchParams(document.location.search);
  21. const canvasParent = document.querySelector('#canvas-parent');
  22. const statsParent = document.querySelector('#stats-widget')
  23. export default class MergeScene{
  24. constructor(){
  25. this.scene = null;
  26. this.camera = null;
  27. this.renderer = null;
  28. this.controls = null;
  29. this.threeJsStats = null;
  30. //this.tilesRuntime = null;
  31. this.statsRuntime = null;
  32. this.control = null;
  33. this.init();
  34. }
  35. init(){
  36. this.scene = new Scene();
  37. this.camera = new PerspectiveCamera(
  38. 35,
  39. 1,
  40. 0.01,
  41. 1000,
  42. );
  43. this.renderer = new WebGLRenderer();
  44. this.renderer.outputEncoding = sRGBEncoding;
  45. this.clock = new Clock()
  46. this.rig = new CameraRig(this.camera, this.scene)
  47. /*
  48. if (queryParams.get('orbit')) {
  49. this.controls = new OrbitControls( this.camera, canvasParent);
  50. this.controls.listenToKeyEvents( document.body );
  51. this.camera.position.set(0,200,0);
  52. this.controls.update();
  53. }
  54. else {
  55. this.controls = new FreeMovementControls(this.rig, {
  56. panDegreeFactor: 2,
  57. wheelScaleFactor: 0.01,
  58. keyboardScaleFactor: 0.015,
  59. keyboardDampFactor: 0
  60. });
  61. this.controls.enable();
  62. }
  63. */
  64. this.controls = new OrbitControls( this.camera, canvasParent);
  65. this.controls.listenToKeyEvents( document.body );
  66. this.camera.position.set(0,200,0);
  67. this.controls.update();
  68. canvasParent.appendChild(this.renderer.domElement);
  69. this.threeJsStats = new Stats();
  70. this.threeJsStats.domElement.style.position = 'absolute';
  71. this.threeJsStats.domElement.style.top = '10px';
  72. this.threeJsStats.domElement.style.left = '10px';
  73. this.loaderTileFiles = new LoaderTileFiles(this.scene,this.renderer);
  74. this.control = new Control(this.scene,this.camera); //鼠标的选中点击等等
  75. this.control.arrowControls = new TransformControls( this.camera , canvasParent );
  76. this.scene.add( this.control.arrowControls );
  77. this.initTransformControls();
  78. render.init(this.scene);
  79. canvasParent.appendChild( this.threeJsStats.domElement );
  80. if (queryParams.get('tilesetUrl')) {
  81. document.querySelector('#example-desc').style.display = 'none';
  82. }
  83. window.addEventListener('resize', this.onWindowResize);
  84. }
  85. initTransformControls(){
  86. this.control.arrowControls.addEventListener( 'change', this.render.bind(this) );
  87. this.control.arrowControls.addEventListener( 'dragging-changed', function ( event ) {
  88. this.controls.enabled = ! event.value;
  89. }.bind(this) );
  90. }
  91. async loadTileset() {
  92. /*
  93. const result = await Loader3DTiles.load(
  94. {
  95. url:
  96. queryParams.get('tilesetUrl') ??
  97. //'https://testgis.4dage.com/LVBADUI_qp/tileset.json',
  98. 'https://int.nyt.com/data/3dscenes/ONA360/TILESET/0731_FREEMAN_ALLEY_10M_A_36x8K__10K-PN_50P_DB/tileset_tileset.json',
  99. renderer: this.renderer,
  100. options: {
  101. dracoDecoderPath: 'https://cdn.jsdelivr.net/npm/three@0.137.0/examples/js/libs/draco',
  102. basisTranscoderPath: 'https://cdn.jsdelivr.net/npm/three@0.137.0/examples/js/libs/basis',
  103. maximumScreenSpaceError: queryParams.get('sse') ?? 48,
  104. }
  105. }
  106. );
  107. const {model, runtime} = result;
  108. model.rotation.set(-Math.PI / 2, 0, Math.PI / 2);
  109. if (!queryParams.get('tilesetUrl')) {
  110. model.position.set(-1, 4, -16);
  111. }
  112. this.tilesRuntime = runtime;
  113. this.scene.add(model);
  114. modelManager.tilesMeshesUUIDs.push(model.uuid);
  115. this.statsRuntime = new StatsWidget(runtime.getStats(), {container: statsParent });
  116. statsParent.style.visibility = 'visible';
  117. */
  118. //await this.loaderTileFiles.loadTilesets('https://testgis.4dage.com/LVBADUI_qp/','tileset.json');
  119. //await this.loaderTileFiles.loadTileset('https://testgis.4dage.com/LVBADUI_qp/tileset.json');
  120. //await this.loaderTileFiles.loadTileset('https://testgis.4dage.com/gaoling-qp/tileset.json');
  121. await this.loaderTileFiles.loadTileset('https://testgis.4dage.com/changdifengmaojie4-qp/tileset.json');
  122. //await this.loaderTileFiles.loadTilesets('https://int.nyt.com/data/3dscenes/ONA360/TILESET/0731_FREEMAN_ALLEY_10M_A_36x8K__10K-PN_50P_DB/','tileset_tileset.json');
  123. this.statsRuntime = new StatsWidget(this.loaderTileFiles.tilesRuntime.getStats(), {container: statsParent });
  124. statsParent.style.visibility = 'visible';
  125. }
  126. render(t) {
  127. const dt = this.clock.getDelta()
  128. this.controls.update(t);
  129. // if (this.tilesRuntime) {
  130. // this.tilesRuntime.update(dt, this.renderer, this.camera);
  131. // }
  132. if (this.loaderTileFiles.tilesRuntime) {
  133. this.loaderTileFiles.tilesRuntime.update(dt, this.renderer, this.camera);
  134. }
  135. if (this.statsRuntime) {
  136. this.statsRuntime.update();
  137. }
  138. this.renderer.render(this.scene, this.camera);
  139. this.threeJsStats.update();
  140. window.requestAnimationFrame(this.render.bind(this));
  141. }
  142. onWindowResize() {
  143. this.renderer.setSize(canvasParent.clientWidth, canvasParent.clientHeight);
  144. this.camera.aspect = canvasParent.clientWidth / canvasParent.clientHeight;
  145. this.camera.updateProjectionMatrix();
  146. }
  147. start(){
  148. this.loadTileset();
  149. this.onWindowResize();
  150. this.render();
  151. }
  152. }
  153. let mergeScene = new MergeScene();
  154. export {mergeScene}