温馨提示:文中标记的脚注
[^数字]
在文末的参考资料给出了访问链接。
1. Camera的定义
如下图所示,官方给的定义是:Camera
[^1]
是由
position
(位置)、
orientation
(方向)、
view frustum
(视锥体)来定义的。我们可以将相机看做是自己的眼睛,
position
可以看做是我们所站的位置,而
orientation
可以看做是我们看的方向。
而关于视锥体,我在维基百科
view frustum
[^2]
一词介绍中找到一张示意图,具体如下图所示,我们也称该形状为四角锥台
[^3]
,具体地,四棱锥被平行于其底面的平面所截后,截面与底面之间的几何形体,它有near、far,left、right,top、bottom 六个面。
2. 相机的 position(位置)
很显然,由于 Cesium 使用的是三维笛卡尔坐标系,自然我们可以用一个三维笛卡尔坐标即
Cartesian3
来表示相机的位置。
3. 相机的 orientation(方向)
如上定义所说,方向会形成一个标准正交基(orthonormal basis),两两垂直的单位向量,这三个向量分别为 view vector(视图(线)向量)、up vector(上向量)、right vector(右向量),视图向量即相机的位置指向目标点(兴趣点),上向量定义了相机向上的方向,同理右向量定义了相机向右的方向。这些向量都可以用
Cartesian3
来表示。
注:文章一开始给出相机定义的截图,使用的网页翻译插件翻译的,存在些许问题,这里顺带纠正一下。
为了形象描述,这里我们伸出自己的左手当做相机,大拇指指向右,食指指向上,则中指则是相机的 direction。
我们在官方给出的示例不难发现,这里仅仅定义Camera方向的
up
和
direction
属性即可,则右向量自然垂直于这两个向量,我果然是个大聪明。
具体可以看官方定义的
DirectionUp
[^4]
类的定义:
除此之外,我们在
Camera
的
flyTo()
方法的中不难发现,还可以通过定义
heading
(航向),
pitch
(俯仰)和
roll
(翻滚)来定义
orientation
的属性值。但是关于Camera的这三个属性都是只读的,因此,我们通过直接访问属性的方法来单个修改是行不通的,因此我们可以参考官方给出的示例,通过修改
direction
和
up
属性来修改相机的方向。
而
flyTo()
方法则是将相机移动至新位置,我们可以通过下面两种方法来定义相机的新位置和方向,具体可以参考官方给出的入门教程:Control the camera
[^5]
。
通过透视视锥体不难发现 Cesium 使用的是透视投影,关于透视投影可以自己去网上查找相关内容。
//方法1: viewer.camera.flyTo({ destination : Cesium.Cartesian3.fromDegrees( -117.16 , 32.71 , 15000.0 ), orientation : { heading : Cesium.Math.toRadians( 20.0 ), pitch : Cesium.Math.toRadians( -35.0 ), roll : 0.0 , }, }); //方法2: viewer.camera.flyTo({ destination : new Cesium.Cartesian3( -3961951.575572026 , 3346492.0945766014 , 3702340.5336036095 ), orientation : { direction : new Cesium.Cartesian3( 0.8982074415844437 , -0.4393530288745287 , 0.013867512433959908 ), up : new Cesium.Cartesian3( 0.12793638617798253 , 0.29147314437764565 , 0.9479850669701113 ), }, });
关于
heading
,
pitch
和
roll
我们可以参考维基百科上关于航空器三主轴
[^6]
的图示来理解,这里直接贴上:
这里我顺便给贴一个动图吧,这里我将维基百科的图自己做了合并录制:分别对应的
heading
、
pitch
和
roll
的动作。
其实关于
heading