/*
*直接调用这个方法即可
*entityPosition Cartesian3 类型
*/
function ToFaceCamera(entity, entityPosition) {
viewer.scene.postUpdate.addEventListener(function () {
let cameraPosition = viewer.camera.position;
let rotation=changeOrientation(entityPosition,cameraPosition);
entity.orientation =rotation;
})
}
function changeOrientation(posA,posB) {
let m = getModelMatrix(posA, posB);
let hpr = getHeadingPitchRoll(m);
hpr.pitch=0;
hpr.roll=0;
let orientation = Cesium.Transforms.headingPitchRollQuaternion(
posA,
hpr
);
return orientation;
}
function getModelMatrix(pointA, pointB) {
//向量AB
const vector2 = Cesium.Cartesian3.subtract(
pointB,
pointA,
new Cesium.Cartesian3()
);
//归一化
const normal = Cesium.Cartesian3.normalize(vector2, new Cesium.Cartesian3());
//旋转矩阵 rotationMatrixFromPositionVelocity源码中有,并未出现在cesiumAPI中
const rotationMatrix3 = Cesium.Transforms.rotationMatrixFromPositionVelocity(
pointA,
normal,
Cesium.Ellipsoid.WGS84
);
const modelMatrix4 = Cesium.Matrix4.fromRotationTranslation(
rotationMatrix3,
pointA
);
return modelMatrix4;
}
function getHeadingPitchRoll(m) {
var m1 = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Matrix4.getTranslation(m, new Cesium.Cartesian3()),
Cesium.Ellipsoid.WGS84,
new Cesium.Matrix4()
);
// 矩阵相除
var m3 = Cesium.Matrix4.multiply(
Cesium.Matrix4.inverse(m1, new Cesium.Matrix4()),
m,
new Cesium.Matrix4()
);
// 得到旋转矩阵
var mat3 = Cesium.Matrix4.getMatrix3(m3, new Cesium.Matrix3());
// 计算四元数
var q = Cesium.Quaternion.fromRotationMatrix(mat3);
// 计算旋转角(弧度)
var hpr = Cesium.HeadingPitchRoll.fromQuaternion(q);
return hpr;
}