Cesium实战功能教程之3dtiles操作(移动+旋转)

在平常的工作中,难免会用到倾斜摄影,当加载倾斜摄影的时候,最头疼的就是倾斜摄影的偏移问题,在代码中进行修改加载倾斜摄影的偏移参数,虽然简单但过于麻烦,也耽误开发的效率,因此我就本着能不能在三维场景中对倾斜摄影进行手动操作,无需再改代码并可将倾斜摄影放在较为正确的位置。为了实现这个功能,我就从网上找一些相关的资料,参照一些网上的大佬的代码进行修改,并补充相关知识,并不是那么及时的完成了这篇文章。希望大家多多收藏和点赞。

下文就是本文的实现思路和代码,并对文中的代码做出一定的注释,对于文章有不对的地方也希望大家进行指正,有大家的参与我才会有动力继续写下去,虽然产量微乎其微😄,但我希望对大家有帮助啊,取之开源用之开源啊。

接下来就开始直入主题啊,首先是绘制旋转标识器和平移标识器,毕竟有方向才好进行辨别啊。

移动指示器的绘制比较简单,通过Cesium.PolylineCollection()将指示器的三个方向方向添加到其中,并将绘制形成的指示器通过primitive的方式进行添加。
代码主要思路如下:

  /**
   * @description 绘制箭头
   * @param {object} originDegree 初始点坐标点
   * @param {object} targetDegree 目标点坐标点
   */
  initLineArrow(originDegree, targetDegree, length) {
   
   
    const arrows = new Cesium.PolylineCollection()
    //坐标系方向存放原始坐标和目的点坐标
    const xPos = [
    originDegree.lng,originDegree.lat,originDegree.alt,
    targetDegree.lng,originDegree.lat,originDegree.alt
    ]
    const xArrow = this.drawArrow(arrows,'model_edit_xArrow',xPos,Cesium.Color.GREEN)
    const yPos = [
      originDegree.lng,originDegree.lat,originDegree.alt,
      originDegree.lng,targetDegree.lat,originDegree.alt
    ]
    const yArrow = this.drawArrow(arrows,'model_edit_yArrow',yPos,Cesium.Color.BLUE)
    const zPos = [
      originDegree.lng,originDegree.lat,originDegree.alt,
      originDegree.lng,originDegree.lat,targetDegree.alt
    ]
    const zArrow = this.drawArrow(arrows,'model_edit_zArrow',zPos,Cesium.Color.RED)
    this._coordArrows = this._viewer.scene.primitives.add(arrows)
    this._coordArrows._name = 'CoordAxis'
  }
  /**
   * @description 绘制空间坐标轴(移动指示器)
   * @param {Cesium.Collection} arrows 坐标轴集合
   * @param {string} name xyz轴名称
   * @param {Array} positions 坐标系位置
   * @param {Cesium.Color} color 坐标系颜色
   */
  drawArrow(arrows, name, positions, color) {
   
   
    const arrow = arrows.add({
   
   
      positions: Cesium.Cartesian3.fromDegreesArrayHeights(positions),
      width: this._defaultWidth,
      material: Cesium.Material.fromType(Cesium.Material.PolylineArrowType, {
   
   
        color: color
      })
    })
    arrow._name = name
  }

移动指示器的绘制原理也类似于移动指示器的绘制,通过Cesium.PolylineCollection()将指示器的三个旋转方向添加到其中,并将绘制形成的指示器通过primitive的方式进行添加。

/**
   * @description 绘制旋转转轴
   * @param {string} name 转轴的名字 
   * @param {Array} position 转轴的位置
   * @param {Cesium.Matrix4} matrix 东北坐标系矩阵
   * @param {Cesium.Color} color 转轴颜色
   * @returns 
   */
createAxisSphere(name, position, matrix, color) {
   
   
    let result = new Cesium.Primitive({
   
   
      geometryInstances:
### Cesium 3D Tiles 倾斜摄影 贴地 教程 示例 #### 创建项目环境 为了在Cesium中引入3D Tiles进行倾斜摄影并实现贴地效果,首先需要设置好开发环境。确保安装了Node.js和npm工具。 ```bash npx cesium@latest create my-app --template application cd my-app npm install ``` 此命令创建了一个基于Cesium的新应用程序模板,并安装所需的依赖项[^1]。 #### 加载3D Tiles数据集 接下来,在`index.html`文件中的JavaScript部分添加代码来加载3D Tiles数据: ```javascript var viewer = new Cesium.Viewer('cesiumContainer', { terrainProvider : new Cesium.CesiumTerrainProvider({ url : 'https://assets.cesium.com/stk-terrain/tilesets/world/wgs84/2017' }) }); // Load a 3D Tileset from the specified URL. var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: 'path/to/your/tilseet.json' // 替换为实际路径 })); viewer.zoomTo(tileset); ``` 这段代码初始化了一个带有地形提供者的Viewer实例,并通过指定URL加载了3D Tiles数据集[^2]。 #### 实现贴地效果 要使3D Tiles模型能够贴近地面显示,可以利用Cesium提供的地理坐标转换功能调整模型的位置。下面是一个简单的例子展示如何计算偏移量并将模型矩阵应用到tileset上以达到贴地的效果: ```javascript function makeTilesetGroundLevel(tileset) { var cartographic = Cesium.Cartographic.fromCartesian( tileset.boundingSphere.center ); var surfacePosition = Cesium.Cartesian3.fromRadians( cartographic.longitude, cartographic.latitude, 0.0 // Set height to zero for ground level ); var offsetHeight = Cesium.Cartesian3.fromRadians( cartographic.longitude, cartographic.latitude, cartographic.height ); var translationVector = Cesium.Cartesian3.subtract( offsetHeight, surfacePosition, new Cesium.Cartesian3() ); tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translationVector); } makeTilesetGroundLevel(tileset); ``` 上述函数接收一个`Cesium3DTileset`对象作为参数,获取其边界球体中心位置对应的经纬度信息,接着分别构建两个三维笛卡尔坐标点——一个是位于地球表面的目标位置(高度设为零),另一个则是原始的高度值;最后求得两者之间的差向量即为我们所需要的平移变换矢量,并将其应用于模型矩阵完成最终的贴地处理[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值