Quiero mover una posición cartesiana3 verticalmente hacia arriba en x cantidad de unidades (por ejemplo, metros).
NO quiero convertirlo a Cartográfico , agregar x a la altitud y volver a convertirlo en Cartesiano3 .
¿Cuál sería la mejor manera (en cuanto al rendimiento) de realizar esta operación?
Muy facil.
const position = Cesium.Cartesian3.fromDegrees(129.507780, 42.9075, 0); const origMagnitude = Cesium.Cartesian3.magnitude(position); const verticalAmount = 10; const newMagnitude = origMagnitude + verticalAmount; const scalar = newMagnitude / origMagnitude; const newPosition = new Cesium.Cartesian3(); Cesium.Cartesian3.multiplyByScalar(position, scalar, newPosition);Aquí está el enlace del castillo de arena
Por lo que vale, alejarse directamente del centro de la Tierra (como se muestra en otra respuesta aquí) es casi ascendente, pero no exactamente un local perfecto. La razón es que la Tierra en realidad sobresale un poco alrededor del ecuador debido a la rotación y, de hecho, el elipsoide WGS84 (usado por Cesium) no es una esfera perfecta, tiene la protuberancia incluida. Alejarse de su centro le da el "Geocéntrico hacia arriba", pero no el "Geodésico hacia arriba", que es el verdadero local hacia arriba. Es cierto que es una diferencia muy pequeña.
Una forma de encontrar el local adecuado es pedir un sistema de coordenadas local desde una posición de inicio determinada. En el siguiente ejemplo, local arriba (así como el este local y el norte local) se calculan para una posición conocida en la superficie de WGS84. Se muestra un punto verde en la ubicación inicial, un punto amarillo se muestra arriba y un punto azul se muestra hacia el este. (Oeste sería -X, Norte y Sur son +Y e -Y en este marco local).
Demostración en vivo de Sandcastle
var viewer = new Cesium.Viewer("cesiumContainer"); // Get the transform from local east-north-up to Earth Fixed at a known position. var center = Cesium.Cartesian3.fromDegrees(-79.0, 40.0); var transform = Cesium.Transforms.eastNorthUpToFixedFrame(center); // Green dot at center viewer.entities.add({ position: center, point: { color: Cesium.Color.LIME, pixelSize: 10 } }); // Yellow dot 40 meters above var above = Cesium.Matrix4.multiplyByPoint(transform, new Cesium.Cartesian3(0, 0, 40.0), new Cesium.Cartesian3()); viewer.entities.add({ position: above, point: { color: Cesium.Color.YELLOW, pixelSize: 10 } }); // Blue dot 40 meters East (straight line East of center, not following Earth curvature) var east = Cesium.Matrix4.multiplyByPoint(transform, new Cesium.Cartesian3(40.0, 0, 0), new Cesium.Cartesian3()); viewer.entities.add({ position: east, point: { color: Cesium.Color.LIGHTSKYBLUE, pixelSize: 10 } }); viewer.zoomTo(viewer.entities);