用于在python中解析、创建和转换gltf 2.0文件的库。

gltflib的Python项目详细描述


gltflib

用于在python 3.6+中解析、创建和转换gltf 2.0文件的库。

概述

此库旨在以相当低的级别使用gltf 2.0,这意味着您 负责自己管理实际的几何数据。这个库便于保存 将此数据转换为格式正确的gltf/glb文件。它也有助于转换资源 在gltf/glb文件内部,外部文件或web url、数据url和嵌入glb之间 资源。

安装

此库可以使用pip安装:

pip install gltflib

用法

下面的示例演示如何将此库用于几个示例场景。这个 示例模型来自此处提供的khronos gltf示例模型库:

https://github.com/khronosgroup/gltf示例模型

分析GLTF 2.0模型

加载GLTF 2.0模型:

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')

静态方法支持同时加载基于json的.gltf格式。 作为二进制.glb格式。文件的类型将根据文件名确定 延伸。或者,可以使用gltf.load_gltf(filename)gltf.load_glb(filename)

加载后,可以通过访问模型属性来检查模型结构:

print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...

您还可以检查各种模型属性:

print(gltf.model.buffers[0].uri)# BoxTextured0.bin

gltf 2.0模型可能包含资源,例如顶点几何体或图像纹理。这些 资源可以作为模型文件的一部分嵌入,或者(与上面的示例一样)是 作为外部文件资源引用。

在这两种情况下,都会将资源与模型结构一起解析为资源 加载模型后的属性:

print(gltf.resources)# [FileResource(CesiumLogoFlat.png), FileResource(BoxTextured0.bin)]

注意,默认情况下,这些外部文件资源的实际内容是而不是加载的 加载模型时。您可以用两种方法之一将资源加载到内存中。单程 是调用资源上的load()方法:

resource=gltf.resources[0]resource.load()# Assumes resource is a FileResource

另一种方法是在调用gltf.load()时传递加载文件资源标志:

gltf=GLTF.load(filename,load_file_resources=True)

在这两种情况下,现在都可以通过data属性访问文件资源数据:

print(resource.data)# b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\...

二进制glb文件中的嵌入资源也被解析到资源列表中,但是 它们的类型将是glbresource而不是fileresource

glb=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF-Binary/BoxTextured.glb')print(glb.resources)# [<gltflib.gltf_resource.GLBResource object at 0x7f03db7c1400>]

对于嵌入式资源,内容会自动解析到内存中。二进制数据 可使用数据属性进行访问:

pip install gltflib
0

导出GLTF 2.0模型

要导出模型,请调用gltf类中的gltf.export()实例方法。

