【CesiumJS入门】(4)加载3D Tiles并获取tileset

news2024/11/28 8:44:08

前言

本次,我们将写一个函数来加载3D Tiles数据,

3D Tiles数据的文档:CesiumGS/3d-tiles: Specification for streaming massive heterogeneous 3D geospatial datasets (github.com)

同时我们将获取加载成功后的tileset数据集(有了tileset后续就可以方便得进行模型相关的操作了),下图为加载模型后的效果。
在这里插入图片描述

实现

写法一

该写法配合Promise,通过实例化一个Cesium3DTileset后通过readyPromise返回tileset,但是这种写法将在CesiumJS 1.107 版本后弃用!!

/**
 * @function addThreeDTiles
 * @param {String} url - 模型切瓦后的瓦片索引文件URL或者Cesium Resource
 * @param {Object} [option] - 选项对象(可选) https://cesium.com/learn/cesiumjs/ref-doc/Cesium3DTileset.html#.ConstructorOptions
 */
 
export function addThreeDTiles(url, option) {
  // 开启地形深度检测:
  // 控制在渲染场景时,相机是否进行深度测试以避免将被遮挡的物体绘制在前景
  // true: 相机会根据地形高度信息进行深度测试,避免将低于地面的物体绘制在地面之上
  viewer.scene.globe.depthTestAgainstTerrain = true

  // ! 写法一:将在 1.107 版本后不支持,options.url和Cesium3DTileset.readyPromise将被移除
  return new Promise(resolve => {
    const tileset = new Cesium.Cesium3DTileset({
      url // 模型切瓦后的瓦片索引文件地址或者Cesium Resource
    })
    tileset.readyPromise.then(() => {
      viewer.scene.primitives.add(tileset)
    })
    resolve(tileset) // 返回模型对象
  })
}

调用:

const modelPromise = addThreeDTiles('/model/Tileset/示例建筑/tileset.json')  // 模型切瓦后的瓦片索引文件URL
const modelPromise2 = addThreeDTiles(Cesium.IonResource.fromAssetId(75343)) // Cesium Ion Resource

modelPromise.then(tileset=> {
  console.log('tileset: ', tileset)
})

推荐:写法二:

配合 async/await 用Cesium官方推荐的Cesium3DTileset.fromUrl来实现:

export async function addThreeDTiles(url, option) {
  // 开启地形深度检测:
  // 控制在渲染场景时,相机是否进行深度测试以避免将被遮挡的物体绘制在前景
  // true: 相机会根据地形高度信息进行深度测试,避免将低于地面的物体绘制在地面之上
  viewer.scene.globe.depthTestAgainstTerrain = true
  
  // ! 写法二:
  if (typeof url !== 'string') { // 如果传入的url不是一个json索引文件地址,而是Cesium.IonResource,则需要处理一下:
    url = await url;
  }
  const tileset = await Cesium.Cesium3DTileset.fromUrl(url, option);
  viewer.scene.primitives.add(tileset);

  return tileset // 返回模型对象
}

调用方法其实一样:

const modelPromise = addThreeDTiles('/model/Tileset/示例建筑/tileset.json')  // 模型切瓦后的瓦片索引文件URL
const modelPromise2 = addThreeDTiles(Cesium.IonResource.fromAssetId(75343)) // Cesium Ion Resource

modelPromise.then(tileset=> {
  console.log('tileset: ', tileset)
})

Options

通过上述封装的函数在加载3D Tiles 瓦片集时,可以传入option,option则为初始化Cesium3DTileset时的配置项对象,参考中文文档: Cesium3DTileset - Cesium Documentation

移除tileset

viewer.scene.primitives.remove(tileset);

代码

代码提交参考: feat: 新增添加3D Tiles · c3759ef · ReBeX/cesium-tyro-blog - Gitee.com

/*
 * @Date: 2023-05-23 10:45:33
 * @LastEditors: ReBeX  420659880@qq.com
 * @LastEditTime: 2023-06-14 19:35:48
 * @FilePath: \cesium-tyro-blog\src\utils\ThreeDTiles\loadTileset.js
 * @Description:  从给定 URL 加载 3D 模型,添加到场景中,并自动定位到模型所在位置
 * import { addThreeDTiles } from '@/utils/ThreeDTiles/loadTileset.js'
 * e.g.: addThreeDTiles('/model/Tileset/示例建筑/tileset.json')
 * const modelPromise = addThreeDTiles(Cesium.IonResource.fromAssetId(75343))
 * modelPromise.then(model => {
 *   console.log('tileset: ', model)
 * })
 */
