我在相机功能方面苦苦挣扎(我认为)会提供一种方法,以在缩小,放大和旋转(或相机移动)时强制多边形贴在我的房屋顶部。

此问题遵循先前已解决的question。现在,我需要一些帮助来解决我的下一个问题。

我要遵循的示例代码位于the gold standard that appears to be baked into the existing camera controller here中。

pickGlobe是使用查看器的参数,世界坐标中正确的mousePosition和结果参数执行的,我现在不在乎。 scene.pickPosition采用c2position(Cartesian2),并应返回scratchDepthIntersection(Cartesian3)。而是,返回的值是不确定的。

这是我的代码:

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

}


这是我的变量:

javascript - 铯-使用相机缩放多边形以匹配放大/缩小的纬度位置-LMLPHP

结果如下:

javascript - 铯-使用相机缩放多边形以匹配放大/缩小的纬度位置-LMLPHP

这是使此代码正常工作的问题:

1.为什么没有设置scratchDepthIntersection? c2position是一个Cartesian2,而c2MousePosition是从mouse.click.position开始的,而scratchDepthIntersection是一个新的Cartesian3。

最佳答案

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

如果检查mousePosition的内容,则应该在窗口像素坐标中找到xy值。

我看到您已编辑问题以包含mousePosition的内容,并且看起来鼠标坐标已经转换为椭球Cartesian3坐标,这将阻止该代码工作。您希望原始鼠标坐标直接进入scene.pickPosition才能起作用。

10-06 11:47