#wavefront-obj #obj #wavefront #mtl #graphics #gamedev #nom

nobject-rs

Wavefront Obj/Mtl 文件的解析器。使用Nom编写。

10个稳定版本

2.0.0 2024年3月13日
1.3.2 2022年7月30日
1.2.0 2022年5月7日
1.1.2 2022年3月10日
1.1.1 2021年6月26日

#15 in 数据格式

Download history 104/week @ 2024-03-13 12/week @ 2024-03-20 15/week @ 2024-03-27 29/week @ 2024-04-03

291 每月下载量

MIT 许可证

155KB
4.5K SLoC

概述

nobject-rs 是一个用于解析wavefront .obj和.mtl内容的库。为此,该crate暴露了两种方法

  • load_obj
  • load_mtl

这两种方法分别接收相应文件(.obj和.mtl)的内容,解析后返回一个结果,该结果可能是某种解析错误,或者包含数据的结构。

请注意,此crate将文件I/O的责任留给了消费应用程序。例如,可以将文件名指定为材质的属性,或将文件名指定为obj文件中的材质库。此库将不会尝试打开和解析这些文件。这留给了消费应用程序/库从解析方法的输出中提取文件信息,找到并打开适当的文件,然后将内容传递给进行解析。

参考

解析基于在以下位置找到的Obj和Mtl规范

示例

Obj解析

fn main() {
    let input =
    "
    o 1
    v -0.5 -0.5 0.5
    v -0.5 -0.5 -0.5
    v -0.5 0.5 -0.5
    v -0.5 0.5 0.5
    v 0.5 -0.5 0.5
    v 0.5 -0.5 -0.5
    v 0.5 0.5 -0.5
    v 0.5 0.5 0.5
    
    usemtl Default
    f 4 3 2 1
    f 2 6 5 1
    f 3 7 6 2
    f 8 7 3 4
    f 5 8 4 1
    f 6 7 8 5
    ";

    let res = nobject_rs::load_obj(&input).unwrap();
    let group = &res.groups["default"];
    let face_group = &res.faces["default"];
    assert_eq!(res.vertices.len(), 8);
    assert_eq!(group.material_name, "Default".to_string());
    assert_eq!(res.normals.len(), 0);
    assert_eq!(res.faces.len(), 1);
    assert_eq!(face_group.len(), 6);;
}

Mtl解析

fn main() {
    let input =
    "newmtl frost_wind
    Ka 0.2 0.2 0.2
    Kd 0.6 0.6 0.6
    Ks 0.1 0.1 0.1
    d 1
    Ns 200
    illum 2
    map_d -mm 0.200 0.800 window.mps";

    let res = nobject_rs::load_mtl(&input).unwrap();
    assert_eq!(res.len(), 1);
}

依赖项

~1.3–2MB
~41K SLoC