2个不稳定版本
使用旧的Rust 2015
0.2.0 | 2020年2月7日 |
---|---|
0.1.1 | 2017年6月3日 |
#2079 in 解析器实现
250KB
936 行
nom-obj
使用nom编写的obj/mtl(wavefront 3D模型格式)文件格式解析器。
https://en.wikipedia.org/wiki/Wavefront_.obj_file
该crate旨在解析obj,以及它所指向的任何引用的mtl文件。它并不试图实现整个规范,而是仅仅依赖于三角网格。其目的是为sg-engine提供一个模型解析器。由于目的是为GPU生成数据结构,因此我选择了交错顶点数据(顶点/纹理/法线信息)的立场。glutin和vulkano都需要在顶点上实现一个trait(要么使用宏,要么手动),因此我们必须将顶点数据复制到我们想要的格式中。
let obj = Obj::read_file("assets/cube.obj")?;
// Multiple mesh objects are supported, stored in objects[] vec
let Interleaved{ v_vt_vn, idx } = obj.objects[0].interleaved();
// Copy interleaved vertex information
let verts = v_vt_vn.iter()
.map(|&(v,vt,vn)| Vertex::create(v.0, v.1, v.2, vt.0, vt.1, vt.2, vn.0, vn.1, vn.0) )
.collect::<Vec<_>>();
assert!(verts.len() > 0);
let indices = idx.iter()
.map(|x:&usize| *x as u16)
.collect::<Vec<_>>();
use std::path::Path;
let material_path = obj.material.diffuse_map.clone();
let diffuse_map = image::open(material_path).expect("unable to open image file from material");
待办事项
- 升级nom到5.1+
- 将代码更新到rust 2018
- 需要一些使用示例。目前可以在sg-engine中看到
- 修复资产路径(可能目前只在Unix上工作)
- 在Windows中,材料文件路径需要一些注意。
- 支持每个mtl文件多个材料 - mtl文件中可以定义多个材料。
注意
- obj和mtl解析器是用nom解析器组合器实现的,虽然学习曲线有点高,但我真的很享受以这种方式编写解析器。这与传统的手动解析非常不同。obj和mtl是纯文本格式。感谢Geal,nom是一个出色的工具。请确保查看nom以解决你在Rust中的解析需求。
依赖项
~660KB
~13K SLoC