下面的示例在内存中创建一个简单的gltf 2.0模式(由一个 然后将其导出为名为triangle.gltf的gltf文件(以及 名为vertices.bin的外部文件资源:

pip install gltflib
1

load一样,export方法根据文件扩展名推断格式 (.gltfvs.glb)。但是,您也可以调用export_gltfexport_glb手动 强制格式化。

在上面的示例中,导出将生成两个文件:triangle.gltfvertices.bin。 但是,可以通过设置 调用导出时将"保存文件"资源标记为false

pip install gltflib
2

要将模型导出为二进制glb,只需在调用 导出,或使用导出glb

pip install gltflib
3

请注意,当导出为glb时,默认情况下所有资源都将嵌入(即使 它们被实例化为一个文件资源。这我一般来说,当 另存为GLB。

但是,在导出时,可以强制部分或全部资源保持外部状态 GLB为此,必须调用export_glb(而不是export),并设置 嵌入缓冲区资源嵌入图像资源(或两者)到false

pip install gltflib
4

在这种情况下,还需要确保关联的缓冲区仍然具有 适当的uri设置在模型中:

pip install gltflib
5

模型将作为二进制glb导出,但具有外部文件资源。这些 默认情况下,导出模型时将保存文件资源。然而,它也是 通过设置保存文件资源可以绕过保存外部文件资源 当调用export glb时false

pip install gltflib
6

在gltf和glb之间转换

要将gltf模型转换为glb,只需加载它并使用glb扩展名导出它:

pip install gltflib
7

这将自动将所有外部文件资源转换为嵌入式glb 资源。

反向转换也是可能的,尽管有一些注意事项。因为一个非二进制 gltf模型可能没有嵌入的二进制数据,必须首先转换glbresource 到其他资源类型。下面关于资源的部分将详细介绍, 但这里有一个简单的示例,其中glbresource首先转换为fileresource 在导出到gltf之前使用文件名boxTextured.bin

pip install gltflib
8

注意,glb文件通常包含一个组合数据的二进制glb块。 从多个缓冲区(然后由多个缓冲区视图、图像和 访问器)。当前,将glb转换为gltf时,整个glb块可以是 已转换为其他类型的资源,但无法将该资源拆分为 多个资源(例如,每个缓冲区独立的资源)。

资源

gltf和glb模型可以引用嵌入式或外部资源(通过缓冲区或图像 uri,或者在glb的情况下,不定义第一个缓冲区的uri)。这些 此库中的资源使用gltfresourcebase的子类表示 班级。加载模型时将分析这些资源,并且必须正确 在导出之前实例化并添加到模型中。

此库支持4种资源类型:

  • 文件资源:文件资源是指文件路径的资源。
  • base64resource:直接嵌入到gltf(或glb)文件中的资源 使用base64编码的数据uri。
  • glb resource:仅由glb文件使用,此资源类型表示二进制glb 直接嵌入到glb文件中的块。
  • 外部资源:外部资源是指外部Web URL。

如果某个特定资源的uri是由 调用获取资源

pip install gltflib
9

或者,可以使用 资源加载模型上的列表:

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
0

gltf 从一种类型到另一种类型。其中一些方法需要一些附加信息 进行转换;例如,转换为fileresource时的文件名, 或在转换为base64resource时的mime类型

以下各节将详细介绍每种资源类型,包括 注意事项和限制,以及如何将给定资源转换为该类型。

文件资源

使用fileresource类表示文件资源,并表示资源 指文件路径(通常是相对路径,尽管绝对文件路径是 也支持RTE)

加载模型时,通过查看 缓冲区和图像;但是,除非 调用gltf.load()时,加载文件资源的标志设置为true

gltf=GLTF.load(filename,load_file_resources=True)

或者,可以对要加载的fileresource实例调用load()方法 数据进入内存:

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
2

一旦文件资源加载到内存中,就可以通过数据访问其内容 属性:

print(resource.data)# b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\...

导出模型时,默认情况下文件资源将写入磁盘。然而, 这可以通过在调用时设置save_file_resources标志false来绕过 导出

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
4

当手动创建模型实例时,如果要同时保存文件 资源,则资源中必须有相应的fileresource 列出引用文件路径的每个缓冲区或图像(否则,将出现错误 将在尝试导出时引发):

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
5

当实例化一个文件资源时,如果文件的内容是已知的,它可以 通过数据构造函数参数提供:

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
6

使用 gltf类上的convert_to_file_resourcehelper方法。这种方法 需要文件名作为参数,并返回已转换的fileresource 实例:

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
7

注意:在保存模型之前(使用保存文件资源 标志设置为true)。另外,请注意要转换的资源必须是 模型中资源列表的一部分(否则将引发错误)。

如果资源已经是fileresource并且文件名匹配,则不执行任何操作 执行。如果文件名不同,则将更新文件名 在任何引用它的缓冲区和图像上。

如果要转换的资源是glbresourcebase64resource,则 取消嵌入并转换为外部文件资源,以及引用 资源将被适当更新。任何引用 将更新资源。如果图像先前引用了缓冲区视图,它将 现在引用一个uri;如果没有,相应的缓冲区视图将被删除 模型的其他部分引用了它。此外,在移除缓冲区视图之后,如果 没有其他缓冲区视图引用同一缓冲区,则该缓冲区将作为 嗯,

如果要转换的资源是外部资源,则此方法将引发 错误(不支持访问外部资源数据)。

base-64(数据uri)资源

gltf支持将资源直接嵌入基于json的gltf文件(或glb 使用 数据uri。 在这个场景中,资源被定义为uri本身的一部分,允许 模型是独立的,不一定使用glb格式:

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
8

加载此类模型时,将实例化base64resource类型的资源 并添加到模型的资源列表中。资源的uri属性将 包含原始数据uri,而data属性可用于访问 解码的二进制数据:

fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
9

要实例化base64resource,有两个选项。一是使用 要传入二进制数据和mime类型的构造函数(默认为 应用程序/八位字节流(如果未提供):

print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...
0

另一种方法是使用base64resource.from-urifactory方法并传递 在数据uri中:

print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...
1

转换RE另一种类型的源到abase64resource,使用 gltf.convert_to_base64_resourcehelper方法。此方法接受可选的 mime_type如果原始资源的mime类型已知(默认值 要应用程序/octet流(如果未提供):

print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...
2

如果要转换的资源已经是base64资源,则不执行任何操作。

如果资源是fileresource,则它将转换为base64resource。 如果尚未加载,fileresource的数据将从磁盘加载(其中 如果文件不存在,可能会引发ioerror

如果资源是glbresource,则它将转换为base64resource。这个 glb缓冲区将替换为具有数据uri的缓冲区(如果 仅用于图像)。通过缓冲区视图引用资源的任何图像都将 相反,直接通过数据uri和相应的缓冲区视图引用图像 将被删除(如果它在其他地方没有被引用)。此外,如果没有其他缓冲区 视图引用的缓冲区与移除的缓冲区视图相同,则缓冲区将 也完全删除。

如果资源是外部资源,则此方法将引发错误(访问 不支持外部资源数据)。

glb资源

glb资源是作为二进制文件直接嵌入glb文件中的资源。 块。这些资源只能与glb文件一起使用(如果保存到gltf,这些 必须首先将资源转换为其他类型。

一个文件中通常有一个glb块(块类型为bin)。 如果多个glb块具有不同的块类型,则它们有效。这个 库支持加载和保存这些额外的glb块,尽管没有 对其内容进行假设。

对对应于主glb块的glbresource的引用(使用 块类型bin)可以通过调用模型上的get-glb\u resource获得 实例,其数据可以通过data属性访问:

print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...
3

使用 资源类型参数设置为块类型:

print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...
4

使用 embed_resourcehelper方法。这允许嵌入特定资源 在导出到glb时将其他人留在外部(在这种情况下,请确保 要使用export\u glb而不是export,并同时设置embed\u缓冲区资源 以及embed_image_resourcesfalse以防止其他资源也 自动嵌入):

print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...
5

但是,最常见的场景是嵌入所有资源,而不管它们是什么 类型,在调用扩展名为export时自动发生。 (或使用默认参数集调用export懔glb

请注意,不支持嵌入外部资源,因为其数据是 不可访问(此库不支持从外部加载资源 网址)。

如其他章节所述,将glbresource转换为 另一种类型(即"取消嵌入"资源)通常不仅会替换 相应缓冲区和图像上的uri,但也可能导致删除 如果glb buffer和buffer视图在其他地方没有被引用,则它们完全是glb buffer和buffer视图。

外部资源

外部资源(由externalresource类表示)是资源 有外部网址的。而这个库能够加载 外部web url,资源本身将不会被获取。类型资源externalresource将用相应的uri实例化,但是 库不会执行任何Web请求来加载资源数据。同样地, 库支持保存包含externalresource实例的模型, 但同样,不会执行任何Web请求。

使用 gltf.convert_to_external_resourcehelper方法,它接受一个url:

print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...
6

同样,由于这个库不处理对外部资源的调用, 严格来说,这是一种记账操作。这是打电话的人的责任 以确保资源存在于外部。转换资源时注意 对于外部资源,资源数据变得不可访问。

如果资源已经是externalresource并且uri匹配,则不执行任何操作 执行。如果uri不同,那么将在资源上更新uri 实例以及模型中任何相应的缓冲区或图像。

如果资源是fileresourcebase64resource,则它将被转换 到外部资源,所有缓冲区和图像都将相应地更新。

如果资源是glbresource,则它将转换为externalresource。 glb缓冲区将替换为具有数据uri的缓冲区(或完全删除 如果它只用于图像)。通过缓冲区引用资源的任何图像 视图将直接通过一个数据uri引用图像,并相应地 缓冲区视图将被删除(如果它在其他地方没有被引用)。此外,如果 没有其他缓冲区视图引用与删除的缓冲区视图相同的缓冲区,然后 缓冲区也将完全移除。

学分

此项目基于 dodgyville此处提供:

https://gitlab.com/dodgyville/pygltflib

具体来说,这个项目是基于 似乎没有积极维护的时间。我把那个图书馆当作 开始点,并添加了一些功能,我需要为自己的工作。从那以后, 原来的pygltflib项目已经恢复,但是我们的实现已经 分岔明显。所以现在有两个:-)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Java8,HttpClient,接收到“收到致命警报:握手失败”   java需要什么样的Servlet。当我们使用构建路径选项在动态Web项目中创建servlet时,eclipseIDE中的jar?   primefaces惰性数据加载和hibernate,java。lang.NullPointerException错误   java改变JTable的外观和感觉   java在运行时将JPanel切换为jframe contentpane   hashmap如何使用Java高效地对SQL查询输出进行分组?   java TouchListener不工作   如何持续检查文本文件中的文本是否已变为空?JAVA   java Android:动画的起点是什么?   Java中的集合类   java freemarker是按引用分配还是按值分配?它有什么缺点吗?   java Heroku容器:释放抛出未处理的PromisejectionWarning:   按集合中的内部集合元素类型进行java分组   java Android+facebook sdk   java类不能强制转换到另一个类   java openbravo调用以使用OBDal。getInstance。保存不工作   java在尝试使用jmod文件时遇到的困难