首页 > 其他 > 详细

Cesium 获取当前摄像机的姿态

时间:2021-05-23 23:30:27      阅读:46      评论:0      收藏:0      [点我收藏+]

Cesium 获取当前摄像机的姿态

var arrLoc = \[\];  
var pickPosition = \{ x: null, y: null \}  
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);  //定义事件  
handler.setInputAction(function (movement) \{

  
// screenLocation.x = movement.position.x;  
// screenLocation.y = movement.position.y;

  
var cartesian = viewer.camera.pickEllipsoid(  
movement.position,  
scene.globe.ellipsoid  
);  
if (cartesian) \{  
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);  
var longitudeString = Cesium.Math.toDegrees(  
cartographic.longitude  
).toFixed(2);                               //要更高的精度就修改保留的小数位数  
var latitudeString = Cesium.Math.toDegrees(  
cartographic.latitude  
).toFixed(2);                               //同上

  
pickPosition.x = longitudeString;  
pickPosition.y = latitudeString;  
let cf = \{ x: parseFloat(pickPosition.x), y: parseFloat(pickPosition.y) \}

  
console.log(cf) //鼠标点击位置

  
var a = \{  
position: viewer.camera.position,  
heading: viewer.camera.heading,  
pitch: viewer.camera.pitch  
\}  
console.log(a) //当前视角  
\}  
\}, Cesium.ScreenSpaceEventType.LEFT\_CLICK);
var viewer = new Cesium.Viewer("cesiumContainer");

function getCenterPosition() {
      var result = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(viewer.canvas.clientWidth / 2, viewer.canvas
        .clientHeight / 2));
      var curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(result);
      var lon = curPosition.longitude * 180 / Math.PI;
      var lat = curPosition.latitude * 180 / Math.PI;
      var height = getHeight();
      return {
        lon: lon,
        lat: lat,
        height: height
      };
    }
  /* 获取camera高度  */
    function getHeight() {
      if (viewer) {
        var scene = viewer.scene;
        var ellipsoid = scene.globe.ellipsoid;
        var height = ellipsoid.cartesianToCartographic(viewer.camera.position).height;
        return height;
      }
    }

 function getCurrentExtent() {
        // 范围对象
        var extent = {};
 
        // 得到当前三维场景
        var scene = viewer.scene;
 
        // 得到当前三维场景的椭球体
        var ellipsoid = scene.globe.ellipsoid;
        var canvas = scene.canvas;
 
        // canvas左上角
        var car3_lt = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(0, 0), ellipsoid);
 
        // canvas右下角
        var car3_rb = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(canvas.width, canvas.height), ellipsoid);
 
        // 当canvas左上角和右下角全部在椭球体上
        if (car3_lt && car3_rb) {
            var carto_lt = ellipsoid.cartesianToCartographic(car3_lt);
            var carto_rb = ellipsoid.cartesianToCartographic(car3_rb);
            extent.xmin = Cesium.Math.toDegrees(carto_lt.longitude);
            extent.ymax = Cesium.Math.toDegrees(carto_lt.latitude);
            extent.xmax = Cesium.Math.toDegrees(carto_rb.longitude);
            extent.ymin = Cesium.Math.toDegrees(carto_rb.latitude);
        }
 
        // 当canvas左上角不在但右下角在椭球体上
        else if (!car3_lt && car3_rb) {
            var car3_lt2 = null;
            var yIndex = 0;
            do {
                // 这里每次10像素递加,一是10像素相差不大,二是为了提高程序运行效率
                yIndex <= canvas.height ? yIndex += 10 : canvas.height;
                car3_lt2 = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(0, yIndex), ellipsoid);
            } while (!car3_lt2);
            var carto_lt2 = ellipsoid.cartesianToCartographic(car3_lt2);
            var carto_rb2 = ellipsoid.cartesianToCartographic(car3_rb);
            extent.xmin = Cesium.Math.toDegrees(carto_lt2.longitude);
            extent.ymax = Cesium.Math.toDegrees(carto_lt2.latitude);
            extent.xmax = Cesium.Math.toDegrees(carto_rb2.longitude);
            extent.ymin = Cesium.Math.toDegrees(carto_rb2.latitude);
        }
 
        // 获取高度
        extent.height = Math.ceil(viewer.camera.positionCartographic.height);
        return extent;
    }

自转

