cesium 3dtiles地形遮挡、设置离地高度

当开启viewer.scene.globe.depthTestAgainstTerrain为true时,3dtiles数据可能会被地形遮挡。为解决此问题,可以使用Cesium库中的矩阵变换方法,通过提升模型的高度使其显示出来。在tileset.readyPromise中,计算并设置适当的translation,更新modelMatrix以避免被地形遮挡,并实现平滑的飞行动画。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在开启 viewer.scene.globe.depthTestAgainstTerrain = true //开启地形深度检测 后加载3dtiles数据会导致被地形遮挡,导致3d tiles数据看不见

解决办法

使用矩阵将模型高度提升

 const tilesets = viewer.scene.primitives.add(
    new Cesium.Cesium3DTileset({
      url: `${BASE_URL}/3DTiles/building/tileset.json`,
    }),
  )
  tilesets.readyPromise.then(function (tileset) {
    const offsetHeight = 100 
    const boundingSphere = tileset.boundingSphere 
    const cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center) 
    const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0) 
    const offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, offsetHeight)
    const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3())
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation)
    viewer.flyTo(tileset)
  })
<think>好的,我现在需要回答用户关于Cesium3D笛卡尔坐标系的使用和概念的问题。首先,我得回忆一下Cesium的基本知识,尤其是坐标系相关的部分。Cesium作为一款地理空间可视化库,坐标系的理解确实很重要。 用户提到了3D笛卡尔坐标系,我应该先解释这个概念。Cesium使用的是右手坐标系,这可能和常见的其他坐标系有所不同,比如WebGL使用的是右手系,而有些其他库可能用左手系,这点需要明确。笛卡尔坐标通常表示为$(x, y, z)$,但在Cesium中,可能需要考虑不同的坐标系之间的转换,比如WGS84经纬度和笛卡尔坐标之间的转换。 接下来,用户可能想知道具体的用法,比如如何创建笛卡尔坐标点。这时候需要提到Cesium的API,比如Cartesian3类,以及如何通过fromDegrees方法将经纬度转换为三维坐标。例如,Cartesian3.fromDegrees(longitude, latitude, height)这样的方法,应该给出示例代码,但根据用户提供的示例,代码部分需要用代码块包裹,并注意语法正确。 另外,坐标转换也是重要的一部分。用户可能需要知道如何将笛卡尔坐标转换回经纬度高度,这时候可以使用Cartographic.fromCartesian方法。同时,需要注意椭球模型,比如默认的WGS84椭球,或者其他椭球的使用情况。 应用场景方面,比如在可视化、路径计算、地形分析中的使用。例如,计算两个点之间的距离,或者处理3D模型的位置。这部分需要结合实际的例子,说明笛卡尔坐标系在Cesium中的实际应用。 还要注意引用用户提供的参考内容。虽然用户的问题是关于笛卡尔坐标系的,但引用的内容提到了3DTileset和遮挡分析,可能在涉及几何计算或遮挡时,笛卡尔坐标系的应用会更明显。例如,3D Tiles Mask约束可能依赖于笛卡尔坐标来进行视线分析,这时候坐标系的精确性很重要。需要将引用内容自然地融入到回答中,比如在讲应用场景时提到遮挡分析时引用[^1]。 可能还需要提到坐标系之间的性能考虑,比如在大量数据计算时使用笛卡尔坐标的效率,或者与其他系统集成时的转换注意事项。例如,Cesium ion或GCS中的3D Tileset如何与笛卡尔坐标结合使用,这涉及到数据加载和空间分析时的坐标处理。 最后,生成相关问题,需要围绕笛卡尔坐标系展开,可能涉及转换方法、与其他坐标系的区别、性能优化、应用案例等。例如,如何转换坐标,右手坐标系的影响,性能优化方法,以及遮挡分析中的应用等。 现在需要确保回答结构清晰,分点讲解概念、核心用法、转换方法和应用场景。代码示例需要正确使用Cesium的API,比如Cartesian3的使用,并注意格式。引用部分在适当的位置加入,例如在遮挡分析时引用提供的参考内容。</think>### Cesium3D笛卡尔坐标系的概念与用法 #### 1. 坐标系基础概念 Cesium3D笛卡尔坐标系(Cartesian3)基于**右手坐标系**定义,三个轴分别对应: - **X轴**:指向赤道与本初子午线交点 - **Y轴**:指向赤道与东经90度交点 - **Z轴**:指向北极方向 所有坐标单位为**米**,原点为地球椭球体中心。该坐标系常用于**几何计算、空间分析和可视化定位**[^1]。 #### 2. 核心用法 **创建笛卡尔坐标**: ```javascript // 通过经纬度创建(经度, 纬度, 高度) const position = Cesium.Cartesian3.fromDegrees(116.39, 39.9, 100); // 直接定义坐标 const point = new Cesium.Cartesian3(1e6, 2e6, 3e6); ``` **坐标转换**: ```javascript // 笛卡尔坐标 → 地理坐标(弧度) const cartographic = Cesium.Cartographic.fromCartesian(position); // 地理坐标 → 经纬度(角度) const longitude = Cesium.Math.toDegrees(cartographic.longitude); const latitude = Cesium.Math.toDegrees(cartographic.latitude); ``` #### 3. 关键API方法 | 方法 | 用途 | |------|------| | `Cartesian3.fromDegrees()` | 经纬度转笛卡尔坐标 | | `Cartographic.fromCartesian()` | 笛卡尔坐标转地理坐标 | | `Ellipsoid.WGS84.cartesianToCartographic()` | 指定椭球体转换 | #### 4. 应用场景 1. **几何计算** 计算两点距离: $$ distance = \| \vec{P_2} - \vec{P_1} \| $$ ```javascript const distance = Cesium.Cartesian3.distance(p1, p2); ``` 2. **3D可视化定位** 定位3D模型时需使用笛卡尔坐标: ```javascript viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(116.39, 39.9), model: { uri: "model.glb" } }); ``` 3. **空间分析** 在遮挡分析中,3DTiles Mask约束依赖笛卡尔坐标系判断视线遮挡关系(如建筑物遮挡卫星可见性)[^1]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值