1. 程式人生 > >Cesium學習筆記(5)

Cesium學習筆記(5)

1.更改cesium的選擇框大小
在Souce/Widgets/SelectionIndicator/SelectionIndicator.js中修改:
這裡寫圖片描述
在Souce/Widgets/SelectionIndicator/ SelectionIndicator.css中修改:
這裡寫圖片描述
2.對於label和billboard字型或圖片不清晰問題的解決方案:

原因:billboard是柵格影象,處在非整型畫素位置上的效果要比畫素位置一致的要差很多。而且目前模糊特性似乎是當前的fxaa系統特意設計的,

解決方案:採用1.28版本及以上,然後在Source/Shaders/BillboardCollectionVS.js檔案中,找到gl_Position = czm_viewportOrthographic * vec4(positionWC.xy, -positionWC.z, 1.0);這句,修改成 gl_Position = czm_viewportOrthographic * vec4(floor(positionWC.xy + 0.5), -positionWC.z, 1.0); 同時設定viewer.scene.fxaa = false;

這樣使billboard和label採用1*1畫素大小繪製。但是這樣會使線產生鋸齒,期待更好的解決辦法。

3.label被ploygon擋住
原因:因為label處在3D空間內,所以會被多邊形或者地形擋住,理想情況下,你想讓label完全可見或者完全不可見要取決於它的位置,但這實際上是一個非常難以解決的問題(不僅在cesium中,其他3D球也一樣),最好的解決方法是讓label的eyeoffset的z值為負。eyeoffset能夠基於viewer的位置來移動label或billboard的渲染位置。x為正移動到viewer的右邊,y為正向上移動,z為正就移動到螢幕裡面。通過只設置z值為負,這個label就會更加的接近使用者,它就會被渲染在polygon之上。

解決: label.eyeOffset = new Cesium.ConstantProperty(new Cesium.Cartesian3(0, 0, -100000));

備註:這種方式有兩個缺點,儘管它們在許多用例中不影響大局,但是也應該瞭解:
①:當viewer在z值的長度內時,它將會消失,因為它現在在viewer的後面
②:如果在你的label之前有別的東西,比如是另一個shape或者volume,距離比z值小,那麼這個label將會顯示在這個東西之上,因為label的渲染位置更接近於我們。