var viewer = new Cesium.Viewer("cesiumContainer");
viewer._cesiumWidget._creditContainer.style.display = "none";
  viewer.clock.multiplier = 20;//速度
  viewer.clock.shouldAnimate = true;
  var previousTime = viewer.clock.currentTime.secondsOfDay;
  
  //地租自转事件
  function onTickCallback() {
      var spinRate = 1;
      var currentTime = viewer.clock.currentTime.secondsOfDay;
      var delta = (currentTime - previousTime) / 1000;
      previousTime = currentTime;
      viewer.scene.camera.rotate(Cesium.Cartesian3.UNIT_Z, -spinRate * delta);
  }
  viewer.clock.onTick.addEventListener(onTickCallback);
  
  viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({
                  url: "http://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8",
              }));
  
  var datas = [
              {‘lon‘:104.20,‘lat‘:35.86,‘name‘:‘中国‘},
              {‘lon‘:105.32,‘lat‘:61.52,‘name‘:‘俄罗斯‘},
              {‘lon‘:-3.44,‘lat‘:55.38,‘name‘:‘英国‘},
              {‘lon‘:78.96,‘lat‘:20.59,‘name‘:‘印度‘},
              {‘lon‘:2.21,‘lat‘:46.23,‘name‘:‘法国‘},
              {‘lon‘:-95.71,‘lat‘:37.09,‘name‘:‘美国‘},
              {‘lon‘:138.25,‘lat‘:36.20,‘name‘:‘日本‘},
              {‘lon‘:6.13,‘lat‘:49.82,‘name‘:‘卢森堡‘},
              {‘lon‘:-106.35,‘lat‘:56.13,‘name‘:‘加拿大‘},
              {‘lon‘:10.45,‘lat‘:51.17,‘name‘:‘德国‘},
              {‘lon‘:-51.93,‘lat‘:-14.24,‘name‘:‘巴西‘},
              {‘lon‘:127.98,‘lat‘:37.66,‘name‘:‘韩国‘},
              {‘lon‘:45.08,‘lat‘:23.89,‘name‘:‘沙特阿拉伯‘},
              {‘lon‘:12.57,‘lat‘:41.87,‘name‘:‘意大利‘},
              {‘lon‘:53.85,‘lat‘:23.42,‘name‘:‘阿拉伯联合酋长国‘},
              {‘lon‘:133.78,‘lat‘:-25.27,‘name‘:‘澳大利亚‘},
              {‘lon‘:9.50,‘lat‘:56.26,‘name‘:‘丹麦‘},
              {‘lon‘:34.85,‘lat‘:31.05,‘name‘:‘以色列‘},
              {‘lon‘:69.35,‘lat‘:30.38,‘name‘:‘巴基斯坦‘},
              {‘lon‘:35.24,‘lat‘:38.96,‘name‘:‘土耳其‘},
              {‘lon‘:103.82,‘lat‘:1.35,‘name‘:‘新加坡‘},
              {‘lon‘:-3.75,‘lat‘:40.46,‘name‘:‘西班牙‘},
              {‘lon‘:113.92,‘lat‘:-0.79,‘name‘:‘印度尼西亚‘},
              {‘lon‘:66.92,‘lat‘:48.02,‘name‘:‘哈萨克斯坦‘},
              {‘lon‘:25.75,‘lat‘:61.92,‘name‘:‘芬兰‘},
              {‘lon‘:-63.62,‘lat‘:-38.42,‘name‘:‘阿根廷共和国‘},
              {‘lon‘:21.82,‘lat‘:39.07,‘name‘:‘希腊‘},
              {‘lon‘:101.98,‘lat‘:4.21,‘name‘:‘马来西亚‘},
              {‘lon‘:8.68,‘lat‘:9.08,‘name‘:‘尼日利亚‘},
              {‘lon‘:27.95,‘lat‘:53.71,‘name‘:‘白俄罗斯‘},
              {‘lon‘:-102.55,‘lat‘:23.63,‘name‘:‘墨西哥‘},
              {‘lon‘:47.58,‘lat‘:40.14,‘name‘:‘阿塞拜疆共和国‘},
              {‘lon‘:-78.18,‘lat‘:-1.83,‘name‘:‘厄瓜多尔‘},
              {‘lon‘:19.15,‘lat‘:51.92,‘name‘:‘波兰‘},
              {‘lon‘:121.77,‘lat‘:12.88,‘name‘:‘菲律宾‘},
              {‘lon‘:8.23,‘lat‘:46.82,‘name‘:‘瑞士‘},
              {‘lon‘:-71.54,‘lat‘:-35.68,‘name‘:‘智利‘},
              {‘lon‘:25.01,‘lat‘:58.60,‘name‘:‘爱沙尼亚‘},
              {‘lon‘:22.94,‘lat‘:-30.56,‘name‘:‘南非‘},
              {‘lon‘:-63.59,‘lat‘:-16.29,‘name‘:‘玻利维亚‘},
              {‘lon‘:-75.02,‘lat‘:-9.19,‘name‘:‘秘鲁‘},
              {‘lon‘:90.36,‘lat‘:23.68,‘name‘:‘孟加拉‘},
              {‘lon‘:30.80,‘lat‘:26.82,‘name‘:‘埃及‘}
              ]
  
  function addEntitys(datas){
      
      for(var i = 0;i < datas.length;i++){
          
          var data = datas[i];
          
            var entity = viewer.entities.add({
              
              //参数顺序:经度、纬度
              position : Cesium.Cartesian3.fromDegrees(data.lon,data.lat),
              
              label : {
                text : data.name,
                font : ‘14pt monospace‘,
                style: Cesium.LabelStyle.FILL_AND_OUTLINE,
                outlineWidth : 2,
                verticalOrigin : Cesium.VerticalOrigin.TOP,
                pixelOffset : new Cesium.Cartesian2(0, 0)//此属性为设置偏移量
              },
              type:‘text‘//自定义属性
            });
      }
      
            
  }
  
  addEntitys(datas);
  
