我正在阅读一本有关计算机图形学的书,从某种程度上讲,它显示了一个由.dat文件创建的3D模型。

以下是.dat文件创建的一些规则:


由顶点位置/面组成的列表
逆时针编写
以点(。)结尾的面
分形也是可接受的

我想知道这是否是标准,如果不是,那么定义3D对象的标准方法是什么。

此外,如果有规范,谁来定义它以及在哪里找到它?

#1 楼

在谈论文件格式时,我们谈论的是持久化一些与3D模型/几何相关的数据。对于持久性3D几何图形,文件格式没有通用标准。只有少数几种格式比其他格式更具优势。

与图像文件格式一样,PNG和JPEG是当今最常见的格式,但是在应用程序之间并没有达成共识使用一个或另一个。每个应用程序都根据其目的使用最合适的文件。

存储3D数据的文件格式也是如此。每个3D建模软件通常将具有一个或一组首选格式。实际上,大多数定义自定义格式仅适用于该工具的特定版本。发生这种情况的原因有很多,从简化应用程序的内部工作或加快文件加载到故意将用户绑定到给定工具。

您描述的这种.dat格式是自定义的本书作者创建的格式,其设计可能考虑了简单性。它似乎是一个类似于Wavefront OBJ格式的文本文件,它反过来又是一种非常流行的用于存储静态几何图形的格式,尽管现在已经有些过时了。可以说.OBJ格式就是3D模型格式的.BMP

其他流行的3D模型格式包括:


Collada格式。
3DS格式。
PLY格式。

还有其他许多格式。

还要注意,我在开始时曾说过,这些是用于在离线存储中存储/持久保存3D模型或几何图形的格式。这并不意味着(通常不是这种情况)使用它们的应用程序将使用与文件相同的布局将数据内部存储在内存中。通常,从文件加载此类数据后,直到将其显示在屏幕上为止,此类数据都会经过大量处理。

评论


$ \ begingroup $
“通常,从文件加载此类数据后,直到将其显示在屏幕上为止,此类数据都会经过大量处理。”就像图像先转换为像素阵列,然后再推入屏幕,无论原始格式是什么。 (尽管有硬件压缩)
$ \ endgroup $
–棘轮怪胎
15年8月11日在9:04

$ \ begingroup $
@ratchetfreak,但并非所有3D格式的使用都最终出现在屏幕上。
$ \ endgroup $
– joojaa
16年8月28日在20:59

$ \ begingroup $
BMP是二进制格式,不是OBJ的不错选择。更好的匹配是XPM,这是文本。
$ \ endgroup $
–俄罗斯
18年7月9日在19:50



#2 楼

3D模型没有标准格式。 glampert的答案中列出了一些常见的格式,在SE答案中可以找到更多的格式。

如果您是出于自己的目的设计自己的格式,(实际上是一件很普通的事情)很好的第一步,以了解如何使用模型数据。例如,如果您专注于渲染,则可以使用图形库期望的格式。如果您想尽可能减少软件的加载时间,那么减少您必须执行的解析和处理量会有所帮助。一个简单的实用程序可以按照引擎期望的格式输出文件,这意味着您可以简单地将文件映射到内存中,然后将指针传递到图形库中。

另一方面,如果进行渲染不是您的主要关注点,而编辑对您而言更重要,那么您可能会考虑更适合于编辑的格式,例如有翼边。在项目开始时使用通用模型格式可能适合您的目的,但是最终3D模型可以做很多事情,每种格式都有其优点和缺点,因此您可以选择最适合自己的格式。

#3 楼

没有定义3D模型存储的单一标准。图形API只关心三角形,三角形由顶点和索引定义,并指示哪些顶点形成三角形。

许多公司创建了具有不同功能和目标的自己的模型格式。最简单的一种就是.obj(Wavefront Object)格式。其中包含顶点位置,法线和纹理坐标的列表以及组成三角形的索引的列表。它还包含具有一些基本属性的材料,例如纹理,漫反射和镜面反射颜色。

更高级的模型格式,例如Autodesk使用的.fbx(FilmBox)包含建模软件所需的其他信息。这些可能包括骨骼,层次结构以及甚至更多的用于蒙皮的顶点属性。因此存在“标准”,但是它们并不是真正统一的,因为每个程序可能需要不同的信息。但是wavefront是一个很好的选择,因为许多建模应用程序都可以导出到它,并且很容易为它编写(找到)一个导入器。

#4 楼

正如其他答案所提到的,存储3D数据有多种竞争格式。

但是,自从提出此问题以来,出现了一种特定的格式,它具有您希望从“标准”格式中获得的许多特征。 :glTF格式。


glTF是Khronos Group(OpenGL和Vulkan背后的组织)发布的3D标准,旨在弥补Collada中的缺陷。 >
它的主要优点是:


它是基于JSON的,因此非常易于解析,序列化,读取和通过网络发送。
有标准中几乎没有歧义或冗余(尽管有一些*)。单位,惯性,纹理坐标标志等均已标准化;一切总是基于索引的,这意味着没有数据冗余。这使编写导入程序非常容易。
文档非常整洁和详尽。
数据的布局基于OpenGL / WebGL工作流,这意味着导入的模型可以像在引擎数据很少。
标准是开放源代码,该规范托管在Github上。这意味着该标准将始终可用,免费使用,并且开发过程对所有人可见。反对者认为,封闭源代码标准的未来是由私人利益决定的,这是固有的危险。
glTF得到许多行业巨头的支持,例如Khronos(Adobe,Google,Microsoft,Mozilla,Unity);它可以由Blender导出(从官方不支持从Maya导出),也可以由Unreal,Unity和Godot导入。

另请参见:


官方glTF概述
为什么我们应该使用Godot Engine团队的glTF 2.0

*我很确定可变手性切线毫无意义。

#5 楼

为了增加其他答案,实际上有两种格式,中间格式和运行时格式。中间格式(例如:COLLADA)较为冗长/较慢,并且最终在工具之间转换为针对特定应用程序/硬件进行了优化的自定义运行时格式。不太在乎性能的简单应用程序可以直接使用中间格式。