|
@@ -1,111 +1,113 @@
|
|
|
-
|
|
|
+import * as THREE from "../../public/static/lib/three.js/build/three.module.js";
|
|
|
import math from './math.js'
|
|
|
|
|
|
export default class ConvertViews {
|
|
|
constructor() {
|
|
|
this.sourceApp = null
|
|
|
this.targetApp = null
|
|
|
- this.player1 = null
|
|
|
- this.player2 = null
|
|
|
- this.KanKan = null
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- /* bind(options = { sourceApp: null, targetApp: null }) {
|
|
|
- if (options.sourceApp) {
|
|
|
- this.sourceApp = options.sourceApp
|
|
|
- this.player1 = this.sourceApp.core.get('Player')
|
|
|
- //this.player1.model.addEventListener('gotPanos', this.init.bind(this))
|
|
|
- } else if (options.targetApp) {
|
|
|
- this.targetApp = options.targetApp
|
|
|
- this.player2 = this.targetApp.core.get('Player')
|
|
|
- //this.player2.model.addEventListener('gotPanos', this.init.bind(this))
|
|
|
- }
|
|
|
- if (this.sourceApp && this.targetApp) {
|
|
|
- // 两个实例都加载完了,可以进行特性处理
|
|
|
- this.init()
|
|
|
- this.applyDiff(options.sourceApp || options.targetApp)
|
|
|
- }
|
|
|
- } */
|
|
|
-
|
|
|
- init(viewer, dom2, sceneType, data) {
|
|
|
+
|
|
|
+ clear(){
|
|
|
+ this.loaded = false;
|
|
|
+ this.targetApp = this.sourceApp = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ init(sourceApp, targetApp, dom2, sceneType, cameraData, sourcePano) {
|
|
|
//if (!this.player1.model.panos.list.length || !this.player2.model.panos.list.length) return
|
|
|
+
|
|
|
+ if(this.loaded || !targetApp ) return
|
|
|
+
|
|
|
+ this.sourceApp = sourceApp
|
|
|
+ this.targetApp = targetApp
|
|
|
+ let viewer = this.viewer = targetApp.viewer
|
|
|
+
|
|
|
this.needConvertAxis = sceneType == '4dkk'
|
|
|
this.lastCamStatus = viewer.getCameraStatus()
|
|
|
+ this.computeAveDiffLon(sourcePano)
|
|
|
|
|
|
-
|
|
|
- viewer.setNavigationMode(Glodon.Bimface.Viewer.NavigationMode3D.Walk)
|
|
|
+ viewer.setNavigationMode(targetApp.Glodon.Bimface.Viewer.NavigationMode3D.Walk)
|
|
|
viewer.setFlySpeedRate(5)
|
|
|
viewer.getViewer().setTransitionAnimationState(false) //setCameraStatus瞬间变化相机
|
|
|
|
|
|
- viewer.addEventListener('Rendered', (e)=>{
|
|
|
- let info = viewer.getCameraStatus()
|
|
|
-
|
|
|
+ /* viewer.addEventListener('Rendered', (e)=>{
|
|
|
+ let info = viewer.getCameraStatus()
|
|
|
let poseChanged = !math.closeTo(this.lastCamStatus.position, info.position)
|
|
|
|| !math.closeTo(this.lastCamStatus.target, info.target)
|
|
|
|| !math.closeTo(this.lastCamStatus.fov, info.fov)
|
|
|
|
|
|
- if(poseChanged){
|
|
|
-
|
|
|
+ if(poseChanged){
|
|
|
this.send(info)
|
|
|
}
|
|
|
|
|
|
- this.lastCamStatus = info
|
|
|
+ this.lastCamStatus = info
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- /* aspect: 0.7879440258342304
|
|
|
- coordinateSystem: "world"
|
|
|
- far: 11485.989363357028
|
|
|
- fov: 45
|
|
|
- name: "persp"
|
|
|
- near: 1.1852000000072447
|
|
|
- position: {x: -1130.0432094639486, y: -6058.569138159733, z: 2265.9284566100446}
|
|
|
- target: {x: 310.3968263091223, y: -66.0595010237127, z: 1477.7045866099475}
|
|
|
- up: {x: 0, y: 1.534753124827774e-13, z: 1}
|
|
|
- version: 1
|
|
|
- zoom: 0 */
|
|
|
- })
|
|
|
+ }) */
|
|
|
|
|
|
|
|
|
- viewer.addEventListener( Glodon.Bimface.Viewer.Viewer3DEvent.ViewAdded,
|
|
|
+ /* viewer.addEventListener(targetApp.Glodon.Bimface.Viewer.Viewer3DEvent.ViewAdded,
|
|
|
()=>{
|
|
|
this.loaded = true
|
|
|
if(this.firstData){
|
|
|
this.receive(this.firstData)
|
|
|
}
|
|
|
}
|
|
|
- )
|
|
|
+ ) */
|
|
|
+ this.loaded = true
|
|
|
+ this.receive(cameraData)
|
|
|
|
|
|
- this.receive(data)
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
- {
|
|
|
+ {//传递到另一边的dom
|
|
|
+ let getEvent = (type, e)=>{
|
|
|
+ return new MouseEvent(type, {
|
|
|
+ bubbles: false,//?
|
|
|
+ cancelable: true,
|
|
|
+ view: this.sourceApp,
|
|
|
+ clientX: e.clientX, clientY: e.clientY,
|
|
|
+ button: e.button, buttons: e.buttons, which: e.which,
|
|
|
+ altKey: e.altKey, ctrlKey: e.ctrlKey, shiftKey:e.shiftKey, metaKey: e.metaKey,
|
|
|
+ detail:e.detail,
|
|
|
+ //target : dom2
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
this.lockCamera(true)
|
|
|
let dom1 = viewer.getDomElement()
|
|
|
- dom1.addEventListener('mousedown',(e)=>{//传递到另一边的dom
|
|
|
- dom2.dispatchEvent(e) //试试
|
|
|
+ dom1.addEventListener('mousedown',(e)=>{
|
|
|
+ let event = getEvent('mousedown', e)
|
|
|
+ dom2.dispatchEvent(event)
|
|
|
})
|
|
|
- dom1.addEventListener('mousemove',(e)=>{//传递到另一边的dom
|
|
|
- dom2.dispatchEvent(e) //试试
|
|
|
+ dom1.addEventListener('mousemove',(e)=>{
|
|
|
+ let event = getEvent('mousemove', e)
|
|
|
+ dom2.dispatchEvent(event)
|
|
|
})
|
|
|
- dom1.addEventListener('mouseup',(e)=>{//传递到另一边的dom
|
|
|
- dom2.dispatchEvent(e) //试试
|
|
|
+ dom1.addEventListener('mouseup',(e)=>{
|
|
|
+ let event = getEvent('mouseup', e)
|
|
|
+ sourceApp.dispatchEvent(event) //mouseup 在laser中加在window上的
|
|
|
})
|
|
|
- dom1.addEventListener('mousewheel',(e)=>{//传递到另一边的dom
|
|
|
- dom2.dispatchEvent(e) //试试
|
|
|
+ dom1.addEventListener('mousewheel',(e)=>{
|
|
|
+ let event = getEvent('mousewheel', e)
|
|
|
+ event.wheelDelta = e.wheelDelta //wheelDelta没法在getEvent参数中赋值
|
|
|
+ dom2.dispatchEvent(event)
|
|
|
})
|
|
|
let stop = (e)=>{
|
|
|
- var event = document.createEvent('MouseEvents');
|
|
|
+ /* var event = document.createEvent('MouseEvents');
|
|
|
event.initMouseEvent('mouseup', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
|
|
|
- dom2.dispatchEvent(event)
|
|
|
+ dom2.dispatchEvent(event) */
|
|
|
+ let event = getEvent('mouseup', e)
|
|
|
+ dom2.dispatchEvent(event)
|
|
|
}
|
|
|
dom1.addEventListener('mouseout',stop)
|
|
|
dom1.addEventListener('mouseover',stop)
|
|
|
|
|
|
- }
|
|
|
- this.computeAveDiffLon()
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
}
|
|
|
|
|
@@ -123,25 +125,23 @@ export default class ConvertViews {
|
|
|
return //正在操作当前,不接收
|
|
|
} */
|
|
|
|
|
|
- let position, target
|
|
|
- let currStatus = viewer.getCameraStatus()
|
|
|
+ let position = new THREE.Vector3, target = new THREE.Vector3
|
|
|
+ let currStatus = this.viewer.getCameraStatus()
|
|
|
if(data.position){
|
|
|
position = new THREE.Vector3().copy(data.position)
|
|
|
- }else{
|
|
|
- position.copy(currStatus.position)
|
|
|
- }
|
|
|
- if(this.needConvertAxis){
|
|
|
- position = math.convertVector.YupToZup(position)
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
|
|
|
if(!data.target){
|
|
|
if(data.quaternion){
|
|
|
- if(this.needConvertAxis){
|
|
|
+ /* if(this.needConvertAxis){
|
|
|
data.quaternion = math.convertQuaternion.YupToZup(data.quaternion)
|
|
|
- }
|
|
|
+ } */
|
|
|
let dir = new THREE.Vector3(0, 0, -1).applyQuaternion(data.quaternion)
|
|
|
- dir.applyQuaternion(this.diffQuaternion)/////!
|
|
|
+ //dir.applyQuaternion(this.diffQuaternion)/////!
|
|
|
+
|
|
|
+
|
|
|
target.copy(position).add(dir)
|
|
|
}
|
|
|
}else{
|
|
@@ -151,92 +151,123 @@ export default class ConvertViews {
|
|
|
target.copy(data.target)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if(this.needConvertAxis){
|
|
|
+ position = math.convertVector.YupToZup(position)
|
|
|
+ target = math.convertVector.YupToZup(target)
|
|
|
+ }
|
|
|
+
|
|
|
+ position.applyMatrix4(this.convertMatrix)
|
|
|
+ target.applyMatrix4(this.convertMatrix)
|
|
|
+
|
|
|
|
|
|
let msg = {
|
|
|
position,
|
|
|
target,
|
|
|
- up: new THREE.Vector3(0,0,1)
|
|
|
- }//前三个缺一不可
|
|
|
+ up: new THREE.Vector3(0,0,1),
|
|
|
+ //前三个缺一不可
|
|
|
+
|
|
|
+ fov : data.fov
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- viewer.setCameraStatus(msg)
|
|
|
+ this.viewer.setCameraStatus(msg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//fov, near, far
|
|
|
-
|
|
|
+ /* aspect: 0.7879440258342304
|
|
|
+ coordinateSystem: "world"
|
|
|
+ far: 11485.989363357028
|
|
|
+ fov: 45
|
|
|
+ name: "persp"
|
|
|
+ near: 1.1852000000072447
|
|
|
+ position: {x: -1130.0432094639486, y: -6058.569138159733, z: 2265.9284566100446}
|
|
|
+ target: {x: 310.3968263091223, y: -66.0595010237127, z: 1477.7045866099475}
|
|
|
+ up: {x: 0, y: 1.534753124827774e-13, z: 1}
|
|
|
+ version: 1
|
|
|
+ zoom: 0 */
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
- send(info){
|
|
|
- let camera = viewer.getViewer().camera
|
|
|
+ /* send(info){
|
|
|
+ let camera = this.viewer.getViewer().camera
|
|
|
|
|
|
let data = {
|
|
|
position : info.position,
|
|
|
quaternion : camera.quaternion,
|
|
|
target : info.target,
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- lockCamera(locked){
|
|
|
- this.locked = locked
|
|
|
- this.updateCtrlEnable()
|
|
|
- }
|
|
|
-
|
|
|
- setPanoMode(state){
|
|
|
- this.isPanoMode = state
|
|
|
- this.updateCtrlEnable()
|
|
|
- }
|
|
|
-
|
|
|
- updateCtrlEnable(){
|
|
|
- viewer.camera3D.enableRotate(this.locked ? false : true)
|
|
|
- viewer.enableShortcutKey((this.locked || this.isPanoMode) ? false : true) //键盘移动
|
|
|
- }
|
|
|
+ }
|
|
|
+ } */
|
|
|
|
|
|
|
|
|
|
|
|
- computeAveDiffLon() {
|
|
|
+ computeAveDiffLon(sourcePano) {
|
|
|
//获取两个场景的lon偏差值
|
|
|
//需要点的个数>1, 且两个场景点一一对应,位置接近且顺序一致
|
|
|
//pick两个点来计算
|
|
|
let diffLonAve = 0,
|
|
|
diffLons = []
|
|
|
|
|
|
- let panoPos1 = [//4dkk
|
|
|
-
|
|
|
- ]
|
|
|
- let panoPos2 = [{
|
|
|
- x: -0.8948667986001945,
|
|
|
- y: -0.7200655233964686,
|
|
|
- z: 1.742798893355817
|
|
|
- },{
|
|
|
- x: -0.8675960783595227,
|
|
|
- y: 2.3758592370806317,
|
|
|
- z: 1.7428102653224462
|
|
|
- }]
|
|
|
+ /* let panoPos1 = [//4dkk SS-t-lc5OWhZPaC
|
|
|
+ new THREE.Vector3( 2.1985836955069153, -0.7253820937020852, -0.01348725),
|
|
|
+ new THREE.Vector3( 4.07288387528266, 1.8350265362839944, 0.04772775)
|
|
|
+ ] */
|
|
|
+
|
|
|
+ let panoPos1 = sourcePano
|
|
|
|
|
|
+ let panoPos2 = [
|
|
|
+ new THREE.Vector3( -5.313605730801787, -4.889868407960505, 1.717447893355817),
|
|
|
+ new THREE.Vector3( -5.337403524084278, -2.5012228235167737, 1.7608838933558175)
|
|
|
+ ]
|
|
|
+
|
|
|
let length = panoPos1.length
|
|
|
|
|
|
if(this.needConvertAxis){
|
|
|
panoPos1 = panoPos1.map(e=>math.convertVector.YupToZup(e))
|
|
|
}
|
|
|
|
|
|
- //挑选连续的两个点为向量来计算,如有123个漫游点,则选取12 23 31作为向量
|
|
|
|
|
|
- let index = 0
|
|
|
+ var vec1 = new THREE.Vector3().subVectors(panoPos1[0], panoPos1[1]) //旧的向量
|
|
|
+ var vec2 = new THREE.Vector3().subVectors(panoPos2[0], panoPos2[1])//新的向量
|
|
|
+ /* var angle = vec1.angleTo(vec2)
|
|
|
+ if(vec1.clone().cross(vec2).z < 0)angle *= -1 //这里不确定是<0还是>0 */
|
|
|
+ var angle = math.getAngle(vec1, vec2, 'z')
|
|
|
+
|
|
|
+
|
|
|
+ //var scale = vec2.length()/vec1.length()
|
|
|
+ //var scaleMatrix = new THREE.Matrix4().makeScale(scale,scale,scale) //默认为1, 但由于坐标暂时是自己采集的,所以结果会是第一个点附近比较正确,越远偏差越大
|
|
|
+ var matrix = new THREE.Matrix4().setPosition(panoPos1[0].clone().negate())//先以点0为基准平移到000
|
|
|
+ //matrix.premultiply(scaleMatrix)//再缩放
|
|
|
+ var rotateMatrix = new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0,0,1), angle );
|
|
|
+ matrix.premultiply(rotateMatrix)//和旋转
|
|
|
+ var moveBackMatrix = new THREE.Matrix4().setPosition(panoPos2[0])
|
|
|
+ matrix.premultiply(moveBackMatrix)//再移动到realPosition的点0处
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ this.convertMatrix = /* matrix.invert() */ matrix
|
|
|
+
|
|
|
+ var pos = panoPos1.map(e=>{
|
|
|
+ return e.clone().applyMatrix4(matrix)
|
|
|
+ })
|
|
|
+ console.log(pos)
|
|
|
+
|
|
|
+
|
|
|
+ //挑选连续的两个点为向量来计算,如有123个漫游点,则选取12 23 31作为向量
|
|
|
+
|
|
|
+ /* let index = 0
|
|
|
while (index < length) {
|
|
|
let pos11 = new THREE.Vector3().copy(panoPos1[index])
|
|
|
let pos12 = new THREE.Vector3().copy(panoPos1[(index + 1) % length])
|
|
|
let pos21 = new THREE.Vector3().copy(panoPos2[index])
|
|
|
let pos22 = new THREE.Vector3().copy(panoPos2[(index + 1) % length])
|
|
|
- let vec1 = new THREE.Vector3().subVectors(pos11, pos12).setY(0)
|
|
|
- let vec2 = new THREE.Vector3().subVectors(pos21, pos22).setY(0)
|
|
|
- let diffLon = this.KanKan.Utils.math.getAngle(vec1, vec2, 'z')
|
|
|
+ let vec1 = new THREE.Vector3().subVectors(pos11, pos12).setZ(0)
|
|
|
+ let vec2 = new THREE.Vector3().subVectors(pos21, pos22).setZ(0)
|
|
|
+ let diffLon = math.getAngle(vec1, vec2, 'z')
|
|
|
diffLons.push(diffLon)
|
|
|
diffLonAve += diffLon
|
|
|
index++
|
|
@@ -247,10 +278,30 @@ export default class ConvertViews {
|
|
|
console.log('diffLonAve', diffLonAve)
|
|
|
|
|
|
this.diffQuaternion = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), diffLonAve)
|
|
|
- this.diffQuaternionInvert = this.diffQuaternion.clone().invert()
|
|
|
+ this.diffQuaternionInvert = this.diffQuaternion.clone().invert() */
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ lockCamera(locked){
|
|
|
+ this.locked = locked
|
|
|
+ this.updateCtrlEnable()
|
|
|
+ }
|
|
|
+
|
|
|
+ setPanoMode(state){
|
|
|
+ this.isPanoMode = state
|
|
|
+ this.updateCtrlEnable()
|
|
|
+ }
|
|
|
|
|
|
+ updateCtrlEnable(){
|
|
|
+ this.viewer.camera3D.enableRotate(this.locked ? false : true)
|
|
|
+ this.viewer.enableShortcutKey((this.locked || this.isPanoMode) ? false : true) //键盘移动
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/* applyDiff(app) {
|
|
|
//sourcePlayer -> targetPlayer
|
|
|
if (!this.player1 || !this.player2 || this.targetApp.config.num == this.sourceApp.config.num) return //场景码相同的话返回
|