簡體   English   中英

Cesium - 在放大/縮小時使用相機縮放多邊形以匹配經緯度位置

[英]Cesium - using camera to scale a polygon to match Lat-Lon positions while zoom-in/zoom-out

我正在努力使用相機功能,(我認為)會提供一種方法來強制我的多邊形在縮小、放大和旋轉(或相機移動)時粘在我房子的頂部

此問題遵循已解決的先前問題 現在我需要一點幫助來解決我的下一個問題。

我試圖遵循的示例代碼位於黃金標准中,該標准似乎已融入到此處的現有相機控制器中

pickGlobe使用查看器的參數、世界坐標中的正確 mousePosition 和結果參數執行,我現在不關心這些。 Scene.pickPosition采用 c2position ( Cartesian2 ) 並應返回 scratchDepthIntersection ( Cartesian3 )。 相反,返回的值是undefined

這是我的代碼:

function clickAction(click) {
    var cartesian = scene.camera.pickEllipsoid(click.position, ellipsoid);
    if (cartesian) {
        var setCartographic = ellipsoid.cartesianToCartographic(cartesian);
        collection.latlonalt.push(
            Cesium.Math.toDegrees(setCartographic.latitude).toFixed(15),
            Cesium.Math.toDegrees(setCartographic.longitude).toFixed(15),
            Cesium.Math.toDegrees(setCartographic.height).toFixed(15)
        );
        lla.push(Cesium.Math.toDegrees(setCartographic.longitude), Cesium.Math.toDegrees(setCartographic.latitude));
        if (lla.length >= 4) {
            console.log((lla.length / 2) + ' Points Added');
        }
        enableDoubleClick();
        enableDraw();

        testMe(click.position);  <--------------------- straight from the mouse click
    }
}

var pickedPosition;
var scratchZoomPickRay = new Cesium.Ray();
var scratchPickCartesian = new Cesium.Cartesian3();
function testMe(c2MousePosition) {  <--------------------- straight from the mouse click
    if (Cesium.defined(scene.globe)) { 
        if(scene.mode !== Cesium.SceneMode.SCENE2D) {
            pickedPosition = pickGlobe(viewer, c2MousePosition, scratchPickCartesian);
        } else {
            pickedPosition = camera.getPickRay(c2MousePosition, scratchZoomPickRay).origin;
        }
    }
}

var pickGlobeScratchRay = new Cesium.Ray();
var scratchRayIntersection = new Cesium.Cartesian3();    
var c2position = new Cesium.Cartesian2();
function pickGlobe(viewer, c2MousePosition, result) {   <--------------------- straight from the mouse click
    c2position = c2MousePosition;   <--------------------- setting to Cartesian2

    var scratchDepthIntersection = new Cesium.Cartesian3();
    if (scene.pickPositionSupported) {
        scratchDepthIntersection = scene.pickPosition(c2MousePosition);  <--------------------- neither works!
    }

}

這是我的變量:

在此處輸入圖片說明

結果如下:

在此處輸入圖片說明

以下是我讓此代碼正常工作的問題:

1. 為什么scratchDepthIntersection 沒有被設置? c2position 是一個 Cartesian2,c2MousePosition 是直接來自 mouse.click.position 和 scratchDepthIntersection 是一個新的 Cartesian3。

正確的價值mousePositionCartesian2包含窗口坐標,而不是一個Cartesian3 這樣的鼠標坐標通常來自Cesium.ScreenSpaceEventHandler的回調,但也可以從原生 JavaScript 鼠標/觸摸事件構造。

如果您檢查mousePosition的內容,您應該在窗口像素坐標中找到xy值。

我看到您編輯了問題以包含mousePosition的內容,並且看起來鼠標坐標已經轉換為橢圓體Cartesian3坐標,這將阻止此代碼工作。 您希望原始鼠標坐標直接進入scene.pickPosition以使其正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM