features_sorvilier.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="description" content="">
  6. <meta name="author" content="">
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  8. <title>Potree Viewer</title>
  9. <link rel="stylesheet" type="text/css" href="../build/potree/potree.css">
  10. <link rel="stylesheet" type="text/css" href="../libs/jquery-ui/jquery-ui.min.css">
  11. <link rel="stylesheet" type="text/css" href="../libs/openlayers3/ol.css">
  12. <link rel="stylesheet" type="text/css" href="../libs/spectrum/spectrum.css">
  13. <link rel="stylesheet" type="text/css" href="../libs/jstree/themes/mixed/style.css">
  14. </head>
  15. <body>
  16. <script src="../libs/jquery/jquery-3.1.1.min.js"></script>
  17. <script src="../libs/spectrum/spectrum.js"></script>
  18. <script src="../libs/jquery-ui/jquery-ui.min.js"></script>
  19. <script src="../libs/other/BinaryHeap.js"></script>
  20. <script src="../libs/tween/tween.min.js"></script>
  21. <script src="../libs/d3/d3.js"></script>
  22. <script src="../libs/proj4/proj4.js"></script>
  23. <script src="../libs/openlayers3/ol.js"></script>
  24. <script src="../libs/i18next/i18next.js"></script>
  25. <script src="../libs/jstree/jstree.js"></script>
  26. <script src="../build/potree/potree.js"></script>
  27. <script src="../libs/plasio/js/laslaz.js"></script>
  28. <!-- INCLUDE ADDITIONAL DEPENDENCIES HERE -->
  29. <!-- INCLUDE SETTINGS HERE -->
  30. <div class="potree_container" style="position: absolute; width: 100%; height: 100%; left: 0px; top: 0px; ">
  31. <div id="potree_render_area" style="background-image: url('../build/potree/resources/images/background.jpg');"></div>
  32. <div id="potree_sidebar_container"> </div>
  33. </div>
  34. <script type="module">
  35. import * as THREE from "../libs/three.js/build/three.module.js";
  36. import {PLYLoader} from "../libs/three.js/loaders/PLYLoader.js";
  37. import {OBJLoader} from "../libs/three.js/loaders/OBJLoader.js";
  38. window.viewer = new Potree.Viewer(document.getElementById("potree_render_area"));
  39. viewer.setEDLEnabled(true);
  40. viewer.setFOV(60);
  41. viewer.setPointBudget(1_000_000);
  42. viewer.loadSettingsFromURL();
  43. viewer.setDescription("Point cloud courtesy of <a target='_blank' href='https://www.sigeom.ch/'>sigeom sa</a>");
  44. viewer.loadGUI(() => {
  45. viewer.setLanguage('en');
  46. $("#menu_tools").next().show();
  47. $("#menu_scene").next().show();
  48. viewer.toggleSidebar();
  49. });
  50. // Sigeom
  51. Potree.loadPointCloud("../pointclouds/vol_total/cloud.js", "sigeom.sa", function(e){
  52. let scene = viewer.scene;
  53. scene.addPointCloud(e.pointcloud);
  54. let material = e.pointcloud.material;
  55. material.size = 1;
  56. material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
  57. scene.view.position.set(589974.341, 231698.397, 986.146);
  58. scene.view.lookAt(new THREE.Vector3(589851.587, 231428.213, 715.634));
  59. // viewer.fitToScreen();
  60. });
  61. { // LIGHTS
  62. const directional = new THREE.DirectionalLight( 0xffffff, 1.0);
  63. directional.position.set( 10, 10, 10 );
  64. directional.lookAt(0, 0, 0);
  65. const ambient = new THREE.AmbientLight(0x555555);
  66. viewer.scene.scene.add(directional);
  67. viewer.scene.scene.add(ambient);
  68. }
  69. { // MEASUREMENTS
  70. let scene = viewer.scene;
  71. { // PROFILE
  72. let profile = new Potree.Profile();
  73. profile.setWidth(6)
  74. profile.addMarker(new THREE.Vector3(589641.6098756103, 231453.76974998094, 760.4950016784668));
  75. profile.addMarker(new THREE.Vector3(589514.4799995422, 231309.46000003815, 775.6249989318848));
  76. profile.addMarker(new THREE.Vector3(589512.4600000381, 231504.9597490845, 764.6350010681152));
  77. scene.addProfile(profile);
  78. }
  79. }
  80. { // ANNOTATIONS
  81. let scene = viewer.scene;
  82. scene.annotations.add(new Potree.Annotation({
  83. position: [589847.17, 231436.78, 892.60],
  84. cameraPosition: [590034.03, 231814.02, 961.68],
  85. cameraTarget: [589847.17, 231436.78, 742.60],
  86. title: "Sorvilier"
  87. }));
  88. scene.annotations.add(new Potree.Annotation({
  89. position: [589850.15, 231300.10, 770.94],
  90. title: "Trees",
  91. description: `Point cloud of a small section in Sorvilier, Switzerland. <br>
  92. Courtesy of sigeom.sa`
  93. }));
  94. scene.annotations.add(new Potree.Annotation({
  95. position: [590043.63, 231490.79, 740.78],
  96. title: "About Annotations",
  97. cameraPosition: [590105.53, 231541.63, 782.05],
  98. cameraTarget: [590043.63, 231488.79, 740.78],
  99. description: `<ul><li>Click on the annotation label to move a predefined view.</li>
  100. <li>Click on the icon to execute the specified action.</li>
  101. In this case, the action will bring you to another scene and point cloud.</ul>`,
  102. }));
  103. scene.annotations.add(new Potree.Annotation({
  104. position: [589621, 231437, 784],
  105. cameraPosition: [589585.81, 231463.63, 804.00],
  106. cameraTarget: [589625.86, 231439, 775.38],
  107. title: "About Annotations 2",
  108. description: `
  109. Suitable annotation positions and views can be obtained by
  110. looking up the current camera position and target in the "Scene" panel,
  111. or by evaluating following lines in your browser's developer console:<br><br>
  112. <code>viewer.scene.view.position</code><br>
  113. <code>viewer.scene.view.getPivot()</code><br>
  114. `
  115. }));
  116. scene.annotations.add(new Potree.Annotation({
  117. position: [589980, 231236.83, 783.89],
  118. title: "About Annotations 1",
  119. description: `
  120. Annotations mark and describe locations.
  121. They can move users to a predefined location on click,
  122. and provide action buttons to offer easily accessible
  123. functionality at certain points of interest.
  124. `
  125. }));
  126. scene.annotations.add(new Potree.Annotation({
  127. position: [589880, 231236.83, 783.89],
  128. title: "About Annotations 2",
  129. description: `
  130. Suitable annotation positions and views can be obtained by
  131. looking up the current camera position and target in the "Scene" panel,
  132. or by evaluating following lines in your browser's developer console:<br><br>
  133. <code>viewer.scene.view.position</code><br>
  134. <code>viewer.scene.view.getPivot()</code><br>
  135. `
  136. }));
  137. scene.annotations.add(new Potree.Annotation({
  138. title: "Actions:&nbsp;",
  139. position: [589769.27, 231236.83, 783.89],
  140. description: `This annotation has actions that switch between elevation and color rendering modes.`,
  141. actions: [{
  142. "icon": Potree.resourcePath + "/icons/profile.svg",
  143. "onclick": function(){
  144. for(let pointcloud of viewer.scene.pointclouds){
  145. pointcloud.material.activeAttributeName = "elevation";
  146. pointcloud.material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
  147. }
  148. }
  149. },{
  150. "icon": Potree.resourcePath + "/icons/rgb.png",
  151. "onclick": function(){
  152. for(let pointcloud of viewer.scene.pointclouds){
  153. pointcloud.material.activeAttributeName = "rgba";
  154. pointcloud.material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
  155. }
  156. }
  157. }]
  158. }));
  159. }
  160. {
  161. let volume = new Potree.BoxVolume();
  162. volume.name = "Test Volume";
  163. volume.scale.set(87.70990081104037, 65.01472874807978, 95.53770288101325);
  164. volume.position.set(589688.5173246722, 231341.79786558595, 792.7726157084892);
  165. volume.rotation.set(0, 0, 0.6338484063020134);
  166. volume.clip = true;
  167. viewer.scene.addVolume(volume);
  168. }
  169. { // Load Textured bunny from obj
  170. let manager = new THREE.LoadingManager();
  171. manager.onProgress = function ( item, loaded, total ) {
  172. console.log( item, loaded, total );
  173. };
  174. let textureLoader = new THREE.TextureLoader( manager );
  175. let texture = textureLoader.load(`${Potree.resourcePath}/textures/brick_pavement.jpg`);
  176. let onProgress = function ( xhr ) {
  177. if ( xhr.lengthComputable ) {
  178. let percentComplete = xhr.loaded / xhr.total * 100;
  179. console.log( Math.round(percentComplete, 2) + '% downloaded' );
  180. }
  181. };
  182. texture.wrapS = THREE.RepeatWrapping;
  183. texture.wrapT = THREE.RepeatWrapping;
  184. let onError = function ( xhr ) {};
  185. let loader = new OBJLoader( manager );
  186. loader.load(`${Potree.resourcePath}/models/stanford_bunny_reduced.obj`, function ( object ) {
  187. object.traverse( function ( child ) {
  188. if ( child instanceof THREE.Mesh ) {
  189. child.material.map = texture;
  190. }
  191. } );
  192. object.position.set(589871.587, 231528.213, 725.634);
  193. object.scale.multiplyScalar(500);
  194. object.rotation.set(Math.PI / 2, Math.PI, 0)
  195. viewer.scene.scene.add( object );
  196. viewer.onGUILoaded(() => {
  197. // Add entries to object list in sidebar
  198. let tree = $(`#jstree_scene`);
  199. let parentNode = "other";
  200. let bunnyID = tree.jstree('create_node', parentNode, {
  201. text: "Bunny Textured",
  202. icon: `${Potree.resourcePath}/icons/triangle.svg`,
  203. data: object
  204. },
  205. "last", false, false);
  206. tree.jstree(object.visible ? "check_node" : "uncheck_node", bunnyID);
  207. //tree.jstree("open_node", parentNode);
  208. });
  209. }, onProgress, onError );
  210. }
  211. // Load untextured bunny from ply
  212. var loader = new PLYLoader();
  213. loader.load( Potree.resourcePath + "/models/stanford_bunny_reduced.ply", (geometry) => {
  214. geometry.computeVertexNormals();
  215. // place two instances of this bunny into the scene
  216. let mesh1;
  217. {
  218. let material = new THREE.MeshNormalMaterial();
  219. mesh1 = new THREE.Mesh( geometry, material );
  220. mesh1.position.set(589961.587, 231428.213, 710.634);
  221. mesh1.scale.multiplyScalar(500);
  222. mesh1.rotation.set(Math.PI / 2, Math.PI, 0)
  223. viewer.scene.scene.add(mesh1);
  224. }
  225. let mesh2;
  226. {
  227. let material = new THREE.MeshPhysicalMaterial( {
  228. color: 0x226666,
  229. metalness: 0,
  230. roughness: 0.5,
  231. clearCoat: 1.0,
  232. clearCoatRoughness: 1.0,
  233. reflectivity: 1.0
  234. } );
  235. mesh2 = new THREE.Mesh( geometry, material );
  236. mesh2.position.set(589751.587, 231428.213, 725.634);
  237. mesh2.scale.multiplyScalar(500);
  238. mesh2.rotation.set(Math.PI / 2, Math.PI, 0)
  239. viewer.scene.scene.add(mesh2);
  240. }
  241. viewer.onGUILoaded(() => {
  242. // Add entries to object list in sidebar
  243. let tree = $(`#jstree_scene`);
  244. let parentNode = "other";
  245. let bunny1ID = tree.jstree('create_node', parentNode, {
  246. text: "Bunny 1",
  247. icon: `${Potree.resourcePath}/icons/triangle.svg`,
  248. data: mesh1
  249. },
  250. "last", false, false);
  251. tree.jstree(mesh1.visible ? "check_node" : "uncheck_node", bunny1ID);
  252. let bunny2ID = tree.jstree('create_node', parentNode, {
  253. text: "Bunny 2",
  254. icon: `${Potree.resourcePath}/icons/triangle.svg`,
  255. data: mesh2
  256. },
  257. "last", false, false);
  258. tree.jstree(mesh2.visible ? "check_node" : "uncheck_node", bunny2ID);
  259. });
  260. });
  261. </script>
  262. </body>
  263. </html>