1、Cesium判断实体被地球遮挡
//判断实体可见
let earth = Cesium.Ellipsoid.WGS84
var earthBoundingSphere = new Cesium.BoundingSphere(Cesium.Cartesian3.ZERO, earth.maximumRadius);
let occluder = Cesium.Occluder.fromBoundingSphere(earthBoundingSphere, viewer.camera.position)
let visible = occluder.isPointVisible(fixedStar.position?.getValue(viewer.clock.currentTime)!)
2、相机固定系、惯性系转换
默认相机位置是固定坐标系下的,希望将相机位置改到惯性系
每次更新前,调用lookAtTransform
改变相机位置
function viewInIcrf(viewer: Cesium.Viewer) {
function icrf(scene: Cesium.Scene, time: Cesium.JulianDate) {
if (scene.mode !== Cesium.SceneMode.SCENE3D) {
return
}
let icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time)
if (Cesium.defined(icrfToFixed)) {
const camera = viewer.camera
const offset = Cesium.Cartesian3.clone(camera.position)
let transform = new Cesium.Matrix4
Cesium.Matrix4.fromRotationTranslation(
icrfToFixed,
new Cesium.Cartesian3(0, 0, 0),
transform
)
camera.lookAtTransform(transform, offset)
}
}
return viewer.scene.postUpdate.addEventListener(icrf)
}
产生问题,鼠标中键调节相机视角功能无效了
修改Cesium源代码,注释掉以下两处代码
//Cesium.js
function tilt3D(controller, startPosition, movement) {
const scene = controller._scene;
const camera = scene.camera;
if (!Matrix4_default.equals(camera.transform, Matrix4_default.IDENTITY)) {
//[1] return;
}
//...
}
...
ScreenSpaceCameraController.prototype.update = function() {
const scene = this._scene;
const { camera, globe, mode: mode2 } = scene;
//[2] if (!Matrix4_default.equals(camera.transform, Matrix4_default.IDENTITY)) {
//[2] this._globe = void 0;
//[2] this._ellipsoid = Ellipsoid_default.UNIT_SPHERE;
//[2] } else {
this._globe = globe;
this._ellipsoid = defined_default(this._globe) ? this._globe.ellipsoid : scene.mapProjection.ellipsoid;
//[2] }
//...
}
修改viewInIcrf
function viewInIcrf(viewer: Cesium.Viewer) {
function icrf(scene: Cesium.Scene, time: Cesium.JulianDate) {
if (scene.mode !== Cesium.SceneMode.SCENE3D) {
return
}
let icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time)
if (Cesium.defined(icrfToFixed)) {
const camera = viewer.camera
const offset = Cesium.Cartesian3.clone(camera.position)
let transform = new Cesium.Matrix4
Cesium.Matrix4.fromRotationTranslation(
icrfToFixed,
new Cesium.Cartesian3(0, 0, 0),
transform
)
let orientation = new Cesium.HeadingPitchRoll(camera.heading, camera.pitch, camera.roll)
camera.lookAtTransform(transform, offset)
camera.setView({
orientation
})
}
}
return viewer.scene.postUpdate.addEventListener(icrf)
}