Cesium模型贴地问题(八)

打印 上一主题 下一主题

主题 799|帖子 799|积分 2397

2023-01-12
1.sampleTerrainMostDetailed


 
 
 根据提供的terrainPrivider和点的弧度坐标计算出当前点的高度信息。
 
  1.       var p = new Cesium.Cartographic.fromCartesian(new Cesium.Cartesian3.fromDegrees(103.8603, 30.704));
  2.       let promise = Cesium.sampleTerrainMostDetailed(this.viewer.terrainProvider, [p])
  3.       Promise.resolve(promise).then(function(updatedPositions) {
  4.         console.log(`updatedPositions为:${updatedPositions}`);
  5.       });
复制代码
updatePositions为:(1.8127041971090665, 0.535885893532339, 495.32088938674565)
获得了高度就可以去调整模型的位置了
 
 
2.heightReference属性
  1.       var entity6 = this.viewer.entities.add({
  2.         id:6,
  3.         position:new Cesium.Cartesian3.fromDegrees(103.8603, 30.704,0),
  4.         //设置朝向和翻滚角度
  5.         orientation:orientation,
  6.         model:{
  7.           uri:"../../../static/3DModel/higokumaru__honkai_impact_3rd/scene.gltf",
  8.           show:true,
  9.           scale: 5.0 ,
  10.           silhouetteColor : Cesium.Color.YELLOW,
  11.           silhouetteSize : 0,
  12.           colorBlendMode:Cesium.ColorBlendMode.MIX,
  13.           colorBlendAmount: 0,
  14.           heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
  15.         }
  16.       })
复制代码
这样的前提是需要地形先加载好,不然的话模型会出现在地心
这种情况就是模型加载好了地形没加载好,找不到椭球就没法计算高度

 
 
 
3.3dtile矩阵变换

 
  1.     var tileset = new Cesium.Cesium3DTileset({
  2.       url: "../../../static/3DModel/sicauOSM/tileset.json",
  3.     });
  4.     this.viewer.scene.primitives.add(tileset);
  5.     console.log(tileset);
  6.     //3dtile加载完成后执行,进行位置变化
  7.     tileset.readyPromise.then(function(tileset) {
  8.    
  9.     //高度偏差,向上是正数,向下是负数
  10.     var heightOffset = 500.0;
  11.     //计算tileset的绑定范围
  12.     var boundingSphere = tileset.boundingSphere;
  13.     //计算中心点位置
  14.     /**
  15.      * fromCartesian 方法是用经纬度和高度定义一个位置
  16.      * A position defined by longitude, latitude, and height.
  17.      */
  18.     var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
  19.       
  20.     //计算中心点位置的地表坐标
  21.     /**
  22.      * Cartesian3 是一个3D点 笛卡尔坐标
  23.      * Cartesian2 是屏幕坐标
  24.      * cartographic 是椭球坐标
  25.      * fromRadians 方法 Returns a Cartesian3 position from longitude and latitude values given in radians(弧度).
  26.      * @param longitude
  27.      * @param latitude
  28.      * @param height
  29.      * 因为建筑模型没他所在高度信息,所以填0
  30.      */
  31.     var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
  32.     //偏移后的坐标,也就是中心点本应在的高度(海拔)   
  33.     var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);
  34.     /**
  35.      * subtract 方法 Computes the componentwise difference of two Cartesians.
  36.      * 计算两个笛卡尔坐标的成分差异
  37.      * @param 就是两个要计算的坐标
  38.      * @param 第三个参数是要保存的结果
  39.      */
  40.     var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
  41.     //tileset.modelMatrix转换
  42.     /**
  43.      * Creates a Matrix4 instance from a Cartesian3 representing the translation.
  44.      * @param {Cartesian3} translation - The upper right portion of the matrix representing the translation.
  45.      * @param {    Matrix4} result - The object in which the result will be stored, if undefined a new instance will be created.
  46.      * Cesium中使用Matrix4作为处理线性变换和位移变换的仿射矩阵
  47.      * 三维空间的转换矩阵通常是3x3的就可以
  48.      * 但是为了同时满足位移的需要增加了一个维度使用4x4的矩阵
  49.      */
  50.     tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
  51.     /**
  52.      * 定位到3dtiles的位置,也就是让摄像头对准这个区域
  53.      * viewBoundingSphere 方法
  54.      * Sets the camera so that the current view contains the provided bounding sphere.
  55.      * @param boundingSphere - The bounding sphere to view, in world coordinates.
  56.      * @param offset  - The offset from the target in the local east-north-up reference frame centered at the target.
  57.      */
  58.     this.viewer.camera.viewBoundingSphere(tileset.boundingSphere, new Cesium.HeadingPitchRange(0, -20, 0));
  59.     });
复制代码
cesium中经常用到矩阵变换,基础要打好

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表