自学内容网 自学内容网

Cesium--获取当前相机中心与地面的射线焦点

本文记录获取当前相机中心与地面的射线焦点的方法,可用于视角缩放过程中,控制视角自动平滑切换到二维等场景:

方法一定是视角中心能与地面有交集,如果对着地平线或对着天空肯定是没效果的。直接放代码:

//调整相机到正北方向 上帝视角
const limitViewerController=(viewer)=>{
try{
viewer.scene.screenSpaceCameraController.enableTilt = false; //禁止中键旋转视角
// 将相机朝向正北方向(即Z轴指向正北,Y轴指向正东)
var heading = Cesium.Math.toRadians(0.0); // 正北方向为90度
var pitch = Cesium.Math.toRadians(0.0); // 保持平面视角
var roll = 0.0; // 无滚动
var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
let camera_position = viewer.camera.position.clone();
let cameraHeight = viewer.camera.positionCartographic.height;

let camera = viewer.scene.camera;
const rayget = new Cesium.Ray(camera.position, camera.direction)

//射线监测 不到目标时 无法设置视角
const rayintersection = Cesium.IntersectionTests.rayEllipsoid(rayget, Cesium.Ellipsoid.WGS84);
if(rayintersection){
const raypoint = Cesium.Ray.getPoint(rayget, rayintersection.start);

// 获取当前使用的地球椭球体
var ellipsoid = viewer.scene.globe.ellipsoid;
// 将Cartesian3转换为经纬度
var raycartographic = ellipsoid.cartesianToCartographic(raypoint);
 var cameracartographic = ellipsoid.cartesianToCartographic(camera_position);
 
// 获取经度、纬度和高度
var raylongitude = Cesium.Math.toDegrees(raycartographic.longitude);
var raylatitude = Cesium.Math.toDegrees(raycartographic.latitude);
var rayheight = cameracartographic.height;

const destinationPostion = Cesium.Cartesian3.fromDegrees(raylongitude, raylatitude, rayheight+100000);

viewer.camera.flyTo({
    destination : destinationPostion,
duration: 1.5,
    orientation : {
        heading : 6.283185307179586,
        pitch : -1.5707963267948966,
        roll : 0.0
    }
});
}


//调整也可以通过TWEEN.js 实现过渡动画
//import * as TWEEN from '@tweenjs/tween.js'
// const coords = {x: viewer.camera.heading, y: viewer.camera.pitch,z:viewer.camera.roll} // Start at (0, 0)
// const tween = new TWEEN.Tween(coords, false) // Create a new tween that modifies 'coords'.
// .to({x: 6.283185307179586, y: -1.5707963267948966, z:0}, 1000) 
// .easing(TWEEN.Easing.Quadratic.InOut)
// .onUpdate((object) => {
// viewer.camera.setView({
// //destination : new Cesium.Cartesian3(raypoint.x, raypoint.y, camera_position.z),
//     orientation: {
// heading: object.x, // 方向的朝向,以弧度为单位
// pitch: object.y, // 视角的高度,以弧度为单位
//         roll: object.z // 绕着圆周运动的角度,一般设置为0
//     }
// });
// // viewer.scene.camera.setView({
// //  destination : new Cesium.Cartesian3(camera_position.x, camera_position.y, camera_position.z),
// //     orientation: {
// //         headingPitchRoll: new Cesium.HeadingPitchRoll(object.x, object.y, object.z)
// //     }
// // });
// })
// .start() // Start the tween immediately.
// function animate() {
// tween.update()
// requestAnimationFrame(animate)
// }
// requestAnimationFrame(animate)


}catch(err){
console.log(err);
}
}

 


原文地址:https://blog.csdn.net/lg8883573/article/details/140381595

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!