import mitt from 'mitt' import axios from 'axios' //{ axios } from '@/api' export const enter = (dom) => { Potree.settings.isOfficial = true //标记为正式、非测试版本 //Potree.fileServer = axios Potree.settings.libsUrl = '../lib/' let {THREE} = Potree.mergeEditStart(dom) let MergeEditor = viewer.modules.MergeEditor let getPositionByScreen = (pos2d, mustModelId )=>{//通过屏幕坐标获取真实坐标 . mustModelId: 如果指定了模型,modelId必须为mustModelId才有效 let worldPos, localPos, modelId, intersect let Handler = viewer.inputHandler let reGet = ()=>{//不使用当前鼠标所在位置的intersect,单独算 pos2d.clientX = pos2d.x pos2d.clientY = pos2d.y pos2d.onlyGetIntersect = true pos2d.whichPointcloud = true if(mustModelId != void 0){//隐藏其他的模型 let models = MergeEditor.getAllObjects() models.forEach(model=>{ viewer.updateVisible(model, 'forPick', model.dataset_id == mustModelId) }) } intersect = Handler.onMouseMove(pos2d) if(mustModelId != void 0){//恢复 let models = MergeEditor.getAllObjects() models.forEach(model=>{ viewer.updateVisible(model, 'forPick', true) }) } } if (pos2d && pos2d.inDrag) { reGet() } else { intersect = Handler.intersect if(intersect){ modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id if(mustModelId != void 0 && modelId != mustModelId){ reGet() } } } if (intersect && intersect.location) { modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id if(mustModelId != void 0 && modelId != mustModelId){ return null } worldPos = intersect.location.clone() localPos = Potree.Utils.datasetPosTransform({ toDataset: true, datasetId:modelId, position:worldPos }) } else return null return { worldPos, modelId, localPos } } let getScreenByPosition = (pos3d, modelId)=>{//通过模型局部坐标获取屏幕坐标 let isLocal = modelId != void 0 pos3d = new THREE.Vector3().copy(pos3d) let worldPos = isLocal ? Utils.datasetPosTransform({ fromDataset: true, dataset_id: modelId, position:pos3d}) : pos3d var viewport = viewer.mainViewport var camera = viewport.camera var dom = viewer.renderArea //console.log('getScreenByPoint ' + pos3d.toArray()) return Potree.Utils.getPos2d(worldPos, camera, dom, viewport) } let addModel = (props)=> { let bus = mitt() console.log('addModel',props) /* type = 'laser' url就是场景码 props = { select: boolean, scale: number, opacity: number, bottom: number, position: { x, y, z}, rotation: {x, y, z} } addModel({ url, type, props }) */ let model let done = (model_)=>{ model = model_ props.opacity != void 0 && result.changeOpacity(props.opacity) model.addEventListener('changeSelect',(e)=>{ bus.emit('changeSelect',e.selected) }) model.addEventListener('transformChanged',(e)=>{ bus.emit('transformChanged', { position : model.position.clone(), scale: model.scale.x, rotation: model.rotation.clone(), bottom: model.btmHeight }) }) /* model.addEventListener('positionChanged',(e)=>{ bus.emit('positionChanged', e.position) //点云不是直接使用 }) model.addEventListener('scaleChanged',(e)=>{ bus.emit('scaleChanged', model.scale.x) }) model.addEventListener('rotationChanged',(e)=>{ bus.emit('rotationChanged', model.rotation) }) model.addEventListener('bottomChanged',(e)=>{ bus.emit('bottomChanged', model.btmHeight) }) */ bus.emit('loadDone') console.log('loadDone' ) } let progressFun = (progress)=>{ bus.emit('loadProgress',progress) } if(props.type == "glb"){////////////////////////////test props.url = '/lib/potree/resources/models/glb/coffeemat.glb' } Potree.addModel(props, done , progressFun) let result = { bus, changeShow(show){ if(model){ viewer.updateVisible(model, 'changeShow', show) } }, changeSelect(state){ if(model){ MergeEditor.selectModel(model, state, true) } }, changeScale(s){ if(model){ model.scale.set(s,s,s) model.dispatchEvent("scale_changed") } }, changeOpacity(opacity){ if(model){ if(model.isPointcloud){ model.material.opacity = opacity }else{ model.traverse(e=>e.material && (e.material.opacity = opacity)) } } }, changeBottom(z){ model && MergeEditor.setModelBtmHeight(model,z) }, enterRotateMode(){ if(model){ viewer.transformObject(model); viewer.transformationTool.setModeEnable('rotation',true) viewer.transformationTool.setModeEnable('translation',false) } }, enterMoveMode(){ if(model){ viewer.transformObject(model); viewer.transformationTool.setModeEnable('rotation',false) viewer.transformationTool.setModeEnable('translation',true) } }, destroy(){ MergeEditor.removeModel(model) } /* leaveRotateMode(){ } */ } return result } return { addModel, getPositionByScreen, getScreenByPosition } } export default enter