簡體   English   中英

Cesium 從 2 個位置計算軸承旋轉

[英]Cesium calculate bearing rotation from 2 positions

我正在向 Cesium 添加一個平面實體,如下所示:

let position = Cesium.Cartesian3.fromDegrees(long, lat, alt)
let planeEntity = this.viewer.entities.add({
  position: position,
  model: {
    uri: './assets/cesium/Cesium_Air.glb',
    minimumPixelSize : 64
  }
});

我實時獲取飛機位置,每次到達位置時我都會:

planeEntity.position = Cesium.Cartesian3.fromDegrees(long, lat, alt);

並將飛機移動到該位置。

我想將飛機頭旋轉到正確的位置(如果飛機向上飛行,則頭部不能停留在左側)。

如何從 2 個位置計算軸承旋轉? (當前位置和下一個位置)?

我在這里找到了解決方案:[ 用javascript計算兩點之間的方位

 // Converts from degrees to radians.
   toRadians(degrees) {
    return degrees * Math.PI / 180;
  }

// Converts from radians to degrees.
   toDegrees(radians) {
    return radians * 180 / Math.PI;
  }

   bearing(startLat, startLng, destLat, destLng){
    startLat = this.toRadians(startLat);
    startLng = this.toRadians(startLng);
    destLat = this.toRadians(destLat);
    destLng = this.toRadians(destLng);

    let y = Math.sin(destLng - startLng) * Math.cos(destLat);
    let x = Math.cos(startLat) * Math.sin(destLat) - Math.sin(startLat) * Math.cos(destLat) * Math.cos(destLng - startLng);
    let brng = Math.atan2(y, x);
    let brngDgr = this.toDegrees(brng);
    return (brngDgr + 360) % 360;
  }

基於 larry ckey 的回答的銫方式(ES6):

import * as Cesium from 'cesium';

const calculateBearing = (startPoint, endPoint) => {
  const start = Cesium.Cartographic.fromCartesian(startPoint);
  const end = Cesium.Cartographic.fromCartesian(endPoint);

  const y = Math.sin(end.longitude - start.longitude) * Math.cos(end.latitude);
  const x =
    Math.cos(start.latitude) * Math.sin(end.latitude) -
    Math.sin(start.latitude) * Math.cos(end.latitude) *
    Math.cos(end.longitude - start.longitude);

  const bearing = Math.atan2(y, x);
  return Cesium.Math.toDegrees(bearing);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM