2个不稳定版本

使用旧的Rust 2015

0.2.0 2020年2月7日
0.1.1 2017年6月3日

#2079 in 解析器实现

BSD-2-Clause

250KB
936

nom-obj

Build Status Crates.io Version

使用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