# 使用 Cesium 获取和设置相机位置与姿态

在使用 CesiumJS 进行三维可视化时,控制相机的位置和姿态是非常重要的。本文将介绍如何获取相机的位置信息和姿态,并将其应用于相机视角的设置和飞行。

# 获取相机位置与姿态

以下是获取相机当前位置信息和姿态的函数:

getCameraInfoFn() {
    // 获取相机姿态信息
    let head = viewer.scene.camera.heading;
    let pitch = viewer.scene.camera.pitch;
    let roll = viewer.scene.camera.roll;
    let orientation = { 'heading': head, 'pitch': pitch, 'roll': roll };
    // 获取当前位置(WGS84 的地心坐标系,单位为弧度)
    let position = viewer.scene.camera.positionCartographic;
    // 将弧度转换为经纬度
    let longitude = Cesium.Math.toDegrees(position.longitude).toFixed(6);
    let latitude = Cesium.Math.toDegrees(position.latitude).toFixed(6);
    let height = position.height;
    return { longitude, latitude, height, orientation };
}

# 代码解析

  • 相机姿态:获取相机的朝向、俯仰角和滚转角,并将其存储在 orientation 对象中。
  • 位置转换:使用 positionCartographic 获取相机的当前位置,并将经纬度从弧度转换为度(使用 toDegrees 方法)。
  • 返回值:返回一个包含经纬度、高度和相机姿态的对象。

# 设置相机位置与姿态

接下来,通过以下函数将获取的相机位置和姿态赋值给相机:

setViewFn() {
    //fromDegrees () 方法,将经纬度和高程转换为世界坐标
    const position = Cesium.Cartesian3.fromDegrees(120.555658, 30.082084, 83845.23775396716);
    
    //setView () 设置相机位置、方向和变换
    viewer.camera.setView({
        destination: position,
        orientation: {
            heading: 5.21762380092823, // 相机方向
            pitch: -0.34814053638414677, // 视角
            roll: 0.00015736513513076034 // 视口翻滚角度
        }
    });
}

# 代码解析

  • 相机位置:使用 fromDegrees 方法将经纬度和高度转换为世界坐标。
  • 设置视图:使用 setView 方法设置相机的新位置和姿态。

# 飞入视角

最后,使用以下函数使相机从当前位置飞向新位置:

flyToFn() {
    const position = Cesium.Cartesian3.fromDegrees(120.555658, 30.082084, 83845.23775396716);
    
    viewer.camera.flyTo({
        destination: position, // 相机位置
        orientation: {
            heading: 5.21762380092823, // 相机方向
            pitch: -0.34814053638414677, // 视角
            roll: 0.00015736513513076034 // 视口翻滚角度
        },
        duration: 5 // 动画持续时间
    });
}

# 代码解析

  • 飞行到新位置:使用 flyTo 方法使相机平滑过渡到新的位置。
  • 设置动画时间:可以通过 duration 属性设置飞行的持续时间,以控制动画效果。

# 总结

通过以上代码,我们可以灵活地获取和控制 CesiumJS 中相机的位置与姿态。这些功能对实现动态的三维可视化应用至关重要。你可以根据需要调整相机的位置和姿态,以实现更丰富的用户体验。