如何将 OBJ 模型转换和压缩为 GLTF 以与 AWS IoT TwinMaker 配合使用

news2024/11/17 21:24:44

推荐:使用NSDT场景编辑器快速搭建3D应用场景

概述

在这篇博文中,引用了几种文件扩展名和模型格式。在开始之前,最好了解以下内容:

  • OBJ – 对象文件,一种标准的 3D 图像格式,可以通过各种 3D 图像编辑程序导出和打开。
  • MTL – 材料库文件,包含一个或多个材料定义,每个定义都包括 OBJ 模型中对象的各个材料的颜色、纹理和反射图
  • glTF – 图形语言传输格式,三维场景和模型的标准文件格式。glTF 模型使用两种可能的文件扩展名之一:.gltf 或 .glb
  • Draco Compression – 用于网格压缩的glTF扩展。此cesium库将压缩和解压缩 3D 网格,以显着减小 3D 内容的大小。它可以压缩顶点位置、法线、颜色、纹理坐标和任何其他通用顶点属性,从而提高通过 Web 传输 3D 内容的效率和速度。
  • 点云扫描 – 3D 空间内单个点(x、y、z 坐标)的大量集合,使用 3D 激光扫描仪捕获并以 ASCII (.xyz) 或二进制格式存储。

AWS IoT TwinMaker 支持 glTF 格式的 3D 资产,这是一种 3D 文件格式,以 JSON 格式或二进制格式存储 3D 模型信息,可在应用程序中高效传输和加载 3D 模型。glTF 模型最大限度地减少了 3D 资产的大小以及解压缩和使用它们所需的运行时处理。来自传统 CAD 应用程序的 3D 模型以及点云扫描可以使用 AWS 合作伙伴解决方案(例如 Pixyz 的解决方案)转换为 glTF。在这篇博客中,您将探索另一种无服务器方法,使用 Cesium 的开源库(包括 obj2gltf 和 gltf-pipeline)将 Matterpak 捆绑包转换为glTF 模型。

在下面的架构中,您将看到如何使用 AWS Lambda 来检测上传到 Amazon S3 存储桶的 Matterpak zip 捆绑包。这将在长时间运行的 Lambda 执行中触发到 glTF 的转换。压缩文件可能包含 OBJ、MTL 和 JPG 文件。

在Matterpak捆绑包中,有几个文件,包括OBJ,MTL,点云扫描(xyz),可能还有许多JPG文件。本例中的 Matterport 已将点云扫描转换为对象网格格式 OBJ。MTL 和 JPG 文件一起在 OBJ 模型中的对象上提供彩色纹理。xyz 文件将不会在此转换过程中使用,因为它已经在 Matterpak 中转换为 OBJ。

模型转换管道体系结构

使用点云扫描(如 Matterport)时,会在整个扫描过程中捕获高分辨率 JPG 纹理。将 OBJ 转换为 glTF 仍然会很大。为了改善这一点,本博客中的 Lambda 函数将首先压缩所有 JPG 图像,然后再转换为 glTF。此外,该模型将通过使用Draco Compression进一步压缩。因此,转换将生成一个小得多的 glTF 模型,如下面的 AWS IoT TwinMaker 场景所示。请注意,glTF 文件使用两种可能的文件扩展名之一:.gltf 或 .glb。glTF 扩展将在此博客中使用。

AWS IoT TwinMaker 中的 Matterport Scan 示例

先决条件

需要 AWS 账户才能设置和执行本博客中的步骤。AWS Cloudformation 模板将配置并安装必要的 AWS Lambda 函数、IAM 角色和 Amazon S3 存储桶。建议您在弗吉尼亚州地区(us-east-1)工作。您可能会因以下某些服务而产生费用:

  • Amazon Simple Storage Service (S3) 存储成本
  • AWS Lambda 模型转换函数

步骤

下载马特帕克样本包

下载其中一个 Matterpak 捆绑包。选择其中一个捆绑包,例如 Pro2。此可用的捆绑包列表可能会更改。Pro2 示例捆绑包的近似文件大小为 178MB。

安装模型转换 Lambda 函数

  1. 下载示例 Lambda 模型转换部署程序包。此包中的函数代码将执行以下操作:
    – 从 S3 下载 Matterpak 捆绑包 – 提取到 Lambda /tmp 目录
    – 压缩所有 JPG 图像
    – 将 OBJ 文件转换为 glTF – 将 glTF 转换为 Draco glTF


    – 将 Draco glTF 模型上传回 S3 存储桶。
  2. 登录亚马逊 S3 控制台
  3. 创建一个 S3 存储桶或选择一个现有存储桶,您将在其中上传您下载的 Lambda 函数。将文件保持原样压缩。
  4. 将 Lambda 函数放置在 S3 中后,启动此 CloudFormation 模板
  5. 将 LambdaArtifactBucketName 参数值更改为您将 Lambda 函数上传到的存储桶的名称
  6. 将 S3BucketName 参数值更改为将托管模型文件的新存储桶的名称。这将为您创建。请务必选择一个全局唯一的名称,否则它将在创建堆栈期间失败。
  7. 单击创建堆栈以设置模型转换管道
  8. 完成后,导航到新的 S3 存储桶。可以在“资源”选项卡下找到一个链接

