var windowHalfX = window.innerWidth / 2; var windowHalfY = window.innerHeight / 2; var mouseStatus = { x: 0, y: 0, leftDown: false, centerDown: false, rightDown: false }; function onWindowMouseMove(event) { // Keep the value in 0 -- 2 PI var body = params.Camera; if (mouseStatus.leftDown) { trackCamera[body].theta = trackCamera[body].theta % (2 * Math.PI); trackCamera[body].phi = trackCamera[body].phi % (0.5 * Math.PI); trackCamera[body].theta += (event.clientX - windowHalfX - mouseStatus.x) * 0.01; if (trackCamera[body].phi - (event.clientY - windowHalfY - mouseStatus.y) * 0.01 >= -0.5 * Math.PI && trackCamera[body].phi - (event.clientY - windowHalfY - mouseStatus.y) * 0.01 <= 0.5 * Math.PI) trackCamera[body].phi -= (event.clientY - windowHalfY - mouseStatus.y) * 0.01; } mouseStatus.x = event.clientX - windowHalfX; mouseStatus.y = event.clientY - windowHalfY; } function onWindowMouseDown(event) { switch (event.which) { case 1: mouseStatus.leftDown = true; break; case 2: mouseStatus.centerDown = true; break; case 3: default: mouseStatus.rightDown = true; break; } } function onWindowMouseUp(event) { switch (event.which) { case 1: mouseStatus.leftDown = false; break; case 2: mouseStatus.centerDown = false; break; case 3: default: mouseStatus.rightDown = false; break; } } function onMouseWheelChange(event) { var body = params.Camera; var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail))); var newDistance = trackCamera[body].distance - 0.05 * trackCamera[body].distance * delta; if (newDistance <= trackCamera[body].safeDistance) { newDistance = trackCamera[body].safeDistance; } else if (newDistance >= trackCamera[body].safeFar) { newDistance = trackCamera[body].safeFar; } trackCamera[body].distance = newDistance; } var posSrc = { pos: 0.0 }; var oX, oY, oZ, dX, dY, dZ, oTheta, dTheta, oPhi, dPhi, oDistance, dDistance, oSafeDis, dSafeDis; var oCX, oCY, oCZ, dCX, dCY, dCZ; tween = new TWEEN.Tween(posSrc) .to({ pos: 1.0 }, 4000) .easing(TWEEN.Easing.Quartic.InOut) .onStart(function () { globalTimeFlag = false; }) .onUpdate(function () { var pos = posSrc.pos; switchCamera.camera.position.set(oX + dX * pos, oY + dY * pos, oZ + dZ * pos); switchCamera.theta = oTheta + dTheta * pos; switchCamera.phi = oPhi + dPhi * pos; switchCamera.distance = oDistance + dDistance * pos; switchCamera.safeDistance = oSafeDis + dSafeDis * pos; switchCamera.camera.lookAt(oCX + dCX * pos, oCY + dCY * pos, oCZ + dCZ * pos); }) .onComplete(function () { // Need switching to roaming mode if (goRoaming) { calculateParams[curBody] = saveCur; calculateParams["Earth"] = saveNext; renderCamera = roamingCamera; cameraControl = new THREE.FirstPersonControls(roamingCamera.camera); cameraControl.lookSpeed = 0.1; cameraControl.movementSpeed = 150; cameraControl.noFly = true; cameraControl.constrainVertical = true; cameraControl.verticalMin = 1.0; cameraControl.verticalMax = 2.0; cameraControl.lon = -150; cameraControl.lat = 120; needSet = false; roamingStatus = true; goRoaming = false; roamingCamera.camera.lookAt(0, 0, 0); } else { calculateParams[curBody] = saveCur; calculateParams[nextBody] = saveNext; switchCamera.body = nextBody; curBody = nextBody; needSet = true; renderCamera = trackCamera[nextBody]; } globalTimeFlag = true; }); function initTween() { saveCur = calculateParams[curBody]; saveNext = calculateParams[nextBody]; calculateParams[curBody] = false; calculateParams[nextBody] = false; renderCamera = switchCamera; posSrc.pos = 0.0; needSet = false; } function setTween(cur, next) { if (cur == null) { oX = arguments[2]; oY = arguments[3]; oZ = arguments[4]; oTheta = 0.2; oPhi = 0.3; oDistance = 30; oSafeDis = 30; oCX = roamingCamera.camera.position.x; oCY = roamingCamera.camera.position.y; oCZ = roamingCamera.camera.position.z; } else { oX = trackCamera[cur].getX(); oY = trackCamera[cur].getY(); oZ = trackCamera[cur].getZ(); oTheta = trackCamera[cur].theta; oPhi = trackCamera[cur].phi; oDistance = trackCamera[cur].distance; oSafeDis = trackCamera[cur].safeDistance; oCX = trackCamera[cur].getCenterX(); oCY = trackCamera[cur].getCenterY(); oCZ = trackCamera[cur].getCenterZ(); } if (next == null) { dCX = dX = arguments[2] - oX; dCY = dY = arguments[3] - oY; dCZ = dZ = arguments[4] - oZ; dTheta = 0.2 - oTheta; dPhi = 0.3 - oPhi; dDistance = 30 - oDistance; dSafeDis = 30 - oSafeDis; } else { dX = trackCamera[next].getX() - oX; dY = trackCamera[next].getY() - oY; dZ = trackCamera[next].getZ() - oZ; dCX = trackCamera[next].getCenterX() - oCX; dCY = trackCamera[next].getCenterY() - oCY; dCZ = trackCamera[next].getCenterZ() - oCZ; dTheta = trackCamera[next].theta - oTheta; dPhi = trackCamera[next].phi - oPhi; dDistance = trackCamera[next].distance - oDistance; dSafeDis = trackCamera[next].safeDistance - oSafeDis; } } function cameraCopy(cameraDst, cameraSrc) { cameraDst.theta = cameraSrc.theta; cameraDst.phi = cameraSrc.phi; cameraDst.distance = cameraSrc.distance; cameraDst.safeDistance = cameraSrc.safeDistance; cameraDst.body = cameraSrc.body; cameraDst.setCamera(); }