基于Cesium的实景三维模型动态更新-以3Dtiles为例(番外篇)

Posted lwx2233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Cesium的实景三维模型动态更新-以3Dtiles为例(番外篇)相关的知识,希望对你有一定的参考价值。

在进行实景三维模型动态更新的时候,经常会出现一些误差问题,这里将我遇到的问题以及解决方法统一写出来:

1.模型高度问题

在无人机采集数据倾斜建模后,可能会出现新旧模型高度不一致的情况,如下图:

可以通过clampToHeigthMostDetailed的办法去获取他的高度(如果你可以的话记得告诉我!),这里也给出代码

function getHeightByType(cartesians)
    return new Promise(async (resolve) => 
      try 
        let promise = viewer.scene.clampToHeightMostDetailed(cartesians);
          promise.then((updatedCartesians) => resolve(updatedCartesians));
       catch (e) 
        resolve(false);
      
    );

或者有比较吊诡的办法,直接获取某个点新旧模型的高度值,得到高度差,再用上模型的平移方法去纠正,代码如下:

1.1点选模型获取高度 

//鼠标点选获取模型上的点,可以准确的获取到某经纬度下模型的高度
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (evt) 
  var cartesian = viewer.scene.pickPosition(evt.position);
  var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
  var lng = Cesium.Math.toDegrees(cartographic.longitude);
  var lat = Cesium.Math.toDegrees(cartographic.latitude);
  var height = cartographic.height; // 模型高度
  var mapPosition = 
    x: lng,
    y: lat,
    z: height,
  ;
  console.log(mapPosition);
, Cesium.ScreenSpaceEventType.LEFT_CLICK);

这里的mapPosition就是你点选的那个点,只需要获得z(高度)就够了。

1.2调整模型高度

//根据tileset的边界球体中心点的笛卡尔坐标得到经纬度坐标,经纬度
    var cartographic = Cesium.Cartographic.fromCartesian(tilesset.boundingSphere.center);
    //根据经纬度和高度0,得到地面笛卡尔坐标
    var surface = Cesium.Cartesian3.fromRadians(
      cartographic.longitude,
      cartographic.latitude,
      cartographic.height,
    );
    console.log(cartographic.height)
    var height = cartographic.height + 5.40533759063451
    //根据经纬度和需要的高度,得到偏移后的笛卡尔坐标
    // var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 60);
    var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, height);
    //计算坐标变换,得到新的笛卡尔坐标
    var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
    //调整3dtiles位置
    tilesset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);

height后面那一段5.40533就是我们手动获取的新旧模型的高度差,之后通过位置移动就可以实现调整模型的高度一致了。 

以上是关于基于Cesium的实景三维模型动态更新-以3Dtiles为例(番外篇)的主要内容,如果未能解决你的问题,请参考以下文章

基于Cesium的实景三维模型动态更新-以3Dtiles为例

基于Cesium的实景三维模型动态更新-以3Dtiles为例

基于Cesium的实景三维模型动态更新-以3Dtiles为例

基于Cesium的实景三维模型动态更新-以3Dtiles为例

基于Cesium的实景三维模型动态更新-以3Dtiles为例

基于Cesium的实景三维模型动态更新-以3Dtiles为例