Cesium Cartesian3 垂直向上移动

Cesium Cartesian3 move vertically up

我想将 Cartesian3 位置垂直向上移动 x 个单位(例如,米)。

我不想将其转换为制图,将x添加到高度并转换回Cartesian3.

执行此操作的最佳方式(性能方面)是什么?

超级简单。

    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);

这里是Sandcastle link

就其价值而言,直接远离地球中心(如此处的另一个答案所示)几乎向上,但不完全是一个完美的局部向上。原因是地球实际上由于自转而在赤道周围稍微凸起,事实上 WGS84 椭球体(Cesium 使用)并不是一个完美的球体,它包含了凸起部分。远离它的中心会给你“地心向上”,而不是真正的局部向上的“大地向上”。不可否认,这是非常细微的差别。

找到合适的局部向上的一种方法是从给定的起始位置请求局部坐标系。在以下示例中,针对 WGS84 表面上的已知位置计算局部向上(以及局部东和局部北)。起始位置显示一个绿点,上方显示一个黄点,东方显示一个蓝点。 (在此局部坐标系中,西为 -X,南北为 +Y 和 -Y)。

Sandcastle live demo

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);