CameraAnimationPanel.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import {Utils} from "../../utils.js";
  2. export class CameraAnimationPanel{
  3. constructor(viewer, propertiesPanel, animation){
  4. this.viewer = viewer;
  5. this.propertiesPanel = propertiesPanel;
  6. this.animation = animation;
  7. this.elContent = $(`
  8. <div class="propertypanel_content">
  9. <span id="animation_keyframes"></span>
  10. <span>
  11. <span style="display:flex">
  12. <span style="display:flex; align-items: center; padding-right: 10px">Duration: </span>
  13. <input name="spnDuration" value="5.0" style="flex-grow: 1; width:100%">
  14. </span>
  15. <span>Time: </span><span id="lblTime"></span> <div id="sldTime"></div>
  16. <input name="play" type="button" value="play"/>
  17. <input name="pause" type="button" value="pause"/>
  18. </span>
  19. </div>
  20. `);
  21. const elPlay = this.elContent.find("input[name=play]");
  22. elPlay.click( () => {
  23. animation.play();
  24. });
  25. const elPause = this.elContent.find("input[name=pause]");
  26. elPause.click( () => {
  27. animation.pause();
  28. });
  29. const elSlider = this.elContent.find('#sldTime');
  30. elSlider.slider({
  31. value: 0,
  32. min: 0,
  33. max: 1,
  34. step: 0.001,
  35. slide: (event, ui) => {
  36. animation.set(ui.value);
  37. animation.updateFrustum()
  38. }
  39. });
  40. let elDuration = this.elContent.find(`input[name=spnDuration]`);
  41. elDuration.spinner({
  42. min: 0, max: 300, step: 0.01,
  43. numberFormat: 'n',
  44. start: () => {},
  45. spin: (event, ui) => {
  46. let value = elDuration.spinner('value');
  47. animation.setDuration(value);
  48. },
  49. change: (event, ui) => {
  50. let value = elDuration.spinner('value');
  51. animation.setDuration(value);
  52. },
  53. stop: (event, ui) => {
  54. let value = elDuration.spinner('value');
  55. animation.setDuration(value);
  56. },
  57. incremental: (count) => {
  58. let value = elDuration.spinner('value');
  59. let step = elDuration.spinner('option', 'step');
  60. let delta = value * 0.05;
  61. let increments = Math.max(1, parseInt(delta / step));
  62. return increments;
  63. }
  64. });
  65. elDuration.spinner('value', animation.getDuration());
  66. elDuration.spinner('widget').css('width', '100%');
  67. const elKeyframes = this.elContent.find("#animation_keyframes");
  68. const updateKeyframes = () => {
  69. elKeyframes.empty();
  70. //let index = 0;
  71. // <span style="flex-grow: 0;">
  72. // <img name="add" src="${Potree.resourcePath}/icons/add.svg" style="width: 1.5em; height: 1.5em"/>
  73. // </span>
  74. const addNewKeyframeItem = (index) => {
  75. let elNewKeyframe = $(`
  76. <div style="display: flex; margin: 0.2em 0em">
  77. <span style="flex-grow: 1"></span>
  78. <input type="button" name="add" value="insert control point" />
  79. <span style="flex-grow: 1"></span>
  80. </div>
  81. `);
  82. const elAdd = elNewKeyframe.find("input[name=add]");
  83. elAdd.click( () => {
  84. animation.createControlPoint(index,
  85. { position: viewer.scene.view.position,
  86. target: viewer.scene.view.getPivot()
  87. });
  88. animation.changeCallback()
  89. });
  90. elKeyframes.append(elNewKeyframe);
  91. };
  92. const addKeyframeItem = (index) => {
  93. let elKeyframe = $(`
  94. <div style="display: flex; margin: 0.2em 0em">
  95. <span style="flex-grow: 0;">
  96. <img name="assign" src="${Potree.resourcePath}/icons/assign.svg" style="width: 1.5em; height: 1.5em"/>
  97. </span>
  98. <span style="flex-grow: 0;">
  99. <img name="move" src="${Potree.resourcePath}/icons/circled_dot.svg" style="width: 1.5em; height: 1.5em"/>
  100. </span>
  101. <span style="flex-grow: 0; width: 1.5em; height: 1.5em"></span>
  102. <span style="flex-grow: 0; font-size: 1.5em">keyframe</span>
  103. <span style="flex-grow: 1"></span>
  104. <span style="flex-grow: 0;">
  105. <img name="delete" src="${Potree.resourcePath}/icons/remove.svg" style="width: 1.5em; height: 1.5em"/>
  106. </span>
  107. </div>
  108. `);
  109. const elAssign = elKeyframe.find("img[name=assign]");
  110. const elMove = elKeyframe.find("img[name=move]");
  111. const elDelete = elKeyframe.find("img[name=delete]");
  112. elAssign.click( () => { //修改
  113. animation.posCurve.points[index].copy(viewer.scene.view.position);
  114. animation.targets[index].position.copy(viewer.scene.view.getPivot());
  115. animation.changeCallback(index)
  116. });
  117. elMove.click( () => {
  118. viewer.scene.view.position.copy(animation.posCurve.points[index]);
  119. viewer.scene.view.lookAt(animation.targets[index].position);
  120. });
  121. elDelete.click( () => {
  122. animation.removeControlPoint(index);
  123. animation.changeCallback()
  124. });
  125. elKeyframes.append(elKeyframe);
  126. };
  127. let index = 0;
  128. addNewKeyframeItem(index);
  129. animation.posCurve.points.forEach(e=>{
  130. addKeyframeItem(index);
  131. index++;
  132. addNewKeyframeItem(index);
  133. })
  134. };
  135. updateKeyframes();
  136. animation.addEventListener("controlpoint_added", updateKeyframes);
  137. animation.addEventListener("controlpoint_removed", updateKeyframes);
  138. // this._update = () => { this.update(); };
  139. // this.update();
  140. }
  141. update(){
  142. }
  143. };