我正在努力使用相机功能(我认为)会在缩小,放大和旋转时提供一种方法强制我的多边形贴在我家的顶部(或者相机移动)。
此问题遵循之前已解决的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!
}
}
以下是我的变量:
结果如下:
以下是我的问题,以使此代码正常运行:
1。为什么scratchDepthIntersection没有设置? c2position是一个Cartesian2,而c2MousePosition是直接来自mouse.click.position而scratchDepthIntersection是一个新的Cartesian3。
答案 0 :(得分:1)
INFO app.Foo - message:Finished execution in {} milliseconds,timestamp:5017
的正确值是包含窗口坐标的long elapsedTime = 8348; //test value
LOGGER.info("message:{},timestamp:{}",
"Finished execution in " + elapsedTime + " milliseconds",
LocalDateTime.now());
,而不是mousePosition
。此类鼠标坐标通常来自Cartesian2
的回调,但也可以通过本机JavaScript鼠标/触摸事件构建。
如果您检查Cartesian3
的内容,则应在窗口像素坐标中找到Cesium.ScreenSpaceEventHandler
和mousePosition
值。
我看到您编辑了问题以包含x
的内容,看起来鼠标坐标已经转换为椭球y
坐标,这将阻止此代码工作。您希望原始鼠标坐标直接进入mousePosition
以使其正常工作。