Cesium学习笔记(8)

705 阅读4分钟

相机的方向和位置

浏览器所展现的内容其实就是相机照到的内容,我们是从Cesium的相机来观察Cesium的世界。在Cesium中,使用Camera类来表示相机。

场景Camera获取

var viewer=new Cesium.Viewer("cesiumContainer");
var camera=viewer.camera;

camera常用方法

setView()

setView方法是瞬间到达,没有过渡时间。

//创建一个笛卡尔三维坐标(从经纬度转)
 var position=Cesium.Cartesian3.fromDegrees(116.39742,39.9092,100);
 camera.setView({
     //设置相机位置
     destination:position,
     //设置相机视角
     orientation: {
       //设置相机朝向
       heading: Cesium.Math.toRadians(0.0),
       //设置相机俯仰角
       pitch: Cesium.Math.toRadians(-90.0),
       //设置相机翻滚角
       roll: 0.0,
    },
 })
destination属性

该属性表示的是相机所处位置,其放入的变量为三维笛卡尔坐标类(Cartesian3)

orientation属性

该属性表示的是三个角度,分别为heading(朝向)、pitch(俯仰角)和roll(翻滚角)。 单位都为弧度

heading表示的是物体与z轴的旋转角(好比身体转向,脸的朝向改变),pitch表示的是物体与y轴的旋转角(好比抬头和低头),roll表示的是物体与x轴的旋转角(好比我们的头左右歪头,头向肩膀靠)

代码中的pitch为-90°,相机就会正向下。(我们的视线垂直地球表面)

image.png

camera.setView({
     //设置相机位置
     destination:position,
     //设置相机视角
     orientation: {
       //设置相机朝向(脸朝向)
       heading: Cesium.Math.toRadians(0.0),
       //设置相机俯仰角(抬低头)
       pitch: Cesium.Math.toRadians(90.0),
       //设置相机翻滚角(歪头)
       roll: 0.0,
    },
 })

代码中的pitch为90°,相机就会正向上。(我们的视线看向天空) image.png

camera.setView({
     //设置相机位置
     destination:position,
     //设置相机视角
     orientation: {
       //设置相机朝向
       heading: Cesium.Math.toRadians(0.0),
       //设置相机俯仰角
       pitch: Cesium.Math.toRadians(0.0),
       //设置相机翻滚角
       roll: 0.0,
    },
 })

代码中的pitch为0°,相机就会看向地平线。(我们的视线看向远处)

image.png

我们把pitch设置为-90,也就是看向地球表面。然后,把heading设置为0°

camera.setView({
     //设置相机位置
     destination:position,
     //设置相机视角
     orientation: {
       //设置相机朝向
       heading: Cesium.Math.toRadians(0.0),
       //设置相机俯仰角
       pitch: Cesium.Math.toRadians(-90.0),
       //设置相机翻滚角
       roll: 0.0,
    },
 })

此时相机看到的场景是这样:

image.png

把pitch设置为-90,也就是看向地球表面。然后,把heading设置为45°

camera.setView({
     //设置相机位置
     destination:position,
     //设置相机视角
     orientation: {
       //设置相机朝向
       heading: Cesium.Math.toRadians(45.0),
       //设置相机俯仰角
       pitch: Cesium.Math.toRadians(-90.0),
       //设置相机翻滚角
       roll: 0.0,
    },
 })

此时相机看到的场景是这样:

image.png

相当于身体转向了45°(好比是低着头转动身体45°)

把heading改回为0°,pitch设置为-45°(好比45°俯视)

camera.setView({
     //设置相机位置
     destination:position,
     //设置相机视角
     orientation: {
       //设置相机朝向
       heading: Cesium.Math.toRadians(0.0),
       //设置相机俯仰角
       pitch: Cesium.Math.toRadians(-45.0),
       //设置相机翻滚角
       roll: 0.0,
    },
 })

此时,相机的场景是这样:

image.png

把roll设置为-45°

camera.setView({
     //设置相机位置
     destination:position,
     //设置相机视角
     orientation: {
       //设置相机朝向
       heading: Cesium.Math.toRadians(0.0),
       //设置相机俯仰角
       pitch: Cesium.Math.toRadians(-45.0),
       //设置相机翻滚角
       roll: 0.0,
    },
 })

此时,相机的场景是这样:

image.png

roll从0设置为-45°好比头向左肩膀靠45°

flyto()

flyto方法是缓慢到达,有一个动画。

viewer.camera.flyTo({
    destination: position,
    duration: 2,
    orientation: {
      heading: Cesium.Math.toRadians(0.0),
      pitch: Cesium.Math.toRadians(-45.0),
      roll: 0.0,
    },
  })

destinationorientation属性和上面一样。duration表示动画过渡时间,单位秒。

键盘控制相机位置

监听键盘按键事件

document.addEventListener("keydown",(e)=>{
    console.log(e)
  })

使用document.addEventListener()来监听键盘按键事件,其中的回调函数中的参数e如下图所示。 image.png

我们可以使用参数e的key属性来判断按下了哪个键。

document.addEventListener("keydown",(e)=>{
    if(e.key=='w')
    {
        console.log("按下了w")
    }
  })

键盘动态改变相机的位置与方位

document.addEventListener("keydown",(e)=>{

    //通过相机高度来设置相机向前移动的速率
    var height=viewer.camera.positionCartographic.height;
    var movespeed=height/100;
    if(e.key=='w')
    {
      //相机向前移动(改变相机位置)
      viewer.camera.moveForward(movespeed);
    }else if(e.key=='s')
    {
      //相机向后移动(改变相机位置)
      viewer.camera.moveBackward(movespeed);
    }else if(e.key=='a')
    {
      //相机向左移动(改变相机位置)
      viewer.camera.moveLeft(movespeed);
    }else if(e.key=='d')
    {
      //相机向右移动(改变相机位置)
      viewer.camera.moveRight(movespeed);
    }else if(e.key=='q')
    {
      //相机向左旋转0.5°(改变相机朝向heading,好比身体向左转)
      viewer.camera.lookLeft(Cesium.Math.toRadians(0.5));
    }else if(e.key=='e')
    {
      //相机向左旋转0.5°(改变相机朝向heading,好比身体向右转)
      viewer.camera.lookRight(Cesium.Math.toRadians(0.5));
    }else if(e.key=='r')
    {
      //相机向上旋转0.5°(改变相机俯仰角pitch,好比抬头)
      viewer.camera.lookUp(Cesium.Math.toRadians(0.5));
    }else if(e.key=='t')
    {
      //相机向下旋转0.5°(改变相机俯仰角pitch,好比低头)
      viewer.camera.lookDown(Cesium.Math.toRadians(0.5));
    }else if(e.key=='y')
    {
      //相机向左翻滚(改变相机翻滚角roll,好比向左歪头)
      viewer.camera.twistLeft(Cesium.Math.toRadians(0.5));
    }else if(e.key=='u')
    {
      //相机向左翻滚(改变相机翻滚角roll,好比向右歪头)
      viewer.camera.twistRight(Cesium.Math.toRadians(0.5));
    }
  })