Cesium中的相机—setView&lookAtTransform

作为相机系列,此处先温习一下前期涉及到Cesium中Camera的两个概念(系列文章可参考我前面发的”Cesium中的相机–”系列)。

回顾

相机的空间位置

Cesium中,世界坐标系就是地球的WGS84系,也即地球固连坐标系(Earth Fiexed),在此坐标中定义相机的位置与观测方位。

相机坐标系见下图(使用Hubble望远镜示意相机),在Camera对象中,通常用三个矢量来表示:Up、Right和Direction,这三个方向确定了相机的观测方位。Up、Right、Direction与相机坐标系(视图坐标系)XYZ三轴的关系为:
X=Direction
Y=Left
Z=Up

Cesium中的相机—setView&lookAtTransform

; Heading/Pitch/Roll的定义

在Cesium中,常使用Heading/Pitch/Roll三个参数来表示相机相对某坐标系的姿态:

  • Heading,表示相机绕Up轴旋转,Up轴为+Z轴,且定义绕-Z轴旋转为正。
  • Pitch,表示相机绕Right轴旋转,Right轴为-Y轴,且定义绕-Y轴旋转为正。
  • Roll,表示相机绕Direction轴(视线方向)旋转,Direction轴为+X轴,且绕+X轴旋转为正。
    相机的三个旋转方向见下图示意,同时给出了Cesium中相机的Up/Right/Direction三个轴与X/Y/Z轴的关系。
    Cesium中的相机—setView&lookAtTransform

SetView

温顾了上述两个知识点,下面直接给出SetView的定义

Cesium中的相机—setView&lookAtTransform
Camera中的SetView函数用来设置相机的位置和方位的。

相机位置由destination指定,通常使用三维笛卡尔坐标(Cartesian3)来确定,此坐标默认为世界坐标系(即WGS84系)下,显然,destination距离地球越远,则视场内地球越小。

相机的方位由orientaiton参数指定,有两种方式:1)HeadingPitchRoll三个参数;2)DirectionUp两个参数。

下图左图给出了Cesium中SetView函数时,相机的初始方位:

  • 相机的视线(Direction)方向与当地北向重合
  • 相机的上方向(Up)与当地天顶方向(地心-相机位置矢量方向)
    Cesium中的相机—setView&lookAtTransform

因此,基于相机的初始方位,可以使用HeadingPitchRoll三个参数来表示相机的具体方位,具体转换过程见上面有关HeadingPitchRoll的阐述。

简单举个例子,如果我们想要相机看向地心,那么为上图右图所示。可知,只要将相机从初始方位沿着Y轴旋转90°(对应的Pitch角度为-90°)即可。

当然,使用Direction和Up两个参数也可以指定相机的方位,简介明了,但是需要给出两个具体的矢量方向。

下面直接以代码给出几个示例:


viewer.camera.setView({
    destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0)
});

viewer.camera.setView({
    destination :  Cesium.Cartesian3.fromDegrees(0, 0, 10000000),
    orientation: {
        heading : Cesium.Math.toRadians(90.0),
        pitch : Cesium.Math.toRadians(-90),
        roll : 0.0
    }
});

viewer.camera.setView({
   orientation: {
        heading : Cesium.Math.toRadians(90.0),
        pitch : Cesium.Math.toRadians(-90),
        roll : 0.0
    }
});

viewer.camera.setView({
    destination : Cesium.Rectangle.fromDegrees(west, south, east, north)
});

viewer.camera.setView({
    destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0),
    orientation : {
        direction : new Cesium.Cartesian3(-0.042312, -0.201232, -0.978629),
        up : new Cesium.Cartesian3(-0.479345, -0.855321, 0.1966022)
    }
});

lookAtTransform

setView函数直接确定了相机在世界坐标系的位置,而且相机的方向可以任意指定。但是在Cesium中,我们常常有一种跟随对象的视角,也就是相机始终跟随运动的对象(如下图的飞行中的龙飞船)。鼠标无论怎么调整视角,相机的方向始终对着龙飞船,也就是说相机的参考系不再是世界坐标系了,而是飞船局部坐标系。

Cesium中的相机—setView&lookAtTransform
lookAtTransform函数的定义见下图,它的主要功能是:设定一个局部的参考系,让相机始终朝着局部参考系的原点。
Cesium中的相机—setView&lookAtTransform
在上面定义中,两个参数的说明如下,可结合下图来看。
  • transform是相机参考的局部坐标系到世界坐标系的齐次坐标转换矩阵(Matrix4),通过此4×4的矩阵,可以把局部坐标系的位置直接转换到世界坐标系中(包含旋转和平移,详细参考另一篇文章:Cesium中的相机—齐次坐标与坐标变换)。此局部坐标系一般为地面某点的”east-north-up”坐标系或者运行的卫星轨道坐标系,见下图中的o-XYZ坐标系。
  • offset有两种类型,此处只讲一种:Cartesian3,即笛卡尔坐标,表示相机在局部坐标系中的位置,如下图中的OP矢量即表示相机的offset参数。
  • 相机的位置有了,那么相机的方位如何确定?见下图:相机的方向,即Direction始终指向局部坐标系的中心;相机的Up方向约束在局部坐标系的Z方向。
    Cesium中的相机—setView&lookAtTransform
    lookAtTransform的用途非常广泛,可以将相机设置为任何局部坐标系,而局部坐标是通过Matrix4矩阵表示。

下面直接以代码给出示例:


const transform = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(0, 0, 10000000));

var offset = new Cesium.Cartesian3(0, 0, 1000);
viewer.camera.lookAtTransform(transform, offset);

下图为上个例子的代码对应的示意图

Cesium中的相机—setView&lookAtTransform
另一个例子就是地球惯性系的视角,也即地球在自转的效果,参见下面代码,这个也是Cesium官方给出的例子

function icrf(scene, time) {

  if (scene.mode !== Cesium.SceneMode.SCENE3D) {
    return;
  }

  var icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time);

  if (Cesium.defined(icrfToFixed)) {

    var transform = Cesium.Matrix4.fromRotationTranslation(icrfToFixed);

    var offset = Cesium.Cartesian3.clone(scene.camera.position);
    scene.camera.lookAtTransform(transform, offset);
  }
}

viewer.scene.preRender.addEventListener(icrf);

通过以上两个例子可知,我们只要提供了想要的局部坐标系到世界坐标系的齐次转换矩阵(Matrix4形式),那么就可以将相机局限在我们想要的局部坐标系中!!

Original: https://blog.csdn.net/u011575168/article/details/124696863
Author: 云上飞47636962
Title: Cesium中的相机—setView&lookAtTransform

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/519140/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球