9.在此存储桶中创建一个文件夹并将其命名为 paks

10.将步骤 1 中下载的 Matterpak 捆绑包上传到 paks 文件夹。请务必将其压缩,因为 Lambda 函数将在处理过程中解压缩它。转换过程将自动开始,可能需要几分钟。

11.如果模型转换成功,您将在 S3 存储桶的根目录中看到一个glTF 模型。如果没有,请检查 Amazon CloudWatch 以获取来自 Lambda 函数的任何日志。

将模型添加到场景(可选)

回顾一下,您已成功将 Matterport 近 180MB 的点云扫描压缩并转换为 8MB glTF 模型。转换模型后,可以尝试在 IoT TwinMaker 工作区中加载此模型。请注意,您在 Matterport 中创建的任何 Mattertag 在此过程中都不可转让。这必须使用场景编辑器中的 IoT TwinMaker 标记重新创建。

  1. 在 IoT TwinMaker 工作区中,在“资源”部分中上传 glTF 模型。如果您尚未创建工作区,请按照 AWS IoT TwinMaker 入门中的步骤操作。

  1. 将此模型添加到场景中,如果尚不存在,则创建一个模型。如果需要有关此过程的指导,可在此处获取文档。不要忘记设置环境照明,因为模型将显示为全黑。

清理

请务必清理此博客中的工作以避免收费。按此顺序完成后删除以下资源

  1. 删除 Lambda 和模型 S3 存储桶中的对象文件。请注意,这不是 IoT TwinMaker 工作区存储桶,而是为此博客创建的存储桶
  2. 删除 CloudFormation 堆栈
  3. 从 TwinMaker 工作区中删除模型

结论

在此博客中,你创建了一个模型转换管道,用于压缩 Matterpak 捆绑包并将其转换为glTF 模型。这也包括从其他系统进行 OBJ 的通用转换。使用此管道,你将能够减少场景加载时间,并简化直接到 IoT TwinMaker 工作区的 3D 模型更新。

原文链接:如何将 OBJ 模型转换和压缩为 GLTF 以与 AWS IoT TwinMaker 配合使用 (mvrlink.com)

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

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

相关文章

在springboot下将mybatis升级为mybatis-plus

在springboot下将mybatis升级为mybatis-plus 1. 整体描述2. 具体步骤2.1 更新pom引用2.2 更新yml配置2.3 更新config配置2.4 BaseEntity修改 3. 程序启动4. 总结 1. 整体描述 之前项目工程用的是mybatis,现在需要将其替换为mybatis-plus,mybatis-plus的…

实用技巧:Linux上实现OpenGauss数据库远程连接,方便的跨网络数据操作

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 🍁 小结 🍁 前言 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许…

解决WIN11笔记本Type-C转DP线外接显示器重启开机没信号无法识别需再次插拔问题

在最新的WIN11系统中,你如果使用Type-C转DP线外接显示器,每次开机的时候或许会出现显示器没有信号的问题。这是因为你的显示器和转接线作为USB外设进入休眠了,导致需要再次插拔才能识别出来,不仅麻烦而且一次次插拔转接线是有磨损…

微信管理系统自动添加好友功能

你是否有这样的困扰,为什么你在添加多个好友的时候,容易添加频繁。你要先知道底层的规则是怎么样的,才能尽可能的去避免添加频繁,加到更多的好友。 微信主动添加好友的规则: ①通过附近人功能加人上限15人/天&#xf…

评价指标和超参数调整进阶

文章目录 查准率 查全率 F1 scoreGridSearchCV概述score参数的修改 classification report 目标: 综合考虑查准率和查全率,来确定最佳模型参数。 查准率 查全率 F1 score https://blog.csdn.net/qq_47180202/article/details/119780943 from sklea…

嵌入式学习笔记(31)异常向量表的编程处理

6.5.1像内存一样去访问异常向量表 (1)S5PV210的异常向量表可以改变(在CP15协处理器中),以适应操作系统的需求。但是目前系统刚启动,此时DRAM尚未初始化,程序哦都市在iSRAM中运行。210在iSRAM中…

分享一个springboot+uniapp基于微信小程序的校医务室健康服务系统源码 lw 调试

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

笔记(二)图的基本表示【斯坦福CS224W图机器学习】

