123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- 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
|