cesium 相機跟隨

2021-10-24 03:28:52 字數 1980 閱讀 7086

一場大的颱風,路徑通常很長,可能從靠近赤道的太平洋一直往北吹到東三省。跨度這麼大,在三維gis中,往往不容易看全。如果能夠實現相機隨動效果,即相機跟隨颱風步進、移動,就生動許多了。

感覺在cesium中,座標和視角、相機、view是乙個難點,我到現在都搞不清楚。方向(orientation)可以總結一下:

xyz軸,由負到正,分別對應西東、南北、下上。(cesium是右手)

heading:視場角,觀察者(相機?)與地球圍繞y軸轉,可以想象為相機向左,地球就向右;反之。

pitch:俯仰角,觀察者與地球圍繞x軸轉;觀察者低頭,看見地球南極,抬頭,看見地球北極。

roll:旋轉,觀察者與地球圍繞z軸轉;可以想象為地球就是乙個平面的餅,在圍繞圓心在轉。

言歸正傳。一場颱風在繪製過程中,每個步驟都有對應的乙個座標值。只要觀察者能夠跟隨這個腳步,從空中俯視,就能觀察到每乙個步驟的細節。

問題是,如何才能跟隨?

相機(camera)的話,有lookat啦,setview啦,flyto啦。前面2個在本場景中都用不上,相機不動,光調轉角度不行。只有flyto才會跟隨。

但是,flyto方法,既有viewer.flyto,又有camera.flyto。viewer.flyto,飛向指定座標點(也就是颱風的某個步驟座標點),該座標點就會正正好出現在螢幕**,最符合要求;而camera.flyto,是相機飛到指定點,如果按照預設值,相機角度是正俯視地球,那麼沒有問題,指定點也會在螢幕**;但問題是,相機往往設定了各種傾斜的角度,那麼待觀察的點就不會在螢幕**,而是出現在一邊,甚至根本看不見!

那我們還猶豫什麼,就用viewer.flyto就好了。不行啊,這個viewer.flyto,如果當前有資料輸出,畫面在更新,它不會執行,只有等待一切平靜後它才客客氣氣地執行。這就出現一場颱風全部步驟繪製完畢以後,才執行這個viewer.flyto,黃花菜都涼了。

所以,解決辦法還是應該用camera.flyto。飛到乙個合適的座標點,可以讓被觀察點(即颱風步驟座標點)出現在螢幕**。現在的問題是,如何得到這個合適的座標點,讓相機飛過去?

可不可以根據相機的角度,和被觀察點的座標,倒推出這個座標點,以至於相機來到這裡,角度啥的不變,剛好讓被觀察點出現在螢幕**?

這個不是方程式,我沒有找到計算方法。但是也許可以間接計算。我是這麼想的:

颱風剛開始的時候,我們先viewer.flyto颱風起點,這時颱風起點出現在螢幕**;

颱風前進一步,來到了乙個新位置,這時,可以計算它與上一步的位移;

然後我用相機當前位置,加上這個位移,得到乙個新的座標點,這就是那個合適的座標點

相機飛到這個該死的合適座標點

以此類推。

**如下:

//颱風開始時,我們飛向起點p

let flyentity =

newcesium.entity(}

);viewer.entities.

add(flyentity)

;return viewer.

flyto

(flyentity,})

;

//乙個颱風步驟

function

step()

, complete:

function()

});}

當然啦,實際應用過程中,不會步步跟隨,而是20步跟隨一次,否則系統估計會卡死。

cesium中定位方法使用

cesium 繫結dom彈窗(跟隨模型)

思路 1.在頁面中建立乙個div標籤 2.確定標籤在三維場景中的三維位置 並計算三維位置的螢幕座標 3.在每一幀的渲染中都計算一下這個三維座標的螢幕位置,並把螢幕位置賦給標籤。4.當轉到地球背面時,如果不想顯示彈窗,則隱藏。具體實現 1.建立div標籤 標籤樣式 tag建立div時,最好是id和它要...

Cesium引入Three同步相機

這個帖子講述了如何在在cesium引入three,總結一下原理就是 html中設定兩個容器分別用於容納cesium與three,且three容器在cesium容器下面,這樣才能讓three產生的場景覆蓋在cesium上,並且禁用three容器的滑鼠事件,通過cesium同步three。初始化ceiu...

Cesium 取相機飛行引數

heading 方位角 pitch 傾角 roll 旋轉角 range 距離中心距離 let opt let entity new cesium.entity viewer.entities.add entity 1.viewer.zoomto viewer.zoomto entity 或者 vie...