【问题标题】:Cesium - using camera to scale a polygon to match Lat-Lon positions while zoom-in/zoom-outCesium - 在放大/缩小时使用相机缩放多边形以匹配经纬度位置
【发布时间】:2016-03-25 16:13:13
【问题描述】:

我正在努力使用相机功能(我认为)可以提供一种方法来在缩小、放大和旋转(或相机移动)。

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

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

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。

【问题讨论】:

    标签: javascript node.js camera terrain cesium


    【解决方案1】:

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

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

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

    【讨论】:

    • 好吧,废话!它工作过一次。我可以只接受click.position吗?还是我必须将其声明为 Cartesian2()?它们看起来一样。我两种方式都试过了。重新启动我的机器......我准备尖叫。我会再次发布代码。
    • 听起来你很接近了。是的,如果 Cesium 给你一个click.position,那已经是正确的数据结构了。
    • 耶!我让它工作然后它停止工作然后我让它再次工作并将它推到git!好事,因为它再次停止工作。所以我删除了应用程序并将其从 git 中拉回来,它又开始工作了。气质项目!
    • 嘿,emackey!我有一个新问题:stackoverflow.com/q/36271816/1735836
    猜你喜欢
    • 2016-06-26
    • 2012-08-10
    • 1970-01-01
    • 2013-03-17
    • 2021-01-04
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多