|
@@ -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()
|
|
|
},
|
|
|
|