GitHub – qmuntal/gltf:用于编码 glTF 2.0 文件的 Go 库
| Name | ||
|---|---|---|
|
248c8f3 · 11 months ago
|
||
|
|
last year
|
|
|
|
5 years ago
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
11 months ago
|
|
|
|
3 years ago
|
|
|
|
7 years ago
|
|
|
|
7 years ago
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
4 years ago
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
last year
|
|
|
|
6 years ago
|
|
|
|
5 years ago
|
|
|
|
last year
|
|
存储库文件导航
用于高效、健壮地序列化/反序列化 glTF 2.0 的 Go 模块,这是一种免版税规范,用于应用程序高效传输和加载 3D 场景和模型,也称为“3D 的 JPEG”。
- gltf。文档:惯用 glTF 数据模型
- gltf。打开 / gltf。Save: 和 [d]编码支持
.glTF.glb - qmuntal/gltf/ext:内置可扩展性机制,开箱即用,主要扩展
- qmuntal/gltf/modeler:用于读写访问器和缓冲区视图的友好包
- qmuntal/gltf/binary:友好且高效的包,用于从缓冲区中读取和写入字节
qmuntal/gltf实现整个 glTF 2.0 规范。顶层元素是 gltf.Document,它包含将 gltf 文档保存在内存中的所有信息:
// This document does not produce any valid glTF, it is just an example.
gltf.Document{
Accessors: []*gltf.Accessor{
{BufferView: gltf.Index(0), ComponentType: gltf.ComponentUshort, Type: gltf.AccessorScalar},
},
Asset: gltf.Asset{Version: "2.0", Generator: "qmuntal/gltf"},
BufferViews: []*gltf.BufferView{
{ByteLength: 72, ByteOffset: 0, Target: gltf.TargetElementArrayBuffer},
},
Buffers: []*gltf.Buffer{{ByteLength: 1033, URI: bufferData}},
Meshes: []*gltf.Mesh{{
Name: "Cube",
}},
Nodes: []*gltf.Node{{Name: "Cube", Mesh: gltf.Index(0)}},
Scene: gltf.Index(0),
Scenes: []*gltf.Scene{{Name: "Root Scene", Nodes: []int{0}}},
}
所有默认值与 golang 类型零值不匹配的可选属性都被定义为指针。使用可选值时,请考虑以下准则:
- 如果所需值是默认值,则在编写 glTF 时不定义它们是安全的。
- 可以肯定的是,读取 glTF 时可选值不是 nil。
- 将值分配给可选属性时,使用以下实用程序函数可能会有所帮助:
gltf.Index(1)gltf.Float(0.5)
一个 gltf。可以使用 gltf 从任何文档中解码文档。解码器:io.Reader
resp, _ := http.Get("https://example.com/static/foo.gltf")
var doc gltf.Document
gltf.NewDecoder(resp.Body).Decode(&doc)
fmt.Print(doc.Asset)
在使用文件系统时,使用 gltf 更方便。打开,因为它会自动管理相对的外部缓冲区:
doc, _ := gltf.Open("./foo.gltf")
fmt.Print(doc.Asset)
在这两种情况下,解码器都会根据文件的内容自动检测文件是 JSON/ASCII (gltf) 还是二进制 (glb)。
一个 gltf。可以使用 gltf 将文档编码为任何文档。编码器:io.Writer
var buf bytes.Buffer
gltf.NewEncoder(&buf).Encode(&doc)
http.Post("http://example.com/upload", "model/gltf+binary", &buf)
默认输出一个二进制文件,以生成设置为 false 的 JSON/ASCII 文件:gltf.NewEncoderAsBinary
var buf bytes.Buffer
enc := gltf.NewEncoder(&buf)
enc.AsBinary = false
enc.Encode(&doc)
http.Post("http://example.com/upload", "model/gltf+json", &buf)
在使用文件系统时,使用 gltf 更方便。保存并 gltf。SaveBinary,因为它会自动管理相对的外部缓冲区:
gltf.Save(&doc, "./foo.gltf")
gltf.SaveBinary(&doc, "./foo.glb")
包 gltf/modeler 定义了一个友好的 API 来读写访问器和缓冲区视图,抽象化了所有字节作工作和 glTF 规范的特质。
以下示例创建单个彩色三角形:
doc := gltf.NewDocument()
doc.Meshes = []*gltf.Mesh{{
Name: "Pyramid",
Primitives: []*gltf.Primitive{{
Indices: gltf.Index(modeler.WriteIndices(doc, []uint16{0, 1, 2})),
Attributes: gltf.PrimitiveAttributes{
gltf.POSITION: modeler.WritePosition(doc, [][3]float32{{0, 0, 0}, {0, 10, 0}, {0, 0, 10}}),
gltf.COLOR_0: modeler.WriteColor(doc, [][3]uint8{{255, 0, 0}, {0, 255, 0}, {0, 0, 255}}),
},
}},
}}
doc.Nodes = []*gltf.Node{{Name: "Pyramid", Mesh: gltf.Index(0)}}
doc.Scenes[0].Nodes = append(doc.Scenes[0].Nodes, 0)
gltf.Save(doc, "./test.gltf")
存储在单个 bufferView 中的属性数据可以存储为 Array-Of-Structures,这可能会在静态属性中产生渲染性能提升。 使用 WritePrimitiveAttributes、WriteAccessorsInterled 和 WriteBufferViewInterleaved 方法,方便创建交错访问器和缓冲区视图,这是创建网格基元时最推荐的第一个方法:qmuntal/gltf/modeler
doc := gltf.NewDocument()
attrs, _ := modeler.WritePrimitiveAttributes(doc,
modeler.PrimitiveAttribute{Name: gltf.POSITION, Data: [][3]float32{{0, 0, 0}, {0, 10, 0}, {0, 0, 10}}},
modeler.PrimitiveAttribute{Name: gltf.COLOR_0, Data: [][3]uint8{{255, 0, 0}, {0, 255, 0}, {0, 0, 255}}},
)
doc.Meshes = []*gltf.Mesh{{
Name: "Pyramid",
Primitives: []*gltf.Primitive{{
Indices: gltf.Index(modeler.WriteIndices(doc, []uint16{0, 1, 2})),
Attributes: attrs,
}},
}}
doc.Nodes = []*gltf.Node{{Name: "Pyramid", Mesh: gltf.Index(0)}}
doc.Scenes[0].Nodes = append(doc.Scenes[0].Nodes, 0)
gltf.Save(doc, "./test.gltf")
包 gltf/binary 定义了一个友好且高效的 API,用于从缓冲区读取和写入字节,从而抽象化所有字节作工作。这个包是非常低级别的,普通用户应该改用,因为它提供了另一个抽象级别,可以理解字节如何与其他实体相关联。gltf/modeler
这个包与 Go 包非常相似,主要区别在于它在 glTF 数据类型方面高度专业化,并且它只需要处理小端编码。binary
qmuntal/gltf旨在支持动态扩展。默认情况下,仅解码核心规范,扩展对象内的数据被存储,以便调用者可以解码它们或在保存文档时自动编码。json.RawMessage
一些官方扩展是在 ext.
要解码受支持的扩展之一,唯一需要的作是导入关联的包,这样扩展将不会存储为扩展包中定义的类型:json.RawMessage
import (
"github.com/qmuntal/gltf"
"github.com/qmuntal/gltf/ext/lightspunctual"
)
func main() {
doc, _ := gltf.Open("./foo.gltf")
if v, ok := doc.Extensions[lightspunctual.ExtensionName]; ok {
for _, l := range v.(lightspunctual.Lights) {
fmt.Print(l.Type)
}
}
}
无需调用内置扩展,因为这些扩展在初始化包时会自动注册。gltf.RegisterExtension
此列表是在其他模块中实现的已知扩展列表:
要实现自定义扩展编码,请提供可以按照规范规定编码为 JSON 对象的 。struct
要实现自定义扩展解码,请调用 gltf。RegisterExtension 在解码前至少进行一次,提供扩展的标识符和将 JSON 字节解码为所需字节的函数:struct
const ExtensionName = "FAKE_Extension"
type Foo struct {
BufferView int `json:"bufferView"`
Attributes gltf.Attributes `json:"attributes"`
}
func init() {
gltf.RegisterExtension(ExtensionName, Unmarshal)
}
func Unmarshal(data []byte) (any, error) {
foo := new(Foo)
err := json.Unmarshal(data, foo)
return foo, err
}
非常欢迎忍者地鼠的公关、问题和反馈。
该库是 glTF 2.0 的完整实现,其明确目标是提供一个生产就绪、惯用且精心策划的 API 来执行任何类型的 glTF作。
实现与其他文件格式之间的转换以及提供创建和作 3D 几何体的机制超出了范围。
当前的 API 仍未被冻结,在达到 v1.0 之前可能会发生细微的变化。
如果您想报告问题或讨论功能,请使用问题跟踪器或 。
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性
GLB下载网 - GLB/GLTF模型与格式资源免费下载,支持在线浏览与转换 » 用于编码 glTF 2.0 文件的 Go 库
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载要提取码
- 分享过期和重复下载怎么办
- 模型和平台不兼容怎么办

