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);
}
··原文:https://www.cnblogs.com/hustshu/p/14801719.html