• 正文概述
  • GitHub – qmuntal/gltf:用于编码 glTF 2.0 文件的 Go 库

    Name
    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

    ⭐ 主要特点

    📜 开始

    数据模型

    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,这可能会在静态属性中产生渲染性能提升。 使用 WritePrimitiveAttributesWriteAccessorsInterled 和 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 之前可能会发生细微的变化

    如果您想报告问题或讨论功能,请使用问题跟踪器或 。

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,请不要用于商业用途!
    3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
    8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
    声明如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性

    GLB下载网 - GLB/GLTF模型与格式资源免费下载,支持在线浏览与转换 » 用于编码 glTF 2.0 文件的 Go 库

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载要提取码
    百度网盘提取码都是gltf。
    分享过期和重复下载怎么办
    分享过期请使用备份下载,重复下载是不另扣费的,请放心下载。
    模型和平台不兼容怎么办
    可以用网站在线编辑功能,修改模型属性,大小,方向,坐标,中心,透明等问题,然后重新导出既可https://glbxz.com/38636.html
    开通VIP 享更多特权,建议使用 QQ 登录