cesium版本号:1.86.1
复现工具:Cesium Sandcastle
异常现象:ellipsoid中的属性如果使用了CallbackProperty,其innerRadii会表现异常,渲染的效果不符合预期。
解决方案:有,但是不完美。通过系数回乘,修复innerRadii的数值异常。系数为√3
问题复现
1.不使用CallbackProperty
const viewer = new Cesium.Viewer("cesiumContainer", {});
const num = 1000;
const _num = 500;
const ellipsoid = viewer.entities.add({
name: '测试几何体',
position:Cesium.Cartesian3.fromDegrees(120,30,0),
ellipsoid:{
radii: new Cesium.Cartesian3(num, num, num),
innerRadii: new Cesium.Cartesian3(_num, _num, _num),
minimumCone: Cesium.Math.toRadians(0),
maximumCone: Cesium.Math.toRadians(180),
minimumClock: Cesium.Math.toRadians(90),
maximumClock: Cesium.Math.toRadians(450),
material: Cesium.Color.fromCssColorString('rgba(178, 212, 237, 0.5)'),
},
});
viewer.flyTo(ellipsoid);
console.log(viewer);
2.使用CallbackProperty,设置isContant为true
const viewer = new Cesium.Viewer("cesiumContainer", {});
const num = 1000;
const _num = 500;
const ellipsoid = viewer.entities.add({
name: '测试几何体',
position:Cesium.Cartesian3.fromDegrees(120,30,0),
ellipsoid:{
radii: new Cesium.Cartesian3(num, num, num),
innerRadii: new Cesium.CallbackProperty(() => {
return new Cesium.Cartesian3(_num, _num, _num);
}, true),
minimumCone: Cesium.Math.toRadians(0),
maximumCone: Cesium.Math.toRadians(180),
minimumClock: Cesium.Math.toRadians(90),
maximumClock: Cesium.Math.toRadians(450),
material: Cesium.Color.fromCssColorString('rgba(178, 212, 237, 0.5)'),
},
});
viewer.flyTo(ellipsoid);
console.log(viewer);
3.使用CallbackProperty,设置isContant为false
const viewer = new Cesium.Viewer("cesiumContainer", {});
const num = 1000;
const _num = 500;
const ellipsoid = viewer.entities.add({
name: '测试几何体',
position:Cesium.Cartesian3.fromDegrees(120,30,0),
ellipsoid:{
radii: new Cesium.Cartesian3(num, num, num),
innerRadii: new Cesium.CallbackProperty(() => {
return new Cesium.Cartesian3(_num, _num, _num);
}, false),
minimumCone: Cesium.Math.toRadians(0),
maximumCone: Cesium.Math.toRadians(180),
minimumClock: Cesium.Math.toRadians(90),
maximumClock: Cesium.Math.toRadians(450),
material: Cesium.Color.fromCssColorString('rgba(178, 212, 237, 0.5)'),
},
});
viewer.flyTo(ellipsoid);
console.log(viewer);
问题讨论
目前效果是复现1和复现2的那种,需求是想在此基础上,针对个别属性进行动态更新,为此才采用了CallbackProperty。不曾想,使用了CallbackProperty更新属性后,内径的实际渲染和预期数据不一致。明显可以看到比预设少了一半还多。经过反复测试演算,发现缩小的系数为√3。如下代码,在预定值中乘以该系数,可以重新得到自己的预期值。
const viewer = new Cesium.Viewer("cesiumContainer", {});
const num = 1000;
const _num = 500 * Math.sqrt(3);
const ellipsoid = viewer.entities.add({
name: '测试几何体',
position:Cesium.Cartesian3.fromDegrees(120,30,0),
ellipsoid:{
radii: new Cesium.Cartesian3(num, num, num),
innerRadii: new Cesium.CallbackProperty(() => {
return new Cesium.Cartesian3(_num, _num, _num);
}, false),
minimumCone: Cesium.Math.toRadians(0),
maximumCone: Cesium.Math.toRadians(180),
minimumClock: Cesium.Math.toRadians(90),
maximumClock: Cesium.Math.toRadians(450),
material: Cesium.Color.fromCssColorString('rgba(178, 212, 237, 0.5)'),
},
});
viewer.flyTo(ellipsoid);
console.log(viewer);
备注
暂时未找到具体的错误原因,回乘系数也只是逐步推测算出来的。待后续更新······