当前位置: 首页 > news >正文

【WebGIS】Cesium:GLTF数据加载

在3D Web GIS开发中,使用GLTF格式的模型可以提高应用的加载速度并提升用户体验。Cesium.js是一个强大的3D地理空间引擎,支持GLTF格式的3D模型,并且提供丰富的API来处理和优化模型的加载和渲染。本文将系统地介绍如何加载GLTF模型,包括从网上下载GLTF模型、将其他3D格式转化为GLTF、以及使用Cesium的API进行优化和交互开发。

GLTF格式简介

GLTF(GL Transmission Format)是一种3D模型的文件格式,专为网络传输和渲染优化。它的优势包括:

  • 轻量级:相比其他格式,GLTF更为轻便,适合网络加载。
  • 便于解析:GLTF使用JSON描述模型数据,易于解析和渲染。
  • 支持PBR(Physically-Based Rendering):GLTF支持物理材质渲染效果,适用于真实感渲染。

GLTF有两种主要形式:

  • .gltf: JSON格式的文件,资源(如纹理、几何体)以外部形式引用。
  • .glb: 将所有数据打包在一起的二进制文件,更便于网络传输。

从网上获取GLTF模型

免费GLTF模型资源库

  • Sketchfab(https://sketchfab.com): 提供大量的3D模型,包括GLTF格式。
  • Poly Haven(https://polyhaven.com): 一个高质量的免费3D模型库。
  • Google Poly: 虽然Google Poly已经关闭,但你仍然可以在第三方网站找到备份的模型数据。

下载和使用GLTF模型

在上述平台上,选择你想要的模型,下载GLTF或GLB文件。如果模型不是GLTF格式,则需要通过工具进行格式转换(见下文)。

Cesium中加载GLTF模型

在Cesium中加载GLTF非常简单,Cesium提供了 Cesium.Model.fromGltf 方法,可以加载GLTF文件并将其添加到场景中。以下是一个加载GLTF模型的完整示例。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Cesium 加载 GLTF 模型</title><script src="https://cesium.com/downloads/cesiumjs/releases/1.101/Build/Cesium/Cesium.js"></script><link href="https://cesium.com/downloads/cesiumjs/releases/1.101/Build/Cesium/Widgets/widgets.css" rel="stylesheet"><style>html, body, #cesiumContainer {width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;}</style>
</head>
<body><div id="cesiumContainer"></div><script>// 设置 Cesium Ion 的 Access TokenCesium.Ion.defaultAccessToken = 'your_access_token_here';// 创建 Cesium Viewerconst viewer = new Cesium.Viewer('cesiumContainer', {terrainProvider: Cesium.createWorldTerrain(), // 加载地形数据imageryProvider: Cesium.createOpenStreetMapImageryProvider(), // 设置地图图层scene3DOnly: true, // 仅加载3D场景,优化性能shadows: true, // 开启阴影效果});// 加载GLTF模型const modelPosition = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, 0); // 模型位置(经度,纬度,海拔)const model = viewer.scene.primitives.add(Cesium.Model.fromGltf({url: 'https://example.com/model.gltf',  // GLTF文件的URLmodelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(modelPosition), // 将模型放置于特定位置scale: 10.0,  // 调整模型的大小maximumScale: 20.0,  // 最大缩放比例minimumPixelSize: 50  // 模型最小像素大小}));// 设置相机飞行到模型位置viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, 500) // 设置相机的飞行高度});// 监听模型加载完成事件model.readyPromise.then(function (model) {console.log('GLTF 模型已成功加载!');}).catch(function (error) {console.error('GLTF 模型加载失败:', error);});</script>
</body>
</html>
  • Cesium.Model.fromGltf: 用于加载GLTF模型,url指定GLTF文件的路径,modelMatrix确定模型在地球上的位置。
  • Cesium.Cartesian3.fromDegrees: 将地理坐标转换为笛卡尔坐标。
  • flyTo: 将相机飞行到模型位置,提供直观的展示效果。
  • readyPromise: 用于处理模型加载完成后的事件。

其他格式转化为GLTF

使用Blender转换模型

Blender是一款免费、开源的3D建模工具,可以用于将其他格式的模型(如FBX、OBJ等)转换为GLTF。以下是Blender中进行转换的步骤:

  1. 导入文件:打开Blender,选择 File > Import,选择所需的格式(如OBJ或FBX),然后导入你的模型。
  2. 调整模型:确保模型的纹理、材质等信息正确加载。
  3. 导出GLTF:选择 File > Export > GLTF 2.0,你可以选择导出为 .gltf(分离的JSON和二进制资源)或 .glb(单个二进制文件)。

Blender提供了细粒度的导出设置,如导出动画、纹理等,确保你的模型与Cesium兼容。

在线工具

有些在线工具也可以将常见的3D格式转换为GLTF:

  • Cesium 3D Tiling Pipeline: https://cesium.com/learn/3d-tiling/3d-tiling-pipeline/
  • Online Convert: https://www.online-convert.com/ 可以将OBJ、FBX等格式文件在线转换为GLTF。

优化GLTF模型的加载和渲染

在使用Cesium加载GLTF模型时,性能是一个需要重点考虑的问题,尤其是在加载大规模3D模型时。以下是一些优化技巧:

使用GLB格式

GLB格式是GLTF的二进制版本,它将所有的资源(如几何体、纹理等)打包在一个文件中,可以减少网络请求次数,提升加载速度。

优化模型的几何体

  • 在Blender等3D工具中,减少模型的多边形数量,优化顶点和面片的分布。
  • 使用 “Decimate Modifier” 来降低模型复杂度,同时保持外观质量。

使用Cesium的LOD(Level of Detail)机制

Cesium支持通过多级细节(LOD)来优化大模型的加载和渲染。可以根据相机与模型的距离,动态加载不同分辨率的模型。

model.maximumScale = 20; // 当相机距离很近时,使用最高分辨率
model.minimumPixelSize = 50; // 当相机距离较远时,模型缩小为最小像素大小

为GLTF模型添加交互事件

在Cesium中,可以为GLTF模型添加各种交互事件,如点击、悬停等。下面的示例展示了如何检测用户点击GLTF模型的事件:

// 创建点击事件
viewer.screenSpaceEventHandler.setInputAction(function (movement) {const pickedObject = viewer.scene.pick(movement.position); // 检测点击的对象if (Cesium.defined(pickedObject)) {const model = pickedObject.primitive;alert('你点击了模型!');}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  • scene.pick:

通过用户点击位置,检测场景中哪个对象被选中。

  • primitive: 返回被点击的模型对象,你可以进一步操作该模型。

GLTF模型的动画与多级细节(LOD)

动画效果

GLTF支持骨骼动画和关键帧动画。通过 activeAnimations API,可以播放GLTF模型的动画。

model.readyPromise.then(function (model) {// 添加所有动画model.activeAnimations.addAll();console.log('动画开始播放');
});

使用LOD提升性能

对于大型模型或复杂的场景,使用LOD机制可以提高Cesium的渲染性能。当相机离模型较远时,Cesium会渲染较低分辨率的模型。

总结

通过以上的介绍,你应该已经掌握了如何在Cesium中加载GLTF模型、从其他格式转换为GLTF、优化加载和渲染性能,以及为模型添加交互事件。GLTF作为轻量级的3D模型格式,非常适合在Web GIS应用中使用。配合Cesium的API,可以轻松实现3D模型的高效渲染和互动展示。

相关文章:

【WebGIS】Cesium:GLTF数据加载

在3D Web GIS开发中&#xff0c;使用GLTF格式的模型可以提高应用的加载速度并提升用户体验。Cesium.js是一个强大的3D地理空间引擎&#xff0c;支持GLTF格式的3D模型&#xff0c;并且提供丰富的API来处理和优化模型的加载和渲染。本文将系统地介绍如何加载GLTF模型&#xff0c;…...

【面经】25届 双非本科 字节跳动 北京 四年的总结

点击“硬核王同学”&#xff0c;选择“关注” 福利干货第一时间送达 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作&#xff01; 给大家分享一个25届本科大佬的面经&#xff0c…...

抖去推碰一碰系统技术源码/open SDK转发技术开发

抖去推碰一碰系统技术源码/open SDK转发技术开发 碰一碰智能系统#碰碰卡系统#碰一碰系统#碰一碰系统技术源头开发 碰碰卡智能营销系统开发是一种集成了人工智能和NFC技术的工具&#xff0c;碰碰卡智能营销系统通过整合数据分析、客户关系管理、自动化营销活动、多渠道整合和个…...

goview——vue3+vite——数据大屏配置系统

低代码数据大屏配置系统&#xff1a; 数据来源是可以动态api配置的&#xff1a; 配置上面的api接口后&#xff0c;在数据过滤中进行数据格式的转化。 以上内容&#xff0c;来源于https://gitee.com/dromara/go-view/tree/master-fetch/ 后端代码如下&#xff0c;需要更改…...

中间件xxl-job安装

拉取镜像 docker pull xuxueli/xxl-job-admin:2.4.2 创建xxl-job-admin容器 docker create --name xxl-job-admin -p 9099:8080 -e PARAMS"--spring.datasource.urljdbc:mysql://192.168.96.57:3306/xxl_job2Unicodetrue&characterEncodingUTF-8 --spring.dataso…...

【第2篇】 Python与数据库基础

1. 数据库的基本概念 1.1 表&#xff08;Table&#xff09; 表是数据库中存储数据的基本单位&#xff0c;由行和列组成。例如&#xff1a;users 表可以存储用户信息&#xff0c;每一行代表一个用户&#xff0c;每一列代表用户的属性&#xff08;如姓名、年龄&#xff09;。 …...

CTFHUB-web进阶-php

我们用蚁剑中的这个插件来做这些关卡 一.LD_PRELOAD 发现这里有一句话木马&#xff0c;并且把ant给了我们&#xff0c;我们直接连接蚁剑 右键 选择模式&#xff0c;都可以试一下&#xff0c;这里第一个就可以 点击开始 我们进入到目录&#xff0c;刷新一下&#xff0c;会有一个…...

深度学习使用Anaconda打开Jupyter Notebook编码

新手入门深度学习使用Anaconda打开Jupyter Notebook编码 1. 安装Anaconda 第一种是Anaconda官网下载安装包&#xff0c;但是很慢&#xff0c;不太建议 第二种使用国内清华大学镜像源下载 选择适合自己电脑的版本&#xff0c;支持windows&#xff0c;linux系统 下载完之后自行…...

金蝶V10中间件的使用

目录 环境准备搭建过程配置修改应用部署 环境准备 Linux内核服务器JDK1.8安装包&#xff1a;AAS-V10.zip程序包&#xff1a;***.war 搭建过程 将安装包上传至服务器opt目录下&#xff0c;官方给定的默认服务主目录为“/opt/AAS-V10/ApusicAS/aas/”&#xff1b;解压安装包(解…...

Firewalld 防火墙详解:深入理解与实践指南

在现代网络环境中&#xff0c;防火墙是保护系统和网络不受未授权访问的关键工具。firewalld是Linux系统中广泛使用的动态防火墙管理工具&#xff0c;它提供了强大的功能和灵活的配置选项。本文将深入探讨firewalld防火墙的工作原理、配置和管理&#xff0c;以及如何在实际环境中…...

linux系统编程(五)

1、信号 信号是事件发生时对进程的通知机制&#xff0c;针对每个信号都定义了一个唯一的整数&#xff0c;这些整数定义在signal.h中。 常见信号如下&#xff1a; SIGABRT&#xff1a;进程调用abort函数&#xff0c;系统向进程发送此信号&#xff0c;终止进程并产生核心转储文…...

Effective C++ 条款 16:成对使用 `new` 和 `delete` 时要采取相同形式

文章目录 条款 16&#xff1a;成对使用 new 和 delete 时要采取相同形式核心思想示例代码错误用法分析设计建议总结 条款 16&#xff1a;成对使用 new 和 delete 时要采取相同形式 核心思想 一致性要求 当使用 new 分配内存时&#xff0c;必须在相应的 delete 操作中保持一致&a…...

【HarmonyOS NEXT】鸿蒙原生应用“上述”

鸿蒙原生应用“上述”已上架华为应用市场&#xff0c;欢迎升级了鸿蒙NEXT系统的用户下载体验&#xff0c;用原生更流畅。 个人CSDN鸿蒙专栏欢迎订阅&#xff1a;https://blog.csdn.net/weixin_44640245/category_12536933.html?fromshareblogcolumn&sharetypeblogcolumn&a…...

【人工智能】使用Python构建推荐系统:从协同过滤到深度学习

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 推荐系统是现代互联网的重要组成部分,广泛应用于电商、社交媒体和流媒体平台中。本文详细介绍了如何使用Python构建推荐系统,从传统的协同…...

店铺营业状态设置

admineShopController RestController("admineShopController") RequestMapping("/admin/shop") Api(tags "店铺相关接口") Slf4j public class ShopController {//设置一个常量 因为经常使用public static final String KEY "SHOP-ST…...

batchnorm和layernorm的理解

batchnorm和layernorm原理和区别 batchnorm 原理 对于一个特征tensor x ∈ R b c f 1 f 2 … x \in \mathbb{R}^{b \times c \times f_1 \times f_2 \times \dots} x∈Rbcf1​f2​… 其中&#xff0c; c c c是通道&#xff0c; f f f是通道中各种特征&#xff0c;batchno…...

在git commit之前让其自动执行一次git pull命令

文章目录 背景原因编写脚本测试效果 背景原因 有时候可以看到项目的git 提交日志里好多 Merge branch ‘master’ of …记录。这些记录是怎么产生的呢&#xff1f; 是因为在本地操作 git add . 、 git commit -m "xxxxx"时&#xff0c;没有提前进行git pull操作&…...

【Rust自学】6.3. 控制流运算符-match

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 6.3.1. 什么是match match允许一个值与一系列模式进行匹配&#xff0c;并执行匹配的模式对应的代码。模式可以是字面值、变量名、通配符等…...

大模型应用技术系列(三): 深入理解大模型应用中的Cache:GPTCache

前言 无论在什么技术栈中,缓存都是比较重要的一部分。在大模型技术栈中,缓存存在于技术栈中的不同层次。本文将主要聚焦于技术栈中应用层和底层基座之间中间件层的缓存(个人定位),以开源项目GPTCache(LLM的语义缓存)为例,深入讲解这部分缓存的结构和关键实现。 完整技术…...

『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释

评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释 文章目录 一. ELO Rating大模型的elo得分如何理解1. Elo评分的基本原理2. 示例说明3. 大模型中的Elo得分总结3个模型之间如何比较计算,给出示例进行解释1. 基本原理扩展到三方2. 示例计算第一场: A A…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...