[深入研究]什么是G3D几何交换格式?
在VIM AEC中,我们处理非常大的建筑模型,并将网格和BIM数据导入游戏引擎(例如Unity),3D编辑工具(例如3ds Max)和在不同设备上运行的应用程序(例如Magic Leap)。
当使用FBX作为表示大网格的格式时,将近四分钟的时间在Unity中导入2800万个多边形模型。 作为替代方案,我们开发了一种表示3D几何图形的开放格式,称为G3D ,可将导入时间减少到不到6秒。
总览
G3D格式可以表示三角形和四边形网格,点云,线段和多边形网格,以及与网格的不同子元素(顶点,面)关联的任意属性(例如法线,UV,颜色,平滑组等) ,面角,多边形组或整个对象)。
与使用Assimp模型导入库或导入Unity来读取OBJ,FBX或PLY文件相比,我们的G3D加载器在我们的测试中要快一个数量级。 规范和参考实现也比其他二进制格式(例如glTF)简单得多,同时支持更广泛的数据属性。
在G3D Github存储库上,我们使用.NET Standard 2.0(使其跨平台)和Unity测试项目(用于导入和导出G3D网格)在C#中提供参考实现。 我们还发布了Nuget软件包 ,可在生产代码中使用它。
动机
用于表示3D几何形状的常见数据格式(例如OBJ,FBX,Collada,glTF等)通常具有一个或多个缺点:
- 糟糕的序列化和反序列化性能
- 平台或语言特定
- 缺乏可扩展性
- 实施复杂
- 对存储的属性的数量和类型的限制
我们的目标是设计一种格式,使我们能够快速轻松地将导入器和导出器实现为不同编辑工具,游戏引擎以及在从台式机到WebGL到Magic Leap等空间计算设备的不同平台上运行的应用程序的插件。
我们还希望这种格式能够传输来自不同来源的各种数据而不会丢失。
G3D怎么这么快?
G3D格式之所以如此之快,是因为它不必在将数据转换为可渲染的,GPU友好的状态之前对其进行预处理。
基于文本的网格格式,例如OBJ,PLY,Collada等,要求计算机花费大量时间从文本表示转换为转换器可使用的二进制表示。
类似地,对于某些二进制格式,例如FBX,网格顶点数据被组织为4个双精度浮点值的向量。 大多数渲染上下文期望将顶点位置数据编码为3个单精度浮点的矢量,这意味着需要预处理步骤来截断数据并将其打包为更方便的格式。
G3D数据缓冲区严格对齐,因此,一旦将整个文件加载到内存中,即可将各个数据缓冲区按原样传递给GPU,而无需进行其他处理或分配内存。
3D网格入门
通常,3D网格由一系列空间点(称为顶点)和一系列面组成,这些面指定了如何连接这些点以在3维空间中形成多面表面。
维基百科的图片由RChoetzlien根据CC-SA-3.0 许可
点列表通常称为顶点缓冲区,而面列表则表示为索引缓冲区。 如果每个面的大小是固定的(例如,对于三角形,则为3,对于四边形,则为4),则每N个索引是不同面的角的顶点的索引。 有了这个观察结果,自然就会得出点云和线段是面的退化情况,每个面分别只有一个或两个点。 支持混合尺寸多边形的网格可以使用附加数据数组对每个面的大小进行编码。
边缘
有两种类型的边需要考虑:无向边和有向边(也称为半边)。 在G3D中,就像在3ds Max中一样,边指的是半边。
之所以这样称呼半边,是因为两个相邻的面都有一个有向的半边,这两个边共享相同的顶点,但是沿不同的方向流动,从而完成了将两个面分开的完整边。 枚举半边线比较简单,因为每个面都有N个半边线,其中N =面中的点数。 因此,半边索引缓冲区与索引缓冲区完全相同。
曲面或多边形组
一个表面或多边形组是构成一个连续表面的一系列连续表面。 通常,此表面将共享一种通用材料。 考虑到圆柱体的情况,弯曲部分可以看作是一个曲面,而端盖是两个表面。
具有多边形组可以实现更紧凑的数据表示(例如,每个组可以有一个共享的材质ID,或者在平面情况下可以有一个共享的法线)。 多边形组还可以用于对Unity或Revit API Face中的 “子网格”数据进行编码。
属性
G3D网格格式基于将几何表示为一组严格对齐的二进制数组(称为属性)的集合。 属性是与顶点,面角,面或多边形组关联的标量或向量的数组。 在某些情况下,属性是与整个对象关联的单个值。 属性的一些常见示例包括:
- 顶点颜色
- 紫外线坐标
- 面或顶点法线
- 平滑组ID
- 物料编号
- 每个顶点数据(例如,软选择或折痕权重)
- 边缘可见度
- 切线和双法线
属性描述符字符串
G3D中的每个属性都与一个描述符关联,该描述符以以下格式编码为字符串:
g3d: < association > : < semantic > : < data_type > : < data_arity >
描述符包含以下组件:
- 关联-点,角,边,面,组,所有
- 基本数据类型-int8,int16,int32,int64,float32,float64
- arity —每个数据元素的原语数
- 语义-定义属性角色或目的的标识符
多个属性可以共享同一描述符字符串,例如存储在Unity网格中的多个UV通道。
实施细节
G3D文件的基础二进制布局符合BFAST序列化格式 ,即用于序列化命名字节数组集合的简单有效的开放二进制格式。 (请参阅有关Hackernoon的文章 )
BFAST容器中的第一个命名缓冲区保留用于有关以JSON格式编码的文件的元信息。 它的名称为“元”。 对于元JSON对象中编码的数据,目前没有任何限制或要求。
随后的每个数据缓冲区都存储属性数据,并使用属性描述符字符串作为名称。 根据BFAST规范,属性数据存储在64字节对齐的数据缓冲区中。
语义的
属性还具有“语义”标签,用于标识属性对呈现或处理的作用。 应用程序可以使用它选择的任何字符串来表示语义,但是G3D规范建议使用许多具有预定义含义的语义(有关完整列表,请参见Github readme.md )。 这旨在使不同的应用程序能够以通用方式交换,处理和呈现G3D数据。
进一步阅读
如果您对理解导致G3D格式的设计决策感兴趣,那么最好阅读一下如何设计其他网格表示形式:
- Assimp Mesh类文档
- FBX Mesh类文档
- 3ds Max Mesh类文档
- GLTF规格
- Paul Bourke的图形数据格式参考集
最后的话
在VIM AEC,我们非常希望帮助其他人采用G3D格式,因为我们相信它可以帮助提高每个人的图形软件的质量。 请通过电子邮件或Github问题与我联系,以提出问题或提出建议。
免责声明 :我在VIM AEC担任研究主管 。
From: https://hackernoon.com/the-g3d-geometry-exchange-format-pz81b30qx
[深入研究]什么是G3D几何交换格式?相关推荐
- 3d几何图形为什么会有茶壶_[深入研究]什么是G3D几何交换格式?
3d几何图形为什么会有茶壶 在VIM AEC中,我们处理非常大的建筑模型,并将网格和BIM数据导入游戏引擎(例如Unity),3D编辑工具(例如3ds Max)和在不同设备上运行的应用程序(例如Mag ...
- VCT空间数据交换格式数据的检测方法研究
摘要:国土资源信大量的是空间地理信息,由于现买中各GIS系统存储.管理GIS数据的格式各不相同,空间数据交换标准是实现GIS数据共享的必要途径,国土资源部制定了VCT矢量数据交换格式来实现各类国土资源 ...
- java调用onnx模型_开源一年多的模型交换格式ONNX,已经一统框架江湖了?
原标题:开源一年多的模型交换格式ONNX,已经一统框架江湖了? 机器之心原创 作者:思源 近日,微软亚洲研究院和华为举办了 ONNX 合作伙伴研讨会,这是 ONNX 开源社区成立以来首次在中国举办的活 ...
- 地球空间数据交换格式
×××国家标准地球空间数据交换格式 Geo-spatial data transfer format<?xml:namespace prefix = o ns = "urn:schem ...
- 常用的数据交换格式有哪些_Linux后台开发6大常用的开源库,让你在同行中脱颖而出...
后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥 ...
- XML和JSON 数据交换格式
为什么80%的码农都做不了架构师?>>> 一.什么是数据交换格式? 客户端与服务器常用数据交换格式xml.json.html 二.数据交换格式应用场景 移动端(安卓.IOS)通 ...
- 数据交换格式Json与XML
什么是数据交换格式: 主流的有Json.XML.HTML. 数据交换格式的应用场景: 移动端(安卓,IOS)通讯方式采用http协议+Json格式的restful风格. 很多互联网公司都是用Http协 ...
- XML和JSON两种数据交换格式的比较
目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生: 相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你 ...
- JSON——IT技术人员都必须要了解的一种数据交换格式
JSON作为目前Web主流的数据交换格式,是每个IT技术人员都必须要了解的一种数据交换格式.尤其是在Ajax和REST技术的大行其道的当今,JSON无疑成为了数据交换格式的首选! 今天大家就和猪哥一起 ...
最新文章
- C++的类型萃取技术
- C++学习成长的四个层次
- PHP 接口开发注意事项
- PHP面试题:PHP.ini路径?
- Android开发之Mac配置环境变量
- IDEA:com.intellij.execution.ExecutionException: not found for the web module.
- Redhat linux 5.3 基于bond的heartbeat
- 开源 | 高颜值神经网络可视化工具
- XMLHttpRequestEventTarget
- AI 理财顾问靠谱吗?蚂蚁支小宝是这样做的
- 2019windows上安装Mac OS 10.14过程详细截图
- A Beginner's Guide To Understanding Convolutional Neural Networks Part One (CNN)笔记
- 全是干货:MBR分区结构以及GPT分区结构
- 基于Python向Abaqus导入txt、dat数据(附abaqus中python二次开发课程)
- 深入理解“智慧城市”
- linux进入终端tty3,Linux中终端界面与图形界面之间的切换关系
- Linux下 文件或文件夹的复制(拷贝 cp)
- 自考招生工商学院类网站织梦模板
- 数显之家快讯:「SHIO世硕心语」改变你的人生格局,2021年你应当做这三件事!
- 基于Android的学生信息管理大作业