关于cesium.primitive应用俯仰角/偏航角/旋转角

31 阅读1分钟

在研究primitive的仿射变换的时候,我发现旋转的角度总是不如我所愿,因为我并非是GIS专业的,所以简单猜测是因为旋转的坐标系不对,但是通过eastNorthUpToFixedFrame去尝试将z轴单位向量转换得到的向量作为方向依旧存在很大误差,所以采取取巧的方法,利用Camera内部去计算旋转的参数,再转为旋转矩阵,加入最后的仿射矩阵的计算

getOrientation(camera:Cesium.Camera) {
        const scratchRight = new Cesium.Cartesian3();
        const scratchRotation = new Cesium.Matrix3();
        const scratchOrientation = new Cesium.Quaternion();
        const direction = camera.directionWC;

        // 相机自己的轴向量
        const up = camera.upWC;
        let right = camera.rightWC;
        right = Cesium.Cartesian3.negate(right, scratchRight);
        let rotation = scratchRotation;
        Cesium.Matrix3.setColumn(rotation, 0, right, rotation);
        Cesium.Matrix3.setColumn(rotation, 1, up, rotation);
        Cesium.Matrix3.setColumn(rotation, 2, direction, rotation);
        return Cesium.Quaternion.fromRotationMatrix(rotation, scratchOrientation);
    }

只需要通过Camera的setView方法去设置相机朝向,就可以通过上面的方法获取到旋转的四元数和矩阵

如果有知道怎么计算的大佬看到这篇文章,希望能指导一下计算方法,非常感谢!

如果我之后通过学习明白内部计算方法,也会更新这篇文章