在研究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方法去设置相机朝向,就可以通过上面的方法获取到旋转的四元数和矩阵
如果有知道怎么计算的大佬看到这篇文章,希望能指导一下计算方法,非常感谢!
如果我之后通过学习明白内部计算方法,也会更新这篇文章