index.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import mitt from 'mitt'
  2. import axios from 'axios' //{ axios } from '@/api'
  3. export const enter = (dom) => {
  4. Potree.settings.isOfficial = true //标记为正式、非测试版本
  5. //Potree.fileServer = axios
  6. Potree.settings.libsUrl = '../lib/'
  7. let {THREE} = Potree.mergeEditStart(dom)
  8. let MergeEditor = viewer.modules.MergeEditor
  9. let getPositionByScreen = (pos2d, mustModelId )=>{//通过屏幕坐标获取真实坐标 . mustModelId: 如果指定了模型,modelId必须为mustModelId才有效
  10. let worldPos, localPos, modelId, intersect
  11. let Handler = viewer.inputHandler
  12. let reGet = ()=>{//不使用当前鼠标所在位置的intersect,单独算
  13. pos2d.clientX = pos2d.x
  14. pos2d.clientY = pos2d.y
  15. pos2d.onlyGetIntersect = true
  16. pos2d.whichPointcloud = true
  17. if(mustModelId != void 0){//隐藏其他的模型
  18. let models = MergeEditor.getAllObjects()
  19. models.forEach(model=>{
  20. viewer.updateVisible(model, 'forPick', model.dataset_id == mustModelId)
  21. })
  22. }
  23. intersect = Handler.onMouseMove(pos2d)
  24. if(mustModelId != void 0){//恢复
  25. let models = MergeEditor.getAllObjects()
  26. models.forEach(model=>{
  27. viewer.updateVisible(model, 'forPick', true)
  28. })
  29. }
  30. }
  31. if (pos2d && pos2d.inDrag) {
  32. reGet()
  33. } else {
  34. intersect = Handler.intersect
  35. if(intersect){
  36. modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
  37. if(mustModelId != void 0 && modelId != mustModelId){
  38. reGet()
  39. }
  40. }
  41. }
  42. if (intersect && intersect.location) {
  43. modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
  44. if(mustModelId != void 0 && modelId != mustModelId){
  45. return null
  46. }
  47. worldPos = intersect.location.clone()
  48. localPos = Potree.Utils.datasetPosTransform({ toDataset: true, datasetId:modelId, position:worldPos })
  49. } else return null
  50. return { worldPos, modelId, localPos }
  51. }
  52. let getScreenByPosition = (pos3d, modelId)=>{//通过模型局部坐标获取屏幕坐标
  53. let isLocal = modelId != void 0
  54. pos3d = new THREE.Vector3().copy(pos3d)
  55. let worldPos = isLocal ? Utils.datasetPosTransform({ fromDataset: true, dataset_id: modelId, position:pos3d}) : pos3d
  56. var viewport = viewer.mainViewport
  57. var camera = viewport.camera
  58. var dom = viewer.renderArea
  59. //console.log('getScreenByPoint ' + pos3d.toArray())
  60. return Potree.Utils.getPos2d(worldPos, camera, dom, viewport)
  61. }
  62. let addModel = (props)=> {
  63. let bus = mitt()
  64. console.log('addModel',props)
  65. /* type = 'laser' url就是场景码
  66. props = {
  67. select: boolean,
  68. scale: number,
  69. opacity: number,
  70. bottom: number,
  71. position: { x, y, z},
  72. rotation: {x, y, z}
  73. }
  74. addModel({ url, type, props }) */
  75. let model
  76. let done = (model_)=>{
  77. model = model_
  78. props.opacity != void 0 && result.changeOpacity(props.opacity)
  79. model.addEventListener('changeSelect',(e)=>{
  80. bus.emit('changeSelect',e.selected)
  81. })
  82. model.addEventListener('transformChanged',(e)=>{
  83. bus.emit('transformChanged', {
  84. position : model.position.clone(),
  85. scale: model.scale.x,
  86. rotation: model.rotation.clone(),
  87. bottom: model.btmHeight
  88. })
  89. })
  90. /* model.addEventListener('positionChanged',(e)=>{
  91. bus.emit('positionChanged', e.position) //点云不是直接使用
  92. })
  93. model.addEventListener('scaleChanged',(e)=>{
  94. bus.emit('scaleChanged', model.scale.x)
  95. })
  96. model.addEventListener('rotationChanged',(e)=>{
  97. bus.emit('rotationChanged', model.rotation)
  98. })
  99. model.addEventListener('bottomChanged',(e)=>{
  100. bus.emit('bottomChanged', model.btmHeight)
  101. }) */
  102. bus.emit('loadDone')
  103. console.log('loadDone' )
  104. }
  105. let progressFun = (progress)=>{
  106. bus.emit('loadProgress',progress)
  107. }
  108. if(props.type == "glb"){////////////////////////////test
  109. props.url = '/lib/potree/resources/models/glb/coffeemat.glb'
  110. }
  111. Potree.addModel(props, done , progressFun)
  112. let result = {
  113. bus,
  114. changeShow(show){
  115. if(model){
  116. viewer.updateVisible(model, 'changeShow', show)
  117. }
  118. },
  119. changeSelect(state){
  120. if(model){
  121. MergeEditor.selectModel(model, state, true)
  122. }
  123. },
  124. changeScale(s){
  125. if(model){
  126. model.scale.set(s,s,s)
  127. model.dispatchEvent("scale_changed")
  128. }
  129. },
  130. changeOpacity(opacity){
  131. if(model){
  132. if(model.isPointcloud){
  133. model.material.opacity = opacity
  134. }else{
  135. model.traverse(e=>e.material && (e.material.opacity = opacity))
  136. }
  137. }
  138. },
  139. changeBottom(z){
  140. model && MergeEditor.setModelBtmHeight(model,z)
  141. },
  142. enterRotateMode(){
  143. if(model){
  144. viewer.transformObject(model);
  145. viewer.transformationTool.setModeEnable('rotation',true)
  146. viewer.transformationTool.setModeEnable('translation',false)
  147. }
  148. },
  149. enterMoveMode(){
  150. if(model){
  151. viewer.transformObject(model);
  152. viewer.transformationTool.setModeEnable('rotation',false)
  153. viewer.transformationTool.setModeEnable('translation',true)
  154. }
  155. },
  156. destroy(){
  157. MergeEditor.removeModel(model)
  158. }
  159. /* leaveRotateMode(){
  160. } */
  161. }
  162. return result
  163. }
  164. return {
  165. addModel, getPositionByScreen,
  166. getScreenByPosition
  167. }
  168. }
  169. export default enter