function test() {
console.log(viewer.scene.camera);
let heading = viewer.scene.camera.heading;
let pitch = viewer.scene.camera.pitch;
let roll = viewer.scene.camera.roll;
let posWC = viewer.scene.camera.positionWC;
let viewMatrix = viewer.scene.camera.viewMatrix;
const camera = new Cesium.Camera(viewer.scene);
camera.setView({
destination: Cesium.Cartesian3.fromDegrees(99, 21, 10000),
orientation: {
heading: 4.8031672383442245,
pitch: -0.46137795322172037,
roll: 6.280696062339012
}
});
let screenPos = wcPos2ScreenPos(99, 21, 2, posWC, new Cesium.HeadingPitchRoll(heading, pitch, roll), viewer.canvas.width, viewer.canvas.height);
// 屏幕坐标
let screenCoordinates = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
viewer.scene,
Cesium.Cartesian3.fromDegrees(99, 21, 2)
);
console.log(screenCoordinates, screenPos);
}
function wcPos2ScreenPos(lng, lat, alt, cameraPos, cameraHPR, canvasWidth, canvasHeight){
cameraHPR.heading = cameraHPR.heading - Cesium.Math.PI_OVER_TWO;
const rotQuat = Cesium.Quaternion.fromHeadingPitchRoll(cameraHPR, new Cesium.Quaternion());
const rotMat = Cesium.Matrix3.fromQuaternion(rotQuat, new Cesium.Matrix3());
const direction = Cesium.Matrix3.getColumn(rotMat, 0, new Cesium.Cartesian3());
const up = Cesium.Matrix3.getColumn(rotMat, 2, new Cesium.Cartesian3());
const right = Cesium.Cartesian3.cross(direction, up, new Cesium.Cartesian3());
const transform = Cesium.Transforms.eastNorthUpToFixedFrame(cameraPos, Cesium.Ellipsoid.WGS84, new Cesium.Matrix4());
const directionWC =Cesium.Matrix4.multiplyByPointAsVector(transform, direction, new Cesium.Cartesian3());
const upWC =Cesium.Matrix4.multiplyByPointAsVector(transform, up, new Cesium.Cartesian3());
const rightWC =Cesium.Matrix4.multiplyByPointAsVector(transform, right, new Cesium.Cartesian3());
const viewMatrix = Cesium.Matrix4.computeView(cameraPos, directionWC, upWC, rightWC, new Cesium.Matrix4());
const objPos = Cesium.Cartesian3.fromDegrees(lng, lat, alt);
const positionEC = Cesium.Matrix4.multiplyByVector(viewMatrix, new Cesium.Cartesian4(objPos.x,objPos.y,objPos.z,1), new Cesium.Cartesian4());
const aspectRatio = canvasWidth/canvasHeight;
const fov = Cesium.Math.toRadians(60.0);
const fovy =aspectRatio <= 1? fov: Math.atan(Math.tan(fov * 0.5) / aspectRatio) * 2.0;
const near = 0.1;
const far = 10000000000;
const top = near * Math.tan(0.5 * fovy);
const bottom = -top;
const right1 = aspectRatio * top;
const left = -right1;
const projectionMatrix = Cesium.Matrix4.computePerspectiveOffCenter(left, right1, bottom, top, near, far, new Cesium.Matrix4());
const positionCC = Cesium.Matrix4.multiplyByVector(projectionMatrix, positionEC, new Cesium.Cartesian4());
let viewport = new Cesium.BoundingRectangle(0,0, canvasWidth, canvasHeight);
let screenPos = Cesium.SceneTransforms.clipToGLWindowCoordinates(viewport, positionCC);
screenPos.y = canvasHeight - screenPos.y;
return screenPos;
}