import { viewer } from '@/utils/createCesium.js' // 引入地图对象
import * as Cesium from 'cesium'

/**
 * @function addThreeDTiles
 * @param {String} url - 模型切瓦后的瓦片索引文件URL或者Cesium Resource
 * @param {Object} [option] - 选项对象(可选) https://cesium.com/learn/cesiumjs/ref-doc/Cesium3DTileset.html#.ConstructorOptions
 */
const tilesetOption = {
  skipLevelOfDetail: true,
  baseScreenSpaceError: 1024,
  skipScreenSpaceErrorFactor: 16,
  skipLevels: 1,
  immediatelyLoadDesiredLevelOfDetail: false,
  loadSiblings: false,
  cullWithChildrenBounds: true
}
export async function addThreeDTiles(url, option) {
  // 开启地形深度检测:
  // 控制在渲染场景时,相机是否进行深度测试以避免将被遮挡的物体绘制在前景
  // true: 相机会根据地形高度信息进行深度测试,避免将低于地面的物体绘制在地面之上
  viewer.scene.globe.depthTestAgainstTerrain = true

  /*
  // ! 写法一:将在 1.107 版本后不支持,options.url和Cesium3DTileset.readyPromise将被移除
  return new Promise(resolve => { // 返回 Promise 对象
    const tileset = new Cesium.Cesium3DTileset({
      url // 模型切瓦后的瓦片索引文件地址或者Cesium Resource
    })
    tileset.readyPromise.then(() => {
      viewer.scene.primitives.add(tileset)
    })
    resolve(tileset) // 返回模型对象
  })
  */

  // ! 写法二:
  if (typeof url !== 'string') { // 如果传入的url不是一个json索引文件地址,而是Cesium.IonResource,则需要处理:
    url = await url;
  }
  const tileset = await Cesium.Cesium3DTileset.fromUrl(url, option);
  viewer.scene.primitives.add(tileset);
  // 定位到模型
  viewer.zoomTo(
    tileset,
    new Cesium.HeadingPitchRange(
      0.0,
      -0.5,
      tileset.boundingSphere.radius * 2.0 // 模型的包围球半径的2倍
    )
  )
  return tileset // 返回模型对象
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 中错误 ImportError: No Module Named Sklearn

在 Python 中,sklearn 被用作机器学习工具,用于在回归、集群等方面创建程序。很多时候,导入它会抛出错误—— No module named sklearn。 这意味着由于安装错误、无效的 Python 或 pip 版本或其他问题,系统无法找到它。 Python中错误ImportError: No module named sklearn…

基于Java营业厅宽带系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

Karl Guttag评Vision Pro:比Quest Pro做了更多正确选择

上周苹果正式发布Vision Pro,尽管要到明年才发售,但光学领域的专业博主Karl Guttag也发表了自己的看法。他提到:目前受邀体验的媒体中要不是苹果粉丝、要不就是对AR、VR了解比较少,没有我看到“批判性思维”或太多对技术分析的内容…

MySQL常用操作(一)

创建表 create table user(id int unsigned primary key not null auto_increment,name varchar(50) unique not null,age tinyint not null,sex enum(M, W) not null )engineINNODB default charsetutf8;# 查看创建表语句 show create table user两种插入方式比较 # 方式1 i…

加速千行百业转型,华为如何为智能世界构建感知底座

导读:感知正成为行业数字化的新引擎。 我们正在迈进一个万物感知的时代。 日常生活中,感知已经无处不在。小到智能家居的控制系统,大到智慧城市虚实联动的数字孪生,感知是一切智能化的前提,也是行业数字化转型的基础。…

如何恢复被隔离的u盘数据?2种恢复u盘隔离数据的方法

很多时候,我们可能会因为各种原因导致U盘数据丢失,比如误删、格式化等情况。但最近有一位朋友咨询小编关于U盘文件被隔离的问题,他在使用U盘时发现有些文件被隔离了,想知道如何恢复。其实,U盘文件被隔离可能是由于存在…

记录--为什么推荐用svg而不用icon?

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用背景: 1.因为svg图标在任何设备下都可以高清显示,不会模糊。而icon会在显卡比较低的电脑上有显示模糊的情况 2.svg图标在页面render时 速度会比icon稍微快一点 3.实现小程序…

Hightopo 使用心得(3)- 吸附与锚点

吸附与锚点是 HT for Web 中两个比较重要的概念。这两个概念在执行交互和动画时会经常被用到。 吸附,顾名思义,是一个节点吸附到另一个节点上。就像船底的贝类一样,通过吸附到船身,在船移动的时候自己也会跟着移动;而…

研究显示,超过一半的安全领导者对保护应用程序机密缺乏信心

这可能会让人感到意外,但秘密管理已经成为AppSec房间里的大象。虽然像常见漏洞和暴露(cve)这样的安全漏洞经常成为网络安全领域的头条新闻,但秘密管理仍然是一个被忽视的问题,可能会对企业安全产生直接而有影响的后果。 《卫报》最近的一项研…

AUTOSAR通信篇 - CAN网络通信(四:CanSM)

文章目录 简述CAN网络状态机触发器PowerOnCanSM_InitCanSM_DeInitT_START_WAKEUP_SOURCET_STOP_WAKEUP_SOURCET_FULL_COM_MODE_REQUESTT_SILENT_COM_MODE_REQUESTT_NO_COM_MODE_REQUESTT_BUS_OFF 防护条件G_FULL_COM_MODE_REQUESTEDG_SILENT_COM_MODE_REQUESTED 作用E_PRE_NOCO…

Question Log

Question Log 提示:记录一下平常遇到的坑 Question Log(★ > ) Question LogⅠ、★ > 使用VsCode构建Unity开发环境1.环境配置2.遇到的相关问题★.The .NET Core SDK cannot be located: A valid dotnet installation …

【Flutter】Flutter 使用splashscreen包创建启动页面

文章目录 一、 前言二、 什么是启动页面和 splashscreen三、 如何安装和使用 splashscreen四、 详细的代码示例:使用 splashscreen 创建启动页面五、 总结 一、 前言 大家好,今天我们要聊一聊如何在 Flutter 中使用 splashscreen 包来创建一个漂亮的启动…

使用Fiddler模拟网络

Fiddler已经预置提供了模拟Modem速度的选项,其位置位于: Rules->Performances->Simulate Modem Speeds 果你想学习Fiddler抓包工具,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的Fiddler抓包工具教程&#x…

【道友避坑】yolov5视频抽帧构建数据集

写在前面:本篇博客记录了yolov5视频抽帧构建数据集的全过程。 目录 一、 视频材料准备 二、数据集构建 三、运行数据集 一、 视频材料准备 1. 在yolov5-master下创建mydata目录,然后创建video目录和images目录、labels目录 2. 下载一个一两分钟的视频…

数据安全保护:DataSecurity Plus助您防止数据泄露

导言: 在数字化时代,数据安全已成为企业和个人必须高度关注的重要议题。数据泄露可能导致重大损失,包括财务损失、声誉受损以及违反法规的风险。为了帮助组织有效地防止数据泄露,DataSecurity Plus是一款强大的解决方案&#xff…

Android PopupWindow+RecyclerView 实现二级联动筛选

前言 这篇文章主要的功能是利用 PopupWindow 和 RecyclerView 实现条件筛选包括二级联动筛选,主要是仿小红书里的筛选功能而写的一个 Demo 效果如下,代码通俗易懂,保姆级教程 一、使用步骤 1.引入库 api com.github.CymChad:BaseRecycler…

smart Java——BIO、NIO、AIO的工作流程和代码实现

文章目录 〇、前置知识1.套接字2.线程池 一、BIO1.工作流程2.代码实现3.缺点 二、NIO(基于轮训)1.相比于BIO的优化2.工作流程3.代码实现 三、AIO(基于订阅-通知)1.工作流程2.代码实现 参考 〇、前置知识 1.套接字 在计算机网络编…

回溯算法之广度优先遍历

目录 迷宫问题 N叉树的层序遍历 腐烂的橘子 单词接龙 最小基因变化 打开转盘锁 迷宫问题 假设有一个迷宫,里面有障碍物,迷宫用二维矩阵表示,标记为0的地方表示可以通过,标记为1的地方表示障碍物,不能通过。现在给一…

【机器人3】图像雅可比矩阵原理与推导

图像雅可比矩阵原理与推导 理想情况下,图像像素坐标系和图像物理坐标系无倾斜,则二者坐标转换关系如下,且两边求导: [ u v 1 ] [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] (1) \begin{bmatrix}u\\v\\1\end{bmatrix}\begin{b…

C语言-变量

1 内存的分区 1、内存:物理内存、虚拟内存 物理内存:实实在在存在的存储设备 虚拟内存:操作系统虚拟出来的内存。 操作系统会在物理内存和虚拟内存之间做映射。 在32位系统下,每个进程的寻址范围是4G,0x00 00 00 00 ~0xff ff …