【CesiumJS入门】(6)修改3D Tiles(tileset)的位置及高度

前言

在之前一篇博客中【CesiumJS入门】(4)加载3D Tiles并获取tileset,我们成功得加载了3D Tiles数据集,本篇中,将会向大伙儿介绍tileset位置的修改与恢复:

请添加图片描述

直接上代码了

/*
 * @Date: 2023-06-28 19:35:03
 * @LastEditors: ReBeX  420659880@qq.com
 * @LastEditTime: 2023-06-30 09:43:16
 * @FilePath: \cesium-tyro-blog\src\utils\ThreeDTiles\translateTileset.js
 * @Description: 平移(Translation):将Tileset在三维场景中沿着指定的方向平移
 * 
 * import {setPosition} from '@/utils/ThreeDTiles/translateTileset.js'
 * setPosition(tileset, 113.27, 23.13, 10)
 */

import { viewer } from '@/utils/createCesium.js' // 引入地图对象
import * as Cesium from 'cesium'

/**
 * Sets the position of the tileset to the specified coordinates.
 *
 * @param {Object} tileset - The tileset to set the position for.
 * @param {Number} lng - The longitude of the new position in degrees. Defaults to the current tileset's longitude.
 * @param {Number} lat - The latitude of the new position in degrees. Defaults to the current tileset's latitude.
 * @param {Number} h - The height of the new position in meters. Defaults to the current tileset's height.
 * @return {undefined} This function does not return a value.
 */
function setPosition(tileset, lng, lat, h) {
  // 计算出模型包围球的中心点(弧度制),从世界坐标转弧度制
  const cartographic = Cesium.Cartographic.fromCartesian(
    tileset.boundingSphere.center
  )
  const { longitude, latitude, height } = cartographic

  // 模型包围球的中心点坐标,输出以笛卡尔坐标系表示的三维坐标点
  const current = Cesium.Cartesian3.fromRadians(
    longitude,
    latitude,
    height
  )

  // 新的位置的中心点坐标,输出以笛卡尔坐标系表示的三维坐标点
  const offset = Cesium.Cartesian3.fromDegrees(
    lng || Cesium.Math.toDegrees(longitude),
    lat || Cesium.Math.toDegrees(latitude),
    h || height
  );

  // 计算差向量:计算tileset的平移量,并将其应用到modelMatrix中
  const translation = Cesium.Cartesian3.subtract(
    offset,
    current,
    new Cesium.Cartesian3()
  )

  // 修改模型的变换矩阵,通过四维矩阵
  tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
  viewer.zoomTo(tileset);
}


/**
 * Resets the position of a tileset to a specified model matrix or the identity matrix if none is provided.
 *
 * @param {Tileset} tileset - The tileset to reset the position of.
 * @param {Matrix4} modelMatrix - Optional. The model matrix to set the tileset's position to. If not provided, the identity matrix(单位向量) will be used.
 */
function serMatrix(tileset, matrix) {
  tileset.modelMatrix = matrix || Cesium.Matrix4.IDENTITY
  viewer.zoomTo(tileset);
}

export {
  setPosition,
  serMatrix
}

调用

import {setPosition, serMatrix} from '@/utils/ThreeDTiles/translateTileset.js'

setPosition(tileset, 113.27, 23.13, 10) // 调整位置到广州,高度10米
setPosition(tileset, undefined, undefined, 500) // 仅修改高度至500米
serMatrix(tileset) // 使用默认变换矩阵(单位向量),实现回到默认位置的效果
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我可以给你一些指导。首先,你需要明确加载3D Tiles的目的是什么。如果你只需要显示一个小范围的地理区域,那么局部加载就是一个非常好的选择,它可以帮助你提高应用程序的性能。 在Cesium中,你可以使用Tileset类加载3D TilesTileset类提供了一些方法,能够帮助你控制加载和显示3D Tiles的细节。下面是一个示例代码,演示如何加载并调整3D Tiles: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); var tileset = new Cesium.Cesium3DTileset({ url : 'path/to/your/tileset' }); viewer.scene.primitives.add(tileset); // 通过设置Tileset的transform属性,调整3D Tiles位置和方向 tileset.readyPromise.then(function(tileset) { var boundingSphere = tileset.boundingSphere; var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center); var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0); var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 10.0); var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3()); tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); }); // 通过设置Tileset的maximumScreenSpaceError属性,控制3D Tiles的细节级别 tileset.maximumScreenSpaceError = 8; ``` 在这个示例中,我们首先创建了一个Cesium的Viewer实例,并将其作为容器显示在HTML页面中。然后,我们创建了一个Tileset实例,并将其添加到场景中。接下来,我们设置了Tileset的transform属性,将3D Tiles调整到我们想要的位置和方向。最后,我们设置了Tileset的maximumScreenSpaceError属性,控制3D Tiles的细节级别。 希望这个示例能够帮助你加载并调整3D Tiles。如果你还有其他的问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值