Cesium開發(fā)工具篇 | 03相機(jī)控制

相機(jī)控制主要是用于相機(jī)的飛行定位,例如系統(tǒng)初始化位置定位、視點(diǎn)切換、設(shè)備定位、報(bào)警事件定位等,這些都是通過對(duì)相機(jī)進(jìn)行操作實(shí)現(xiàn)的。Cesium雖然提供了很多種方法用于實(shí)現(xiàn)相機(jī)的飛行定位,但這些方法都是基于Viewer、Camera這兩個(gè)類實(shí)現(xiàn)的。

Viewer類

在Viewer類里面有兩個(gè)方法用于實(shí)現(xiàn)相機(jī)的飛行定位,分別是flyTo、zoomTo方法。這兩個(gè)方法第一個(gè)參數(shù)都是 target ,類型可以是Entity、DataSource、ImageryLayer、Cesium3DTileset等;flyTo方法的第二個(gè)參數(shù)是 options ,它是一個(gè)包含duration(飛行持續(xù)時(shí)間)、maximumHeight(飛行中的最大高度)、offset(HeadingPitchRange類型)的對(duì)象,而 zoomTo 方法的第二個(gè)參數(shù)是 offset ,即上面 options 中的 offset ,也是一個(gè)HeadingPitchRange類型的對(duì)象。Viewer類中的相機(jī)定位方法如下圖所示:

Camera類

Camera 類對(duì)應(yīng)的相機(jī)定位方法比較多,包括如下圖所示的五個(gè)方法,每個(gè)方法的參數(shù)及參數(shù)類型都用不同的顏色區(qū)分開來。其中,options對(duì)象參數(shù)只列出了主要的屬性,想查看全部參數(shù)請(qǐng)查閱官方 API 文檔。

不管是Viewer類還是Camera類中的方法都能實(shí)現(xiàn)相機(jī)的定位功能,根據(jù)實(shí)際情況選擇其一或組合使用。其中viewer.flyTo()、camera.flyTo()、camera.flyToBoundingSphere()這三個(gè)方法會(huì)有一個(gè)飛行動(dòng)畫的效果,所以會(huì)有飛行持續(xù)時(shí)間參數(shù)duration,默認(rèn)是3秒。

相機(jī)參數(shù)

我們不管使用哪種方式,基本上都是先確定相機(jī)要飛到的某一個(gè)位置,如點(diǎn)、矩形、包圍球等,然后再結(jié)合相機(jī)的三個(gè)參數(shù)heading、pitch、roll或range實(shí)現(xiàn)某一位置視角的計(jì)算。下面主要介紹這三個(gè)參數(shù)。

我們知道Cesium使用的是笛卡爾空間直角坐標(biāo)系,X、Y、Z三個(gè)軸的正方向如下圖所示:

相機(jī)的三個(gè)參數(shù)heading、pitch、roll的值是針對(duì)于坐標(biāo)軸旋轉(zhuǎn)的弧度數(shù),示意圖如下所示:

  • heading:偏航角(弧度)
    繞負(fù)Z軸旋轉(zhuǎn),順時(shí)針為正,默認(rèn)為正北方向0,其中正角向東增加??刂茩C(jī)體頭的朝向位置,即左右方向的改變。
  • pitch:俯仰角(弧度)
    繞負(fù)Y軸旋轉(zhuǎn),順時(shí)針為正,默認(rèn)為俯視-90。正俯仰角在飛機(jī)上方,負(fù)俯仰角在飛機(jī)下方??珊?jiǎn)單理解成前空翻、后空翻。
  • roll:翻滾角(弧度)
    繞正x軸旋轉(zhuǎn),順時(shí)針為正,默認(rèn)為0??珊?jiǎn)單理解成側(cè)空翻。
  • range:范圍(米)
    代表相機(jī)距離目標(biāo)的距離。

示例應(yīng)用

問題:已知某一矩形范圍 [110.2,35.6,112.3,36.7] ,要求相機(jī)傾斜25度,實(shí)現(xiàn)矩形位置飛行定位。
下面采用兩種方法實(shí)現(xiàn),并附上核心代碼。

方法一:viewer.flyTo

 var entity = viewer.entities.add({
      rectangle: {
        coordinates: rect,
        material: Cesium.Color.GREEN.withAlpha(1.0),
        height: 10.0,
        outline: false,
      },
    });

    var heading = Cesium.Math.toRadians(0.0);
    var pitch = Cesium.Math.toRadians(-25.0);
    var roll = Cesium.Math.toRadians(0);
    var range = 0;
    viewer.flyTo(entity, {
      offset: new Cesium.HeadingPitchRange(heading, pitch, range),
    });

方法二:camera.flyTo

    var rect = Cesium.Rectangle.fromDegrees(110.2, 35.6, 112.3, 36.7);
    viewer.camera.flyTo({
      destination: rect,
      orientation: new Cesium.HeadingPitchRoll(heading, pitch, roll),
    });

咦???很奇怪,方法二竟然定位錯(cuò)誤?。?!但鼠標(biāo)稍微往上拖拽一下,就能看到綠色的矩形。是什么原因造成的呢?問題出現(xiàn)在pitch值不是相機(jī)的默認(rèn)值。

當(dāng)相機(jī)的pitch不是默認(rèn)值的時(shí)候,就會(huì)出現(xiàn)相機(jī)定位的位置不在屏幕中心的問題,但這時(shí)候使用viewer.flyTo方法來實(shí)現(xiàn)定位就能解決此問題。所以,建議采用方法一實(shí)現(xiàn)相機(jī)的飛行定位。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容