RotationEvent.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. export default class RotationEvent {
  2. constructor(e) {
  3. E(this, "touchStartX");
  4. E(this, "touchStartY");
  5. E(this, "handelResize");
  6. E(this, "_room");
  7. E(this, "_canvas");
  8. E(this, "handleTouchStart", e=>{
  9. const t = e.touches[0];
  10. this.touchStartX = t.pageX,
  11. this.touchStartY = t.pageY,
  12. this._room.emit("touchStart", {
  13. event: e
  14. })
  15. }
  16. );
  17. E(this, "handleMouseDown", e=>{
  18. this.touchStartX = e.pageX,
  19. this.touchStartY = e.pageY
  20. }
  21. );
  22. E(this, "handleMouseMove", e=>{
  23. if (!this.touchStartX || !this.touchStartY)
  24. {
  25. return;
  26. }
  27. // const t = e.pageX
  28. // , r = e.pageY
  29. // , n = t - this.touchStartX
  30. // , o = r - this.touchStartY
  31. // , a = this._room.options.canvas.offsetHeight
  32. // , s = this._room.options.canvas.offsetWidth;
  33. // let l = 2 * o / a
  34. // , u = 2 * n / s;
  35. // l > 1 && (l = 1),
  36. // u > 1 && (u = 1),
  37. // this._room.actionsHandler.rotate({
  38. // pitch: l,
  39. // yaw: u
  40. // }),
  41. // this.touchStartX = t,
  42. // this.touchStartY = r
  43. const pageX = e.pageX
  44. const pageY = e.pageY
  45. const offsetX = pageX - this.touchStartX
  46. const offsetY = pageY - this.touchStartY
  47. const canvasHeight = this._room.options.canvas.offsetHeight
  48. const canvasWidth = this._room.options.canvas.offsetWidth
  49. if(window.initFinished) {
  50. // 旋转中
  51. if(window.rotating) return
  52. // offset累计
  53. if(!this.offset) this.offset = 0
  54. this.offset += offsetX
  55. // 累计超过6度
  56. let angle = this.offset / canvasWidth * (2*Math.PI)
  57. angle = Math.round(angle / (Math.PI/30)) * (Math.PI/30)
  58. if(Math.abs(angle) < Math.PI/30) return
  59. // 开始旋转
  60. this._room.actionsHandler.rotate({
  61. type: 'rotate',
  62. angle: Math.PI/30 * Math.sign(angle) // 目前固定1次mousemove只转1帧
  63. });
  64. // 重置累计
  65. this.offset = 0
  66. }
  67. this.touchStartX = pageX;
  68. this.touchStartY = pageY;
  69. }
  70. );
  71. E(this, "handleMouseUp", ()=>{
  72. this.touchStartX = void 0,
  73. this.touchStartY = void 0
  74. }
  75. );
  76. E(this, "handleTouchMove", e=>{
  77. if (!this.touchStartX || !this.touchStartY)
  78. return;
  79. const t = e.touches[0]
  80. // , r = t.pageX
  81. // , n = t.pageY
  82. // , o = r - this.touchStartX
  83. // , a = n - this.touchStartY
  84. // , s = this._room.options.canvas.offsetHeight
  85. // , l = this._room.options.canvas.offsetWidth;
  86. const pageX = t.pageX
  87. const pageY = t.pageY
  88. const offsetX = pageX - this.touchStartX
  89. const offsetY = pageY - this.touchStartY
  90. const canvasHeight = this._room.options.canvas.offsetHeight
  91. const canvasWidth = this._room.options.canvas.offsetWidth
  92. let pitch = 2 * offsetY / canvasHeight;
  93. let yaw = 2 * offsetX / canvasWidth;
  94. pitch > 1 && (pitch = 1);
  95. yaw > 1 && (yaw = 1);
  96. /***********************************************************************xst****************************************************************/
  97. // if(window.initFinished){
  98. // let angle = offsetX / offsetWidth * 2 * Math.PI
  99. // this._room.actionsHandler.rotate({
  100. // type: 'rotate',
  101. // angle: angle
  102. // });
  103. // }
  104. if(window.initFinished){
  105. // 旋转中
  106. if(this.rotating) return
  107. // offset累计
  108. if(!this.offset) this.offset = 0
  109. this.offset += offsetX
  110. // 累计超过6度
  111. let angle = this.offset / (canvasWidth*10) * (2*Math.PI)
  112. angle = Math.round(angle / (Math.PI/30)) * (Math.PI/30)
  113. if(Math.abs(angle) < Math.PI/30) return
  114. this.rotating = true
  115. setTimeout(() => {
  116. // 开始旋转
  117. this._room.actionsHandler.rotate({
  118. type: 'rotate',
  119. angle: Math.PI/30 * Math.sign(angle) // angle
  120. });
  121. // 重置累计
  122. this.offset = 0
  123. this.rotating = false
  124. }, 1000/32)
  125. }
  126. /********************************************************************************************************************************************/
  127. this.touchStartX = pageX;
  128. this.touchStartY = pageY;
  129. /***********************************************************************xst****************************************************************/
  130. // this._room.emit("touchMove", {
  131. // pitch: pitch,
  132. // yaw: yaw,
  133. // event: e
  134. // })
  135. /********************************************************************************************************************************************/
  136. }
  137. );
  138. E(this, "handleTouchEnd", e=>{
  139. this._room.emit("touchEnd", {
  140. event: e
  141. })
  142. }
  143. );
  144. this._room = e,
  145. this._canvas = e.canvas,
  146. this.handelResize = this.reiszeChange()
  147. }
  148. init() {
  149. this._canvas.addEventListener("touchstart", this.handleTouchStart),
  150. this._canvas.addEventListener("touchmove", this.handleTouchMove),
  151. this._canvas.addEventListener("touchend", this.handleTouchEnd),
  152. this._room.scene.preventDefaultOnPointerDown = !1,
  153. this._room.scene.preventDefaultOnPointerUp = !1,
  154. this._canvas.addEventListener("mousedown", this.handleMouseDown),
  155. this._canvas.addEventListener("mousemove", this.handleMouseMove),
  156. this._canvas.addEventListener("mouseup", this.handleMouseUp)
  157. }
  158. clear() {
  159. this._canvas.removeEventListener("touchstart", this.handleTouchStart),
  160. this._canvas.removeEventListener("touchmove", this.handleTouchMove),
  161. this._canvas.removeEventListener("touchend", this.handleTouchEnd),
  162. this._canvas.removeEventListener("mousedown", this.handleMouseDown),
  163. this._canvas.removeEventListener("mousemove", this.handleMouseMove),
  164. this._canvas.removeEventListener("mouseup", this.handleMouseUp)
  165. }
  166. reiszeChange() {
  167. window.addEventListener("resize", ()=>{}
  168. )
  169. }
  170. }