问题:
今天在开发业务过程中接到一个需求,是优化Cesium场景中模型的贴地效果,之前模型贴地的实现方式是在模型加载时,设置HeightReference为CLAMP_TO_GROUND来实现的,但是在实际使用场景中,这种方式并不能满足需求,以这种方式批量加载的模型,会在视角移过去之后才慢慢一个一个贴到地形上面,如果电脑性能很慢,或者浏览器没有启用GPU渲染,就会非常卡。
优化思路:
问了下万能的GPT,它是这样说的:
然后查了下官方文档,发现有例子,直接复制粘贴需要的部分:
最后改造原有的loadModel函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| async loadModel({ position: [lng, lat], modelUrl, bearing = 0 }) { console.log('模型加载') const terrainProvider = viewer.scene.terrainProvider const positions = [ Cesium.Cartographic.fromDegrees(lng,lat), ]; const updatedPositions = await Cesium.sampleTerrainMostDetailed( terrainProvider, positions ); const height = updatedPositions[0].height
const position = Cesium.Cartesian3.fromDegrees(lng, lat,height);
const offsetBearing = 90; const heading = Cesium.Math.toRadians(bearing + offsetBearing); const pitch = 0; const roll = 0; const orientation = Cesium.Transforms.headingPitchRollQuaternion( position, new Cesium.HeadingPitchRoll(heading, pitch, roll) );
const viewer = instance.viewer; const entity = viewer.entities.add({ position, orientation, model: { uri: modelUrl, scale: 0.0008, distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 8000) } }); return entity; },
|