camera_animation.html 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. <div class="potree_container" style="position: absolute; width: 100%; height: 100%; left: 0px; top: 0px; ">
  29. <div id="potree_render_area" style="background-image: url('../build/potree/resources/images/background.jpg');">
  30. </div>
  31. <div id="potree_sidebar_container"> </div>
  32. </div>
  33. <script type="module">
  34. import * as THREE from "../libs/three.js/build/three.module.js";
  35. window.viewer = new Potree.Viewer(document.getElementById("potree_render_area"));
  36. viewer.setEDLEnabled(false);
  37. viewer.setFOV(60);
  38. viewer.setPointBudget(3_000_000);
  39. viewer.loadSettingsFromURL();
  40. viewer.setDescription(`
  41. Create a new animation path via "Tools -> Navigation -> Camera Animation"<br>
  42. Modify and play animation via "Scene -> Objects -> Other -> [animation object]".
  43. `);
  44. viewer.loadGUI(() => {
  45. viewer.setLanguage('en');
  46. $("#menu_scene").next().show();
  47. viewer.toggleSidebar();
  48. });
  49. Potree.loadPointCloud("../pointclouds/vol_total/cloud.js", "sigeom.sa", e => {
  50. let scene = viewer.scene;
  51. let pointcloud = e.pointcloud;
  52. let material = pointcloud.material;
  53. material.size = 1;
  54. material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
  55. material.shape = Potree.PointShape.SQUARE;
  56. scene.addPointCloud(pointcloud);
  57. // scene.view.setView(
  58. // [589974.341, 231698.397, 986.146],
  59. // [589851.587, 231428.213, 715.634],
  60. // );
  61. viewer.fitToScreen();
  62. });
  63. </script>
  64. <script type="module">
  65. import * as THREE from "../libs/three.js/build/three.module.js";
  66. const animation = new Potree.CameraAnimation(viewer);
  67. const positions = [
  68. [590291.6145250637, 231565.3152460147, 888.181158774433],
  69. [590094.2454560432, 231235.32163877538, 870.7535717968211],
  70. [589675.8154371583, 231058.22066649256, 905.3068746322883],
  71. [589328.6700949036, 231385.37585641106, 813.9565903445384],
  72. ];
  73. const targets = [
  74. [589859.3465488373, 231456.18943956672, 758.2733646218901],
  75. [589846.4463098792, 231431.89813285187, 755.9090168440739],
  76. [589824.0843049305, 231444.72309070674, 760.3459659610106],
  77. [589799.7263767472, 231473.79043369304, 758.8332698380435],
  78. ];
  79. for(let i = 0; i < positions.length; i++){
  80. const cp = animation.createControlPoint();
  81. cp.position.set(...positions[i]);
  82. cp.target.set(...targets[i]);
  83. }
  84. viewer.scene.addCameraAnimation(animation);
  85. </script>
  86. <script type="module">
  87. import * as THREE from "../libs/three.js/build/three.module.js";
  88. // viewer.onGUILoaded(() => {
  89. // let section = $(`
  90. // <h3 id="menu_meta" class="accordion-header ui-widget"><span>Camera Animation</span></h3>
  91. // <div class="accordion-content ui-widget pv-menu-list"></div>
  92. // `);
  93. // let content = section.last();
  94. // content.html(`
  95. // <div class="pv-menu-list">
  96. // <span id="animation_keyframes"></span>
  97. // <span>
  98. // <span>Time: </span><span id="lblTime"></span> <div id="sldTime"></div>
  99. // <input name="play" type="button" value="play"/>
  100. // </span>
  101. // </div>
  102. // `);
  103. // const elPlay = content.find("input[name=play]");
  104. // elPlay.click( () => {
  105. // animation.play();
  106. // });
  107. // const elSlider = content.find('#sldTime');
  108. // elSlider.slider({
  109. // value: 0,
  110. // min: 0,
  111. // max: 1,
  112. // step: 0.001,
  113. // slide: (event, ui) => {
  114. // animation.set(ui.value);
  115. // }
  116. // });
  117. // const elKeyframes = content.find("#animation_keyframes");
  118. // const updateKeyframes = () => {
  119. // elKeyframes.empty();
  120. // let index = 0;
  121. // const addNewKeyframeItem = (index) => {
  122. // let elNewKeyframe = $(`
  123. // <div style="display: flex; margin: 0.2em 0em">
  124. // <span style="flex-grow: 0;">
  125. // <img name="add" src="${Potree.resourcePath}/icons/add.svg" style="width: 1.5em; height: 1.5em"/>
  126. // </span>
  127. // <span style="flex-grow: 1"></span>
  128. // </div>
  129. // `);
  130. // const elAdd = elNewKeyframe.find("img[name=add]");
  131. // elAdd.click( () => {
  132. // animation.createControlPoint(index);
  133. // });
  134. // elKeyframes.append(elNewKeyframe);
  135. // };
  136. // const addKeyframeItem = (index) => {
  137. // let elKeyframe = $(`
  138. // <div style="display: flex; margin: 0.2em 0em">
  139. // <span style="flex-grow: 0;">
  140. // <img name="assign" src="${Potree.resourcePath}/icons/assign.svg" style="width: 1.5em; height: 1.5em"/>
  141. // </span>
  142. // <span style="flex-grow: 0;">
  143. // <img name="move" src="${Potree.resourcePath}/icons/circled_dot.svg" style="width: 1.5em; height: 1.5em"/>
  144. // </span>
  145. // <span style="flex-grow: 0; width: 1.5em; height: 1.5em"></span>
  146. // <span style="flex-grow: 0; font-size: 1.5em">keyframe</span>
  147. // <span style="flex-grow: 1"></span>
  148. // <span style="flex-grow: 0;">
  149. // <img name="delete" src="${Potree.resourcePath}/icons/remove.svg" style="width: 1.5em; height: 1.5em"/>
  150. // </span>
  151. // </div>
  152. // `);
  153. // const elAssign = elKeyframe.find("img[name=assign]");
  154. // const elMove = elKeyframe.find("img[name=move]");
  155. // const elDelete = elKeyframe.find("img[name=delete]");
  156. // elAssign.click( () => {
  157. // const cp = animation.controlPoints[index];
  158. // cp.position.copy(viewer.scene.view.position);
  159. // cp.target.copy(viewer.scene.view.getPivot());
  160. // });
  161. // elMove.click( () => {
  162. // const cp = animation.controlPoints[index];
  163. // viewer.scene.view.position.copy(cp.position);
  164. // viewer.scene.view.lookAt(cp.target);
  165. // });
  166. // elDelete.click( () => {
  167. // const cp = animation.controlPoints[index];
  168. // animation.removeControlPoint(cp);
  169. // });
  170. // elKeyframes.append(elKeyframe);
  171. // };
  172. // addNewKeyframeItem(index);
  173. // for(const cp of animation.controlPoints){
  174. // addKeyframeItem(index);
  175. // index++;
  176. // addNewKeyframeItem(index);
  177. // }
  178. // };
  179. // updateKeyframes();
  180. // animation.addEventListener("controlpoint_added", updateKeyframes);
  181. // animation.addEventListener("controlpoint_removed", updateKeyframes);
  182. // section.first().click(() => content.slideToggle());
  183. // section.insertBefore($('#menu_about'));
  184. // });
  185. </script>
  186. </body>
  187. </html>