Cesium - 使用相机缩放多边形以在放大/缩小时匹配经纬度位置

2023-12-07

我正在努力解决相机功能(我认为)可以提供一种方法强制我的多边形粘在我房子的顶部缩小、放大和旋转(或相机移动)。

这个问题遵循较早的question问题已解决。现在我需要一点帮助来解决我的下一个问题。

我试图遵循的示例代码位于黄金标准似乎已融入现有的相机控制器中.

挑选地球仪使用查看器的参数、世界坐标中正确的 mousePosition 和结果参数执行,我现在不关心这些参数。场景.pickPosition占据 c2 位置 (笛卡尔2)并且应该返回scratchDepthIntersection(笛卡尔3)。相反,返回值是不明确的.

这是我的代码:

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!
    }

}

这是我的变量:

enter image description here

结果如下:

enter image description here

以下是让此代码正常工作的我的问题:

1. 为什么scratchDepthIntersection没有被设置?c2position 是 Cartesian2,c2MousePosition 直接来自 mouse.click.position,scratchDepthIntersection 是新的 Cartesian3。


正确的值为mousePosition is a Cartesian2包含窗口坐标,而不是Cartesian3。这样的鼠标坐标通常来自回调Cesium.ScreenSpaceEventHandler,但也可以从本机 JavaScript 鼠标/触摸事件构造。

如果您检查的内容mousePosition,你应该找到x and y窗口像素坐标中的值。

我看到您编辑了问题以包含以下内容mousePosition,看起来鼠标坐标已经转换成椭球体了Cartesian3坐标,这将阻止此代码工作。您希望原始鼠标坐标直接进入scene.pickPosition为了这个工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cesium - 使用相机缩放多边形以在放大/缩小时匹配经纬度位置 的相关文章

随机推荐