2016-03-25 16 views
1

Ich kämpfe mit Kamera-Funktionalität, die (ich denke) würde eine Möglichkeit bieten, zwingen, mein Polygon an der Spitze zu bleiben von meinem Haus auf Zoom-Out, Zoom-in und Rotation (oder Kamerabewegung).Cäsium - Verwenden von Kamera, um ein Polygon zu skalieren, um Lat-Lon-Positionen beim Vergrößern/Verkleinern

Diese Frage folgt eine frühere question, die gelöst wurde. Jetzt brauche ich ein wenig Hilfe bei der Lösung meiner nächsten Ausgabe.

Der Beispielcode, dem ich zu folgen versuche, befindet sich in the gold standard that appears to be baked into the existing camera controller here.

pickGlobe wird mit den Parametern des Viewers, der korrekten Mausposition in Weltkoordinaten und einem Ergebnisparameter ausgeführt, was mir momentan egal ist. scene.pickPosition nimmt die c2position (Cartesian2) und sollte die scratchDepthIntersection (Cartesian3) zurückgeben. Stattdessen ist der zurückgegebene Wert undefined.

Hier ist mein Code:

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

} 

Hier meine Variablen sind:

enter image description here

Hier ist das Ergebnis:

enter image description here

Hier sind meine Fragen diesen Code zum Laufen zu bringen:

1. Warum ist scratchDepthIntersection nicht festgelegt zu werden? c2position ist ein Cartesian2 und c2MousePosition ist direkt von der Maus.click.position und scratchDepthIntersection ist eine neue Cartesian3.

Antwort

1

Der korrekte Wert für mousePosition ist ein Cartesian2 enthält Fenster Koordinaten, kein Cartesian3. Solche Mauskoordinaten stammen normalerweise aus einem Rückruf von Cesium.ScreenSpaceEventHandler, können aber auch aus nativen JavaScript-Maus-/Berührungsereignissen erstellt werden. Wenn Sie den Inhalt von mousePosition überprüfen, sollten Sie die Werte x und y in Fensterpixelkoordinaten finden.

Ich sehe Sie die Frage um den Inhalt von mousePosition, einschließen bearbeitet und es sieht aus wie die Mauskoordinaten sind bereits in Ellipsoid Cartesian3 Koordinaten umgewandelt worden, die diesen Code von der Arbeit verhindert. Sie möchten, dass die ursprünglichen Mauskoordinaten direkt in scene.pickPosition gehen, damit dies funktioniert.

+0

YESSSSSS !!!!!!! – Patricia

+0

Gut, Mist! Es hat einmal funktioniert. Kann ich einfach die click.position nehmen? Oder muss ich es als Cartesian2() deklarieren? Sie sehen gleich aus. Ich habe es in beide Richtungen versucht. Habe meine Maschine neu gestartet ..... Ich bin bereit zu schreien. Ich werde den Code erneut posten. – Patricia

+0

Klingt, als wären Sie nah dran. Ja, wenn Caesium Ihnen eine 'click.position' gibt, ist dies bereits die richtige Datenstruktur, die hier übergeben werden soll. – emackey