Создать точку в направлении В Цезийс - PullRequest
0 голосов
/ 20 сентября 2019

Я использую CesiumJ.Я хотел бы создать точку D на расстоянии C от точки A, используя направление B

Point A => start Position (CartographicPosition {latitude, longitude; altitude})
Direction B => direction from A (HeadingPitchRoll {heading, pitch, roll})
Distance C => in meters

Я пытаюсь получить вращение, с которым сталкивается объект, и создать точку перед ним.

Моя текущая реализация -

  public createROIfromRotation(position: Cartographic, rotation: HeadingPitchRoll): Cartographic {

    const pos = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
    const quat = Cesium.Transforms.headingPitchRollQuaternion(pos, rotation);
    const rot = CesiumMath.QuaternionToEuler(quat);

    const dir = Cesium.Cartesian3.multiplyByScalar(rot, 10, new Cesium.Cartesian3());
    const roiPos = Cesium.Cartesian3.add(pos, dir, new Cesium.Cartesian3());


    return Cesium.Ellipsoid.WGS84.cartesianToCartographic(roiPos);
  }

Но она не вращается вокруг объекта, она делает какую-то кривую в разных плоскостях.

Мне бы хотелось, чтобы красная точка былавсегда перед грузовиком на расстоянии 10 метров Пример

1 Ответ

0 голосов
/ 26 сентября 2019

Я исправил, используя

  public createROIfromRotation(position: Cartographic, rotation: HeadingPitchRoll) {
    const cartesianPosition = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);

    rotation.heading = rotation.heading - CesiumMath.deg2Rad(90);
    const referenceFrame1 = Cesium.Transforms.headingPitchRollQuaternion(cartesianPosition, rotation);

    const rotationMatrix = Cesium.Matrix3.fromQuaternion(referenceFrame1, new Cesium.Matrix3());

    // Replace 1000 for changing the distance
    const rotationScaled = Cesium.Matrix3.multiplyByVector(rotationMatrix, new Cesium.Cartesian3(10000, 0, 0), new Cesium.Cartesian3());
    const roiPos = Cesium.Cartesian3.add(cartesianPosition, rotationScaled, new Cesium.Cartesian3());

    this.store$.dispatch(new ROIsStoreActions.CreateROIPoint({position: Cesium.Ellipsoid.WGS84.cartesianToCartographic(roiPos), id: uuid()}));
  }

Так что, по сути, конвертируя все в Matrix3 перед применением моих расчетов

...