Cesium Entity始终面向相机

129 阅读1分钟
/* 直接调用这个方法即可  *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; 
}