2016-03-25 4 views
1

Я борюсь с функциональностью камеры, которая (я думаю) обеспечит способ заставляет мой полигон придерживаться вершины моего дома по уменьшению, масштабированию и вращению (или перемещению камеры).Цезий - использование камеры для масштабирования многоугольника для соответствия положениям Lat-Lon при увеличении/уменьшении изображения

Этот вопрос следует ранее question, который был разрешен. Теперь мне нужна небольшая помощь в решении моей следующей проблемы.

Образец кода, который я пытаюсь выполнить, находится в the gold standard that appears to be baked into the existing camera controller here.

pickGlobe выполнен с параметрами зрителя, правильной координатой mousePosition в мировых координатах и ​​параметром результата, который мне сейчас неинтересен. scene.pickPosition занимает c2-позицию (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! 
    } 

} 

Вот мои переменные:

enter image description here

Вот результат:

enter image description here

Вот мои вопросы, чтобы получить этот код работы:

1. Почему scratchDepthIntersection не получить набор? c2position - это Cartesian2 и c2MousePosition прямо из mouse.click.position и scratchDepthIntersection - это новый Cartesian3.

ответ

1

Правильное значение для mousePosition - это Cartesian2, содержащее координаты окна, а не Cartesian3. Такие координаты мыши обычно исходят от обратного вызова от Cesium.ScreenSpaceEventHandler, но также могут быть построены на основе пользовательских событий мыши/касания JavaScript.

Если вы проверяете содержимое mousePosition, вы должны найти значения x и y значений в координатах пикселя окна.

Я вижу, что вы отредактировали вопрос, включив в него содержимое mousePosition, и похоже, что координаты мыши уже были преобразованы в координаты эллипсоида Cartesian3, что предотвратит работу этого кода. Вы хотите, чтобы исходные координаты мыши направлялись прямо в scene.pickPosition, чтобы это сработало.

+0

YESSSSSS !!!!!!! – Patricia

+0

Ну, CRAP! Он работал один раз. Могу я просто взять click.position? Или я должен объявить его как Cartesian2()? Они выглядят одинаково. Я пробовал это в обоих направлениях. Перезагрузили мою машину ..... Я готов кричать. Я отправлю код еще раз. – Patricia

+0

Похоже, вы рядом. Да, если Цезий дает вам 'click.position', это уже правильная структура данных, чтобы пройти здесь. – emackey