用于在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
方法根据文件扩展名推断格式
(.gltf
vs.glb
)。但是,您也可以调用export_gltf
或export_glb
手动
强制格式化。
在上面的示例中,导出将生成两个文件:triangle.gltf
和vertices.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
到其他资源类型。下面关于资源的部分将详细介绍,
但这里有一个简单的示例,其中 注意,glb文件通常包含一个组合数据的二进制glb块。
从多个缓冲区(然后由多个缓冲区视图、图像和
访问器)。当前,将glb转换为gltf时,整个glb块可以是
已转换为其他类型的资源,但无法将该资源拆分为
多个资源(例如,每个缓冲区独立的资源)。 gltf和glb模型可以引用嵌入式或外部资源(通过缓冲区或图像
uri,或者在glb的情况下,不定义第一个缓冲区的uri)。这些
此库中的资源使用 此库支持4种资源类型: 如果某个特定资源的uri是由
调用 或者,可以使用
gltf 以下各节将详细介绍每种资源类型,包括
注意事项和限制,以及如何将给定资源转换为该类型。 使用 加载模型时,通过查看
缓冲区和图像;但是,除非
或者,可以对要加载的 一旦文件资源加载到内存中,就可以通过 导出模型时,默认情况下文件资源将写入磁盘。然而,
这可以通过在调用时设置 当手动创建模型实例时,如果要同时保存文件
资源,则资源中必须有相应的 当实例化一个文件资源时,如果文件的内容是已知的,它可以
通过 使用
gltf类上的 注意:在保存模型之前(使用 如果资源已经是 如果要转换的资源是 如果要转换的资源是外部资源,则此方法将引发
错误(不支持访问外部资源数据)。 gltf支持将资源直接嵌入基于json的gltf文件(或glb
使用
数据uri。
在这个场景中,资源被定义为uri本身的一部分,允许
模型是独立的,不一定使用glb格式: 加载此类模型时,将实例化 要实例化 另一种方法是使用 转换RE另一种类型的源到a 如果要转换的资源已经是base64资源,则不执行任何操作。 如果资源是 如果资源是 如果资源是外部资源,则此方法将引发错误(访问
不支持外部资源数据)。 glb资源是作为二进制文件直接嵌入glb文件中的资源。
块。这些资源只能与glb文件一起使用(如果保存到gltf,这些
必须首先将资源转换为其他类型。 一个文件中通常有一个glb块(块类型为 对对应于主glb块的 使用
使用
但是,最常见的场景是嵌入所有资源,而不管它们是什么
类型,在调用扩展名为 请注意,不支持嵌入外部资源,因为其数据是
不可访问(此库不支持从外部加载资源
网址)。 如其他章节所述,将 外部资源(由 使用
同样,由于这个库不处理对外部资源的调用,
严格来说,这是一种记账操作。这是打电话的人的责任
以确保资源存在于外部。转换资源时注意
对于外部资源,资源数据变得不可访问。 如果资源已经是 如果资源是 如果资源是 此项目基于
dodgyville此处提供: https://gitlab.com/dodgyville/pygltflib 具体来说,这个项目是基于
似乎没有积极维护的时间。我把那个图书馆当作
开始点,并添加了一些功能,我需要为自己的工作。从那以后,
原来的pygltflib项目已经恢复,但是我们的实现已经
分岔明显。所以现在有两个:-)glbresource
首先转换为fileresource
在导出到gltf之前使用文件名boxTextured.bin
8
pip install gltflib
资源
gltfresource
base的子类表示
班级。加载模型时将分析这些资源,并且必须正确
在导出之前实例化并添加到模型中。文件资源
:文件资源是指文件路径的资源。base64resource
:直接嵌入到gltf(或glb)文件中的资源
使用base64编码的数据uri。glb resource
:仅由glb文件使用,此资源类型表示二进制glb
直接嵌入到glb文件中的块。外部资源
:外部资源是指外部Web URL。获取资源
:
9
pip install gltflib
资源
加载模型上的列表:fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
0
从一种类型到另一种类型。其中一些方法需要一些附加信息
进行转换;例如,转换为
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
convert_to_file_resource
helper方法。这种方法
需要文件名作为参数,并返回已转换的fileresource
实例:fromgltflibimportGLTFgltf=GLTF.load('glTF-Sample-Models/2.0/BoxTextured/glTF/BoxTextured.gltf')
7
保存文件资源
标志设置为
true
)。另外,请注意要转换的资源必须是
模型中资源列表的一部分(否则将引发错误)。
fileresource
并且文件名匹配,则不执行任何操作
执行。如果文件名不同,则将更新文件名
在任何引用它的缓冲区和图像上。glbresource
或base64resource
,则
取消嵌入并转换为外部文件资源,以及引用
资源将被适当更新。任何引用
将更新资源。如果图像先前引用了缓冲区视图,它将
现在引用一个uri;如果没有,相应的缓冲区视图将被删除
模型的其他部分引用了它。此外,在移除缓冲区视图之后,如果
没有其他缓冲区视图引用同一缓冲区,则该缓冲区将作为
嗯,base-64(数据uri)资源
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-uri
factory方法并传递
在数据uri中:print(gltf.model)# GLTFModel(extensions=None, extras=None, accessors=[Accessor(extensions=None, extras=None, name=None, bufferView=0, byteOffset=0, componentType=5123, ...
1
base64resource
,使用
gltf.convert_to_base64_resource
helper方法。此方法接受可选的
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
fileresource
,则它将转换为base64resource
。
如果尚未加载,fileresource
的数据将从磁盘加载(其中
如果文件不存在,可能会引发ioerror
。glbresource
,则它将转换为base64resource
。这个
glb缓冲区将替换为具有数据uri的缓冲区(如果
仅用于图像)。通过缓冲区视图引用资源的任何图像都将
相反,直接通过数据uri和相应的缓冲区视图引用图像
将被删除(如果它在其他地方没有被引用)。此外,如果没有其他缓冲区
视图引用的缓冲区与移除的缓冲区视图相同,则缓冲区将
也完全删除。glb资源
bin
)。
如果多个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_resource
helper方法。这允许嵌入特定资源
在导出到glb时将其他人留在外部(在这种情况下,请确保
要使用export\u glb
而不是export
,并同时设置embed\u缓冲区资源
以及
embed_image_resources
到false
以防止其他资源也
自动嵌入):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_resource
helper方法,它接受一个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
实例以及模型中任何相应的缓冲区或图像。fileresource
或base64resource
,则它将被转换
到外部资源,所有缓冲区和图像都将相应地更新。glbresource
,则它将转换为externalresource
。
glb缓冲区将替换为具有数据uri的缓冲区(或完全删除
如果它只用于图像)。通过缓冲区引用资源的任何图像
视图将直接通过一个数据uri引用图像,并相应地
缓冲区视图将被删除(如果它在其他地方没有被引用)。此外,如果
没有其他缓冲区视图引用与删除的缓冲区视图相同的缓冲区,然后
缓冲区也将完全移除。学分
推荐PyPI第三方库