//监听点击事件
  var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  handler.setInputAction(function(click) {
      //获取所有entity
      var entitys = viewer.entities.values;
      
      if(entitys.length != null && entitys.length > 0){
          for(var m = 0;m<entitys.length;m++){
              var entity = entitys[m];
              
              if(entity.type != null && entity.type == ‘text‘){
                  if(entity.show == true){
                      entity.show = false;
                  }else{
                      entity.show = true;
                  }
              }
              
          }
      }
      
      console.info(entitys.length);
      
  }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
鼠标实时位置
var viewer = new Cesium.Viewer(‘cesiumContainer‘);
var canvas=viewer.scene.canvas;
var ellipsoid=viewer.scene.globe.ellipsoid;
var handler = new Cesium.ScreenSpaceEventHandler(canvas);
handler.setInputAction(function(movement){
       
             var cartesian=viewer.camera.pickEllipsoid(movement.endPosition, ellipsoid);
              if(cartesian){
                   var cartographic=viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
                   //将地图坐标(弧度)转为十进制的度数
                    var lat_String=Cesium.Math.toDegrees(cartographic.latitude).toFixed(4); //经
                    var log_String=Cesium.Math.toDegrees(cartographic.longitude).toFixed(4);//纬
                    var alti_String=(viewer.camera.positionCartographic.height/1000).toFixed(2);//高
                
               }
        },Cesium.ScreenSpaceEventType.MOUSE_MOVE);
/**

 * @description: 根据起点、终点地球曲率以及点数插值

 * @param {type} 

 * startPoint   Cesium.Cartesian3.fromDegrees

 * endPoint Cesium.Cartesian3.fromDegrees

 * angularityFactor Number

 * numOfSingleLine  Number

 * @return: []

 */

function getPointlist(startPoint,endPoint,angularityFactor,numOfSingleLine){
var result = [];

var startPosition = Cesium.Cartographic.fromCartesian(startPoint);

var endPosition = Cesium.Cartographic.fromCartesian(endPoint);

 

var startLon = startPosition.longitude * 180 / Math.PI;

var startLat = startPosition.latitude * 180 / Math.PI;

var endLon = endPosition.longitude * 180 / Math.PI;

var endLat = endPosition.latitude * 180 / Math.PI;

 

var dist = Math.sqrt((startLon - endLon) * (startLon - endLon) + (startLat - endLat) * (startLat - endLat));


 

//var dist = Cesium.Cartesian3.distance(startPoint, endPoint);

var angularity = dist * angularityFactor;

 

var startVec = Cesium.Cartesian3.clone(startPoint);

var endVec = Cesium.Cartesian3.clone(endPoint);

 

var startLength = Cesium.Cartesian3.distance(startVec, Cesium.Cartesian3.ZERO);

var endLength = Cesium.Cartesian3.distance(endVec, Cesium.Cartesian3.ZERO);

 

Cesium.Cartesian3.normalize(startVec, startVec);

Cesium.Cartesian3.normalize(endVec, endVec);

 

if (Cesium.Cartesian3.distance(startVec, endVec) == 0) {
    return result;

}

var omega = Cesium.Cartesian3.angleBetween(startVec, endVec);

result.push(startPoint);

for (var i = 1; i < numOfSingleLine - 1; i++) {
    var t = i * 1.0 / (numOfSingleLine - 1);

    var invT = 1 - t;

 

    var startScalar = Math.sin(invT * omega) / Math.sin(omega);

    var endScalar = Math.sin(t * omega) / Math.sin(omega);

 

    var startScalarVec = Cesium.Cartesian3.multiplyByScalar(startVec, startScalar, new Cesium.Cartesian3());

    var endScalarVec = Cesium.Cartesian3.multiplyByScalar(endVec, endScalar, new Cesium.Cartesian3());

 

    var centerVec = Cesium.Cartesian3.add(startScalarVec, endScalarVec, new Cesium.Cartesian3());

 

    var ht = t * Math.PI;

    var centerLength = startLength * invT + endLength * t + Math.sin(ht) * angularity;

    centerVec = Cesium.Cartesian3.multiplyByScalar(centerVec, centerLength, centerVec);

 

    result.push(centerVec);

}

 

result.push(endPoint);

 

return result;

 

}
相机入地
var viewer = new Cesium.Viewer(‘cesiumContainer‘);

var minPitch = -Cesium.Math.PI_OVER_TWO;
var maxPitch = 0;
var minHeight = 200;

viewer.camera.changed.addEventListener(
    function() {
        if (viewer.camera._suspendTerrainAdjustment && viewer.scene.mode === Cesium.SceneMode.SCENE3D) {
            viewer.camera._suspendTerrainAdjustment = false;
            viewer.camera._adjustHeightForTerrain();
        }
        
        // Keep camera in a reasonable pitch range
        var pitch = viewer.camera.pitch;

        if (pitch > maxPitch || pitch < minPitch) {
            viewer.scene.screenSpaceCameraController.enableTilt = false;

            // clamp the pitch
            if(pitch > maxPitch ) { 
                pitch = maxPitch; 
            } else if(pitch < minPitch) {
                pitch = minPitch;
            }

            var destination = Cesium.Cartesian3.fromRadians(
                viewer.camera.positionCartographic.longitude,
                viewer.camera.positionCartographic.latitude,
                Math.max(viewer.camera.positionCartographic.height, minHeight));

            viewer.camera.setView({
                destination: destination,
                orientation: { pitch: pitch }
            });
            viewer.scene.screenSpaceCameraController.enableTilt = true;
        }
    }
);
模型姿态调整
//模型加载  

this.iveModel = new Cesium .Cesium3DTileset({
        url: this.path

      });

      var primitives = this.viewer.scene.primitives.add(this.iveModel);

        primitives.readyPromise.then(t => {
          var originalSphere = t.boundingSphere;

          var radius = originalSphere.radius;

          var matrix = this.RotatePanByMatrix();

          this.iveModel._root.transform = matrix;

      setTimeout(() => {
        this.viewer.zoomTo(this.iveModel);

      }, 500);

        });

//模型

  //旋转 rx ry rz 旋转角

      var mx = Cesium .Matrix3.fromRotationX(Cesium .Math.toRadians(Number(this.rx)));

      var my = Cesium .Matrix3.fromRotationY(Cesium .Math.toRadians(Number(this.ry)));

      var mz = Cesium .Matrix3.fromRotationZ(Cesium .Math.toRadians(Number(this.rz)));

      var rotationX = Cesium .Matrix4.fromRotationTranslation(mx);

      var rotationY = Cesium .Matrix4.fromRotationTranslation(my);

      var rotationZ = Cesium .Matrix4.fromRotationTranslation(mz);

 //缩放比例

      var sacle = Cesium .Matrix4.fromArray([

        Number(this.scalex),

        0.0,

        0.0,

        0.0,

        0.0,

        Number(this.scaley),

        0.0,

        0.0,

        0.0,

        0.0,

        Number(this.scalez),

        0.0,

        0.0,

        0.0,

        0.0,

        1.0

      ]);

  //平移

      var position = Cesium .Cartesian3.fromDegrees(Number(this.tx), Number(this.ty), Number(this.tz));

      var m = Cesium .Transforms.eastNorthUpToFixedFrame(position);

      

//矩阵相乘得到最终结果

      Cesium .Matrix4.multiply(m, rotationX, m);

      Cesium .Matrix4.multiply(m, rotationY, m);

      Cesium .Matrix4.multiply(m, rotationZ, m);

      Cesium .Matrix4.multiply(m, sacle, m);
中心点 相机姿态
//相机姿态

var direction = viewer.camera._direction;
var x = Cesium.Math.toDegrees(direction.x);
var y = Cesium.Math.toDegrees(direction.y);
var z = Cesium.Math.toDegrees(direction.z);

//中心点位置

var rectangle = viewer.camera.computeViewRectangle();
var west =rectangle.west / Math.PI * 180;
var north = rectangle.north / Math.PI * 180;
var east = rectangle.east / Math.PI * 180;
var south = rectangle.south / Math.PI * 180;
        var centerx=(west+east)/2;
        var cnetery=(north+south)/2;
// 鉴于高德、leaflet获取的边界都是southwest和northeast字段来表示,本例保持一致性
console.log("centerx:"+centerx);
 console.log("cnetery:"+cnetery);
绕点转动
       var viewer=new Cesium.Viewer(‘cesiumContainer‘,{ 
           animation: false, //是否显示动画控件
            shouldAnimate : true,
            homeButton: false, //是否显示Home按钮
            fullscreenButton: false, //是否显示全屏按钮
            baseLayerPicker: false , //是否显示图层选择控件
            geocoder: false, //是否显示地名查找控件
            timeline: false, //是否显示时间线控件
            sceneModePicker: false, //是否显示投影方式控件
            navigationHelpButton: false, //是否显示帮助信息控件
            infoBox: false, //是否显示点击要素之后显示的信息
            requestRenderMode: true, //启用请求渲染模式
            scene3DOnly: false, //每个几何实例将只能以3D渲染以节省GPU内存
            sceneMode: 3, //初始场景模式 1 2D模式 2 2D循环模式 3 3D模式  Cesium.SceneMode
    
        });
        
        var position=Cesium.Cartesian3.fromDegrees(112.315216, 39.5125612, 100);
        viewer.scene.camera.flyTo({
            destination: Cesium.Cartesian3.fromDegrees(112.315216, 39.5125612, 100),  //定位坐标点,建议使用谷歌地球坐标位置无偏差
            duration:1   //定位的时间间隔
        });
setTimeout(function(){
                     flyExtent();
            },100);        
        
        function  flyExtent(){
            var pitch=Cesium.Math.toRadians(-10);
            var angle=360/30;
            var distance=150000;
            var startTime=Cesium.JulianDate.fromDate(new Date());
            var stopTime=Cesium.JulianDate.addSeconds(startTime, 1000, new Cesium.JulianDate());             
                viewer.clock.startTime=startTime.clone();
                viewer.clock.stopTime =stopTime.clone(); 
                viewer.clock.currentTime = startTime.clone(); // 当前时间
                viewer.clock.clockRange = Cesium.ClockRange.CLAMPED; // 行为方式
                viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK; // 时钟设置为当前系统时间; 忽略所有其他设置。
                var initialHeading = viewer.camera.heading;
                var Exection = function TimeExecution() {
                        var delTime = Cesium.JulianDate.secondsDifference(viewer.clock.currentTime, viewer.clock.startTime);
                        var heading = Cesium.Math.toRadians(delTime * angle) + initialHeading;
                        viewer.scene.camera.setView({
                            destination : position, // 点的坐标
                            orientation: {
                                heading : heading,
                                pitch : pitch,
                            }
                        });
                        viewer.scene.camera.moveBackward(distance);
                        if (Cesium.JulianDate.compare(viewer.clock.currentTime, viewer.clock.stopTime) >= 0) {
                            viewer.clock.onTick.removeEventListener(Exection);
                        }
         
                };
                viewer.clock.onTick.addEventListener(Exection);
            
        }
··

Cesium 获取当前摄像机的姿态

原文:https://www.cnblogs.com/hustshu/p/14801719.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!