var viewer = new Cesium.Viewer('cesiumContainer');var scene=viewer.scene;var camera=viewer.camera;var CC3=Cesium.Cartesian3;
var cameraRoll;var myray = new Cesium.Ray();var camCarto = new Cesium.Cartographic();var desCarte = new CC3();var desCarto = new Cesium.Cartographic();var from3D;
scene.morphStart.addEventListener(function (){
if (camera._mode === Cesium.SceneMode.SCENE3D) { camCarto=Cesium.Ellipsoid.WGS84.cartesianToCartographic(camera.position); myray.origin=viewer.camera.position; myray.direction=viewer.camera.direction; desCarte=scene.globe.pick(myray, scene); desCarto=Cesium.Ellipsoid.WGS84.cartesianToCartographic(desCarte); cameraRoll = camera.roll; from3D=true; } else{from3D=false;}});
scene.morphComplete.addEventListener(function (){
if(from3D==true) { camera.position.x = camCarto.longitude * 6378137; var sinLatitude = Math.sin(camCarto.latitude); camera.position.y = 0.5 * Math.log((1.0 + sinLatitude) / (1.0 - sinLatitude)) * 6378137; camera.position.z = camCarto.height;
desCarte.x = desCarto.longitude * 6378137; sinLatitude = Math.sin(desCarto.latitude); desCarte.y = 0.5 * Math.log((1.0 + sinLatitude) / (1.0 - sinLatitude)) * 6378137; desCarte.z = desCarto.height;
var temp=new CC3(); CC3.subtract(desCarte,camera.position,temp); CC3.normalize(temp,camera.direction); CC3.cross(camera.direction,{x:0,y:0,z:1},camera.right); CC3.cross(camera.right,camera.direction,camera.up); camera.look(camera.direction,cameraRoll); }});
var viewer = new Cesium.Viewer('cesiumContainer');
function methodA(lat){ var sinLatitude = Math.sin(lat); return (0.5 * Math.log((1.0 + sinLatitude) / (1.0 - sinLatitude)) * 6378137);}function methodB(lat){ var neg=1;if(lat<0){neg=-1;}lat=Math.abs(lat); var c = new Cesium.Cartographic(0,lat,0); var p = Cesium.Ellipsoid.WGS84.cartographicToCartesian(c); var ratio = p.z/6356752.3142451793; var halfheight = Math.PI * 6378137 / 2; //width/2/2; //var halfheight = 10000000; //by definition 1 meter = 1/10000000 equator to pole along surface return ratio * halfheight * neg;}function methodC(lat){ var neg=1;if(lat<0){neg=-1;}lat=Math.abs(lat); var ratio = lat/(Math.PI/2); var halfheight = Math.PI * 6378137 / 2; //width/2/2; //var halfheight = 10000000; //by definition 1 meter = 1/10000000 equator to pole along surface return ratio * halfheight * neg;}
//the eye in london//CV.y = 5733315 meters//3D.lat = 0.8988992804 radiansconsole.log("eye observed 5733315 meters");console.log("eye A ",methodA(0.8988992804));console.log("eye B ",methodB(0.8988992804));console.log("eye C ",methodC(0.8988992804));
//tip of south america//CV.y = -6084331 meters//3D.lat = -0.953949305 radiansconsole.log("tip SA observed -6084331 meters");console.log("tip SA A ",methodA(-0.953949305));console.log("tip SA B ",methodB(-0.953949305));console.log("tip SA C ",methodC(-0.953949305));
//tip of antartica//CV.y = -7049011 meters//3D.lat = -1.104682618 radiansconsole.log("tip AN observed -7049011 meters");console.log("tip AN A ",methodA(-1.104682618));console.log("tip AN B ",methodB(-1.104682618));console.log("tip AN C ",methodC(-1.104682618));
//little diomede (bering straight)//CV.y = 7319301 meters//3D.lat = 1.1475459941 radiansconsole.log("dio observed 7319301 meters");console.log("dio A ",methodA(1.1475459941));console.log("dio B ",methodB(1.1475459941));console.log("dio C ",methodC(1.1475459941));
var viewer = new Cesium.Viewer('cesiumContainer');
//abreviations
var scene=viewer.scene;var camera=viewer.camera;var CC3=Cesium.Cartesian3;
//scratch vars
var desCarte = new CC3();
//vars passed from start to end of morph
var camCarto = new Cesium.Cartographic();
var desCarto = new Cesium.Cartographic();
var range;
//latitude conversion functionsfunction latToY(lat)
{ var neg=1;if(lat<0){neg=-1;}lat=Math.abs(lat);
var halfheight = Math.PI * 6378137 / 2; //width/2/2;
var ratio = lat/(Math.PI/2);
return ratio * halfheight * neg;}
function yToLat(y){ var neg=1;if(y<0){neg=-1;}y=Math.abs(y);
var halfheight = Math.PI * 6378137 / 2; //width/2/2;
var ratio = y / halfheight; return ratio * (Math.PI/2) * neg;}scene.morphStart.addEventListener(function (){ if (camera._mode === Cesium.SceneMode.SCENE3D)//3 { //get camCarto camCarto=Cesium.Ellipsoid.WGS84.cartesianToCartographic(camera.position); //get desCarto
var myray = new Cesium.Ray();
myray.origin=viewer.camera.position; myray.direction=viewer.camera.direction; desCarte=scene.globe.pick(myray, scene); desCarto=Cesium.Ellipsoid.WGS84.cartesianToCartographic(desCarte); }
if ((camera._mode == 1)||(camera._mode == 2))//CV or 2D { //get camCarto camCarto.longitude=camera.position.x / 6378137; camCarto.latitude=yToLat(camera.position.y); camCarto.height=camera.position.z; //get desCarto if((camera._mode == 1)||(camera._mode == 2));//CV or 2D { var steps=Math.abs(camera.position.z/camera.direction.z); var vec=new CC3(); CC3.multiplyByScalar(camera.direction,steps,vec); CC3.add(camera.position,vec,desCarte); } desCarto.longitude=desCarte.x / 6378137; desCarto.latitude=yToLat(desCarte.y); desCarto.height=desCarte.z; } if((camera._mode == 1)||(camera._mode == 3))//CV or 3D { //get range var rangeVec=new CC3(); CC3.subtract(desCarte,camera.position,rangeVec); range=CC3.magnitude(rangeVec); } if(camera._mode == 2)//2D { //get range (assumes 3D fov 60) var cf = viewer.scene.camera.frustum; var halfscreen = cf.right * 2; range=halfscreen/Math.tan(60/180*Math.PI); } });
scene.morphComplete.addEventListener(function (){
setTimeout(function() //timeout because camera mode is 0 (still morphing) when function is called{ if (camera._mode === Cesium.SceneMode.SCENE3D)//3 { //get camera position and destination position camera.position=Cesium.Ellipsoid.WGS84.cartographicToCartesian(camCarto); desCarte=Cesium.Ellipsoid.WGS84.cartographicToCartesian(desCarto);
//face destination
var temp=new CC3(); CC3.subtract(desCarte,camera.position,temp); CC3.normalize(temp,camera.direction);
CC3.normalize(camera.position,temp); CC3.cross(camera.direction,temp,camera.right); CC3.cross(camera.right,camera.direction,camera.up); } if ((camera._mode == 1)||(camera._mode == 2))//CV or 2D { //get camera position and destination position
camera.position.x = camCarto.longitude * 6378137;
camera.position.y = latToY(camCarto.latitude);
camera.position.z = camCarto.height; desCarte.x = desCarto.longitude * 6378137;
desCarte.y = latToY(desCarto.latitude); desCarte.z = desCarto.height;
//face destination
var temp=new CC3(); CC3.subtract(desCarte,camera.position,temp); CC3.normalize(temp,camera.direction); CC3.cross(camera.direction,{x:0,y:0,z:1},camera.right); CC3.cross(camera.right,camera.direction,camera.up);
if(camera._mode == 2)//2D only { //assumes 3D was fov 60 var cf = viewer.scene.camera.frustum; var halfscreen=range*Math.tan(60/180*Math.PI); var ratio = cf.top / cf.right; cf.right = halfscreen/2; cf.left = -(halfscreen/2); cf.top = cf.right * ratio; cf.bottom = -cf.top; } }}, 2000); //end setTimeout function});