之前文章发表过一篇关于cesium接口的思维导图的文章,可以在此翻阅,http://mp.weixin.qq.com/s?__biz=MzkwMzMwNTg2NQ==&mid=2247483660&idx=1&sn=9e6649bffd89b6213d2ef0e954556cb6&chksm=c0990eeaf7ee87fc75f2cb2ad8dafed3c75e901ce57c2490a4d7f5403f9bbf70998bd892448a#rd
通过文档我们知道cesium的场景基本是围绕viewer和scene来的,三维场景中三维地物或者模型都有自己的的位置信息和姿态信息,在代码中这些地物加载方式可以通过model对象和3dtiles的方式。不管是哪种加载方式,都有position和orientation(modelmatrix)两个参数来表示他们在场景中的位置和姿态。模型矩阵(modelmatrxi)设置涉及的内容较多,我们后面文章会专门来讲。
同样的我们的相机viewer.camera(viewer.scene.camera也可以获取)也是如此,有位置和姿态信息,三维场景中通过设置相机位置就能通过该位置来显示相机所能看到场景,反之,通过当前显示的场景便能获取到相机的信息。废话不多说先上代码以下是获取某个场景的相机信息。
// 获取相机位置,姿态等
function getcameraPosInfo(){
// 获取 相机姿态信息
var head = viewer.scene.camera.heading
var pitch = viewer.scene.camera.pitch
var roll = viewer.scene.camera.roll
var info ={'head': head ,'pitch': pitch ,'roll': roll};
// 获取位置 wgs84的地心坐标系,x,y坐标值以弧度来表示
var position = viewer.scene.camera.positionCartographic //with longitude and latitude expressed in radians and height in meters.
//以下方式也可以获取相机位置只是返回的坐标系不一样
// var position = viewer.scene.camera.position //cartesian3 空间直角坐标系
// var ellipsoid = scene.globe.ellipsoid;
// var position =ellipsoid.cartesianToCartographic(viewer.scene.camera.position)//
// 弧度转经纬度
var longitude = Cesium.Math.toDegrees(position.longitude).toFixed(6)
var latitude = Cesium.Math.toDegrees(position.latitude).toFixed(6)
var height = position.height
return {lng:longitude,lat:latitude,h:height,mat:info}
}
cesium的接口文档内容比较多,而且有些要有一定的三维图形基础和gis基础结合起来才能理解接口中参数和方法的作用,这里面涉及的接口比较简单,更重要的是理解里面参数意思,通过viewer.camera.position和viewer.camera.positionCartographics都可以获取相机的位置,这两个位置信息获取的都是相机的坐标包括高度,上面两个方式都能获取相机的位置信息,只是返回的坐标系不一样,一个代表的是弧度的笛卡尔空间直角坐标系,一个返回的地心坐标系(默认是wgs84椭球)它们之间可以通过接口转换,可以看上方代码的注释。Cartographic他是以弧度来表示的x,y坐标和以米为单位的高度,可以通过弧度转化为度得到相应的经纬度坐标。 值得注意的是很多网上的文章对高度的阐述不够详细,甚至很多网上的文章复制粘帖,对这一块内容表述也很模糊。比如有把这个高度简单描述为当前位置的高度的,因为没有指定对象,这个就很令人疑惑。其实它不是选中的地物也不是模型所处的高度。通过camera获取的高度就是相机的高度。地形或者地物模型有自己的高度,可通过其他相应的接口来获取。
对于相机的姿态,接口也很简单,只是要理解其中heading,pitch和roll的意思,他们表现为给该三维地物(这里是相机)建立一个模型的坐标系,大致下图所示,以图中红色轴为x轴,绿色为Y轴方向,蓝色为z轴,heading是绕z轴旋转往右旋转为正,pitch是绕x轴旋转,就是俯仰角,往上抬头为正值,roll是绕y轴旋转,也是以右为正。cesium沙盒里也有相应示例,大家可以结合我这讲的内容去试试。
有了以上相机信息后我们就能控制相机的位置和姿势了,结合时序进度来更新相机位置得到自己想要的视角路线,甚至可以设置为跟随移动物体以得到炫酷的展示方式。具体的效果如果大家感兴趣的话,以后我们会出一个这种动态场景的展示视频。这里我们以简单的一个viewer.camera.flyTo()来设置初始显示视角为例,实现初始视角的定位。
//将获取的姿态信息和位置信息给到camera即可
viewer.camera.flyTo({
destination:Cesium.Cartesian3.fromDegrees(121.638221,23.322379,3952.2551284496844 ),
orientation:{
heading : 5.21762380092823,
pitch : -0.34814053638414677 ,//Cesium.Math.toRadians(-35.0),
roll : 0.00015736513513076034}
})
下面这个视角就是通过以上相机的属性设置得到的
微信扫码关注我的订阅号,及时获取更多干货