Cesium,已知基础点位置、方位角、俯仰角、距离,求目标点位置。
function offsetFromHeadingPitchRange(lonDegrees, latDegrees, height, azimuthDegrees, pitchDegrees, distance) {
let heading = Cesium.Math.toRadians(azimuthDegrees);
let pitch = Cesium.Math.toRadians(pitchDegrees);
pitch = Cesium.Math.clamp(pitch,-Cesium.Math.PI_OVER_TWO,Cesium.Math.PI_OVER_TWO);
heading = Cesium.Math.zeroToTwoPi(heading) - Cesium.Math.PI_OVER_TWO;
const pitchQuat = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Y,-pitch);
const headingQuat = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Z,-heading);
const rotQuat = Cesium.Quaternion.multiply(headingQuat,pitchQuat,headingQuat);
const rotMatrix = Cesium.Matrix3.fromQuaternion(rotQuat);
const offset = Cesium.Cartesian3.clone(Cesium.Cartesian3.UNIT_X);
Cesium.Matrix3.multiplyByVector(rotMatrix, offset, offset);
Cesium.Cartesian3.multiplyByScalar(offset, distance, offset);
const basePointCartesian3 = Cesium.Cartesian3.fromDegrees(lonDegrees, latDegrees, height);
const transform = Cesium.Transforms.eastNorthUpToFixedFrame(basePointCartesian3);
const result = Cesium.Matrix4.multiplyByPoint(transform, offset, new Cesium.Cartesian3());
const targetPointCartographic = Cesium.Cartographic.fromCartesian(result);
const targetPointLongitude = Cesium.Math.toDegrees(targetPointCartographic.longitude);
const targetPointLatitude = Cesium.Math.toDegrees(targetPointCartographic.latitude);
const targetPointHeight = targetPointCartographic.height;
return [targetPointLongitude, targetPointLatitude, targetPointHeight, result];
}