浏览代码

fix: 还没改好,动画

xzw 5 月之前
父节点
当前提交
83dd245237
共有 2 个文件被更改,包括 1557 次插入996 次删除
  1. 1294 938
      pnpm-lock.yaml
  2. 263 58
      src/sdk/cover/index.js

文件差异内容过多而无法显示
+ 1294 - 938
pnpm-lock.yaml


+ 263 - 58
src/sdk/cover/index.js

@@ -132,7 +132,10 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
     }
     
     let { THREE } = Potree.mergeEditStart(dom, mapDom)
-    let MergeEditor = viewer.modules.MergeEditor
+    let {MergeEditor, AnimationEditor} = viewer.modules
+    
+    
+    
     Potree.settings.unableNavigate = true 
     Potree.setLonlat(lonlat[0], lonlat[1])
     
@@ -246,6 +249,11 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             viewer.mainViewport.view.radius = 0.1 //使pivot在面前一丢丢距离
             viewer.setControls(viewer.orbitControls)
             viewer.removeEventListener('camera_changed', camera_changed)
+            
+            
+            viewer.objs.children.forEach(model=>{
+                model.result_?.updateVisiByRange()
+            })
              
         }
     }
@@ -1160,6 +1168,12 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
 
                     }
                 },
+                enterScaleMode(){
+                    if (model) {
+                        MergeEditor.transformControls.attach(model)
+                        MergeEditor.transformControls.mode = 'scale'
+                    }
+                }
                 leaveTransform() {
                     console.log('leaveTransform')
                     if (MergeEditor.split) {//分屏校准
@@ -1313,10 +1327,245 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
         },
 
 
-        //测量线的点都附着于各个模型,当模型变化时,点跟着变化。
 
 
 
+
+
+
+
+
+        createAnimationGroup(){//创建动画模块
+            let bus = mitt()
+            
+            
+            AnimationEditor.addEventListener('atTime',e=>{//发送当前动画时间,同步字幕
+                let time = THREE.Math.clamp(e.time, 0, AnimationEditor.duration)
+                bus.emit('currentTime',time)
+            })
+            
+            let funs = {
+                bus,
+                play(){
+                    AnimationEditor.play()
+                },
+                pause(){
+                    AnimationEditor.pause()
+                },
+                addAnimationModel(data){// 添加动画模型
+                   /*  title: string;   模型名称
+                      url: string;     模型路径
+                      showTitle: boolean;   是否显示名称
+                      fontSize: number;     名称字体大小
+                      globalVisibility: boolean;   是否全局可视
+                      visibilityRange: number;  */
+                      
+                      
+                    let model
+                    let prop = {
+                        url: data.url,
+                        title: data.title, 
+                    }
+                    MergeEditor.addTitleForModel(model)
+                    let modelFuns = sdk.addModel(prop)
+                     
+                     
+                    let visibleRange 
+                    let updateVisiByRange = ()=>{//可见范围
+                        let visi = true
+                        if(visibleRange){
+                            let cameraPos = viewer.mainViewport.view.position
+                            let dis = model.boundCenter.distanceTo(cameraPos)
+                            visi = dis < visibleRange
+                        }
+                        Potree.Utils.updateVisible(model,'outOfVisiRange', visi) 
+                    } 
+                    model.addEventListener('transformChanged',updateVisiByRange)
+                    
+                    
+                    
+                    let result = Object.assign(modelFuns, { 
+                        updateVisiByRange,
+                        visibilityTitle(v){ 
+                            Potree.Utils.updateVisible(model.titleLabel,'user', v) 
+                        },
+                        // 更改动画可见范围  不传为全局可见
+                        changeVisibilityRange(range){
+                            visibleRange = range 
+                            updateVisiByRange()
+                        }; 
+                        // 更改模型名称
+                        changeTitle(name){
+                            model.name = name
+                            if(model.titleLabel){
+                                model.titleLabel.setText(name)
+                            }
+                        },
+                         
+                        changeFontSize(fontsize){
+                            model.titleLabel.fontsize = fontsize
+                            model.titleLabel.updateTexture(); 
+                            viewer.dispatchEvent('content_changed')
+                        }
+
+                        // 添加模型帧
+                        addFrame: (frame){
+                            let key = {time: frame:time}
+                            let getData = (data)=>{
+                                return {
+                                    pos: new THREE.Vector3().copy(data.position),
+                                    scale: new THREE.Vector3().copy(data.scale),
+                                    qua: new THREE.Quaternion().copy(data.quaternion)
+                                }
+                            }
+                            Object.assign(key, getData(frame.mat)) 
+                            AnimationEditor.addKey(model, 'pose', getData(frame))
+                            return {
+                                destroy(){ 
+                                    AnimationEditor.removeKey(model,'pose', key)
+                                },
+                                changeTime(time){
+                                    key.time = time
+                                    AnimationEditor.reOrderKey(model, 'pose', key)
+                                }
+                                setMat(data){//设置帧
+                                    Object.assign(key,getData(data)) 
+                                }
+                            } 
+                        },
+                        addAction: (frame){// 添加模型动作
+                        
+                            let key = Object.assign({},frame) 
+                                key.weight = key.amplitude
+                                key.actionIndex = model.actions.findIndex(e=>e.name == key.key)
+                                if(key.actionIndex == -1){
+                                    return console.error('cannot find action', key.key)
+                                }   
+                                delete key.amplitude
+                                delete key.key
+                                delete key.duration
+                                
+                            AnimationEditor.addKey(model, 'pose', key)
+                            
+                            return {
+                                destroy(){ 
+                                    AnimationEditor.removeKey(model,'clip', key)
+                                },
+                                changeTime(time){
+                                    key.time = time
+                                    AnimationEditor.reOrderKey(model, 'clip', key)
+                                },
+                                changeDuration(dur){ 
+                                    key.dur = dur
+                                },
+                                changeAmplitude(weight){//修改动作幅度
+                                    key.weight = weight
+                                },
+                                changeSpeed(s){
+                                    key.speed = speed
+                                }
+                            } 
+                        },
+
+                        addPath(frame){//走路路径
+                            let key = Object.assign({},frame) 
+                                key.path = key.path.path
+                                key.dur = key.duration
+                                delete key.duration
+                                
+                            AnimationEditor.addKey(model, 'path', key)
+                          
+                            return {
+                                destroy(){ 
+                                    AnimationEditor.removeKey(model, 'path', key)
+                                },
+                                changeTime(time){
+                                    key.time = time
+                                    AnimationEditor.reOrderKey(model, 'path', key)
+                                },
+                                changeDuration(dur){ 
+                                    key.dur = dur
+                                },
+                                changeReverse(reverse){ 
+                                    key.reverse = reverse
+                                },
+                                changePath(path){
+                                    key.path = path.path
+                                }
+                            }  
+  
+                        }, 
+ 
+                        getCurrentMat(){// 获取当前时间改模型的姿态
+                            return {
+                                quaternion: model.quaternion.clone(),
+                                scale: model.scale.clone(),
+                                position: model.position.clone()
+                            } 
+                        },
+                        setCurrentTime(s){// 设置当前时间, 单位为秒
+                            AnimationEditor.at(s)
+                        }, 
+                        
+                        getCurrentSubtitlePixel(size: {width: number, height: number}){// 获取当前模型旁白出现的适合位置,传入旁边dom的宽高,返回像素位置
+                            let bound = model.boundingBox 
+                            let boundPoint = [  
+                                new THREE.Vector3(bound.min.x, bound.min.y, bound.min.z ),
+                                new THREE.Vector3(bound.min.x, bound.min.y, bound.max.z ), 
+                                new THREE.Vector3(bound.min.x, bound.max.y, bound.min.z ),
+                                new THREE.Vector3(bound.max.x, bound.min.y, bound.min.z ),
+                                new THREE.Vector3(bound.max.x, bound.max.y, bound.min.z ),
+                                new THREE.Vector3(bound.max.x, bound.min.y, bound.max.z ),
+                                new THREE.Vector3(bound.min.x, bound.max.y, bound.max.z ),
+                                new THREE.Vector3(bound.max.x, bound.max.y, bound.max.z ),
+                            ];
+                            let pos2ds = boundPoint.map((point)=>{
+                                return Potree.Utils.getPos2d(point, viewer.mainViewport , viewer.renderArea, viewer.renderer  )
+                            }).filter(e=>e.inSight && e.trueSide )
+                            if(pos2ds.length == 0)return
+                            
+                             
+                            pos2ds.sort((a,b)=>{return a.vector.x - b.vector.x})
+                            let left = pos2ds[0], right = pos2ds[pos2ds.length - 1] 
+                            let leftPad = left.vector.x - (-1) //模型左侧空出的宽度
+                            let rightPad = 1 - right.vector.y
+                            let x,y //返回字幕左上角位置
+                            let margin = 30;
+                            if(leftPad > rightPad){//向左侧扩展
+                                x = left.pos.x - margin - width
+                                y = left.pos.y - height/2
+                            }else{
+                                x = left.pos.x + margin 
+                                y = left.pos.y - height/2 
+                            }
+                            return {x,y}
+                        }, 
+                    })
+                    model.result_ = result
+                    return result
+                      
+                      
+                },
+                
+            }
+            return funs
+            
+            
+            
+        }
+
+
+
+
+
+
+
+
+
+
+
+        //测量线的点都附着于各个模型,当模型变化时,点跟着变化。
+
         // 新的测量创建方法,传入type 返回新测量对象
         startMeasure(type) {
             // 寻创建的测量对象有上面绘画测量对象的所有方法
@@ -1398,60 +1647,14 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             return result
         },
 
- /* export type PathProps = {
-          // 线段名称
-          name: string,
-          // 是否显示名称,
-          showName: boolean,
-          // 文字大小
-          fontSize: number,
-          // 是否显示方向,
-          showDirection: boolean,
-          // 方向是否反向
-          reverseDirection: boolean,
-          line: {
-            width: number,
-            color: string,
-            altitudeAboveGround: number
-            position: SceneLocalPos,
-            normal: SceneLocalPos,
-            modelId: string
-          },
-          points: {
-            // 点位名称
-            name: string,
-            position: SceneLocalPos,
-            modelId: string,
-          }[]
-        } 
-        
-        
-        
-        
-        bus: Emitter<{
-            // 标注点击事件
-            click: void;
-            // 鼠标移入标注事件
-            enter: void;
-            // 鼠标移出标注事件
-            leave: void;
-            // 线段坐标更改事件
-            linePositionChange: {
-              pos: SceneLocalPos,
-              normal: SceneLocalPos,
-              modelId: string
-            }
-            // 路径点位置变更
-            changePoints: PathProps['points']
-            // 距离相机位置变更
-            toCameraDistanceChange: number
-          }>;
-        
-        
-        
-        
-        
-        */
+
+
+
+
+
+
+
+
         createPath(props){//路线
         
             //console.log('createPath', props)
@@ -1532,7 +1735,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             }  
             let functions = Object.assign(funs,{
                 bus,
-                
+                path,
                 changeEditMode(state){//进入编辑 
                     if(!state){ 
                         viewer.dispatchEvent({ type: 'cancel_insertions', dontRemove: true, measure:path })
@@ -1729,6 +1932,8 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
 
 
 
+
+
         startAddSth(){//开始添加热点
             Potree.settings.disableClick = true  //禁止点击事件,尤其是全景模式下,否则会走到下一个点
             viewer.dispatchEvent('start_inserting_tag')
@@ -1826,7 +2031,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
                 getCameraDisSquared(){//距离intersect的位置
                     return viewer.mainViewport.camera.position.distanceToSquared(tag.getWorldPosition(new THREE.Vector3)) /* < tag.farSquared */
                 }, 
-                destory(){
+                destroy(){
                     tag.dispose()
                 },