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:
Hier ist das Ergebnis:
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.
YESSSSSS !!!!!!! – Patricia
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
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