1、基础知识 图是由节点和连接组成的 本体图,具体图是本体图的实例化,取决于想要解决什么问题 2、图的种类 异质图 异质图-二分图 异质图-二分图-展开 3、节点连接数 节点的度、入度和出度 4、图的基本表示 邻接矩阵 无向图的邻接矩阵是对称阵&#…

Linux_dup、dup2函数

1.dup1 #include <unistd.h> int dup(int oldfd); 作用&#xff1a;复制一个新的文件描述符 从空闲的文件描述符表中&#xff0c;找一个最小的&#xff0c;作为新的拷贝的文件描述符 指向的文件和旧的文件描述符是一样的 int dup2(int oldfd, int newfd); #include <…

任意文件下载

原理&#xff1a; 文件查看或文件下载功能&#xff0c;不做限制&#xff0c;恶意用户就能够查看或下载任意敏感文件&#xff0c;这就是文件查看与下载漏洞。 一般链接形式: download.php?path down.php?file data.php?file download.php?filename 或者包含参数: &Sr…

python基础开发篇3——线上环境部署Django项目

文章目录 一、基本了解二、打包本地项目三、服务器环境准备四、安装web服务4.1 使用uwsgi代理4.2 使用nginx代理&#xff08;推荐&#xff09; 五、部署daphne 一、基本了解 部署思路&#xff1a; Nginx服务接收浏览器的动态请求&#xff0c;再通过uwsgi模块将请求转发给uwsgi服…

计算机网络(二):TCP篇

文章目录 1. TCP头部包含哪些内容&#xff1f;2. 为什么需要 TCP 协议&#xff1f; TCP 工作在哪一层&#xff1f;3. 什么是 TCP &#xff1f;4. 什么是 TCP 连接&#xff1f;5. 如何唯一确定一个 TCP 连接呢&#xff1f;6. UDP头部大小是多少&#xff1f;包含哪些内容&#xf…

基于SSM+Vue的鲸落文化线上体验馆设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【NVM】nvm安装教程(nodejs多版本切换)

系列文章 C#底层库–记录日志帮助类 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/124187709 文章目录 系列文章前言一、安装准备1. 1 下载nvm-setup1. 2 卸载掉nodejs 二、安装步骤2.1 欢迎页面2.2 选择nvm安装目录2.3 选择nodejs安装目录2.4 安装…

进程间通信--信号

1&#xff1a;信号 什么是信号&#xff1f; 信号是给程序提供一种可以处理异步事件的方法&#xff0c;它利用软件中断来实现。不能自定义信号&#xff0c;所有信号都是系统预定义的。 信号由谁产生&#xff1f; 1)由shell终端根据当前发生的错误&#xff08;段错误、非法指令…

途虎养车IPO:飞轮效应下的汽车后市场巨头

汽车已经成为了家家户户必不可少的存在。作为消费品来说&#xff0c;汽车更新换代快&#xff0c;日常使用磨损大&#xff0c;随着智能汽车和新能源汽车市场的不断扩大&#xff0c;也给汽车售后服务产线带来了巨大的发展市场。保养以及维修市场的缺口越来越大&#xff0c;也为汽…

简明 SQL 子查询指南:掌握 EXISTS 实现数据筛选

子查询是一种在查询语句内部嵌套另一个完整查询的方式&#xff0c;用于获取更复杂的查询结果或数据过滤。在执行包含子查询的查询时&#xff0c;数据库引擎首先执行子查询&#xff0c;然后将其结果用作外层查询的条件或数据源。 以下两表作为后续SQL语句所用 table1 …

Jmeter系列-并发线程Concurrency Thread Group的介绍(7)

简介 Concurrency Thread Group提供了用于配置多个线程计划的简化方法&#xff0c;该线程组目的是为了保持并发水平&#xff0c;意味着如果并发线程不够&#xff0c;则在运行线程中启动额外的线程Concurrency Thread Group提供了更好的用户行为模拟&#xff0c;因为它使您可以…

AeDet:方位不变的多视图3D物体检测

代码&#xff1a;https://github.com/fcjian/AeDet 项目地址&#xff1a;https://fcjian.github.io/aedet/ 导读&动机 本篇论文探讨了自动驾驶领域中的多视图3D目标检测问题&#xff0c;特别关注了LSS&#xff08;Lift-Splat-Shoot&#xff09;方法的发展&#xff0c;该方法…

模拟实现C语言--strcat函数

模拟实现C语言–strcat函数 文章目录 模拟实现C语言--strcat函数一、strcat函数是什么&#xff1f;二、使用示例二、模拟实现 一、strcat函数是什么&#xff1f; 作用是把源数据追加到目标空间 char * strcat ( char * destination, const char * source );源字符串必须以 ‘…