Wavefront Obj Loader file tunggal kecil tapi kuat ditulis dalam C ++ 03. Tidak ada ketergantungan kecuali C ++ STL. Ini dapat mengurai lebih dari 10m poligon dengan memori dan waktu sedang.
tinyobjloader baik untuk menanamkan .obj loader ke renderer (iluminasi global) Anda ;-)
Jika Anda mencari versi C99, silakan lihat https://github.com/syoyo/tinyobjloader-c.
Kami merekomendasikan untuk menggunakan cabang master ( main ). Kandidat rilis V2.0. Sebagian besar fitur sekarang hampir kuat dan stabil (tugas yang tersisa untuk rilis v2.0 adalah memoles C ++ dan Python API, dan memperbaiki kode triangulasi bawaan).
Kami telah merilis versi baru v1.0.0 pada 20 Agustus, 2016. Versi lama tersedia sebagai v0.9.x cabang https://github.com/syoyo/tinyobjloader/tree/v0.9.x
python . Lihat juga https://pypi.org/project/tinyobjloader/) Versi lama sebelumnya tersedia di cabang v0.9.x

Tinyobjloader dapat berhasil memuat adegan rungholt segitiga 6m. http://casual-effects.com/data/index.html

Tinyobjloader berhasil digunakan dalam ...
TINYOBJLOADER_USE_DOUBLE Berkat Noma
- Mesin 3D dengan grafik modernpython .f ) l ) p ) Tinyobjloader dilisensikan di bawah lisensi MIT.
Salah satu opsi adalah dengan cukup menyalin file header ke dalam proyek Anda dan untuk memastikan bahwa TINYOBJLOADER_IMPLEMENTATION didefinisikan tepat sekali.
Meskipun ini bukan cara yang disarankan, Anda dapat mengunduh dan menginstal Tinyobjloader menggunakan VCPKG Dependency Manager:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install tinyobjloader
Port Tinyobjloader di VCPKG terus diperbarui oleh anggota tim Microsoft dan kontributor komunitas. Jika versi sudah ketinggalan zaman, silakan buat masalah atau tarik permintaan pada repositori VCPKG.
attrib_t berisi array tunggal dan linier dari data vertex (Posisi, Normal dan Texcoord).
attrib_t::vertices => 3 floats per vertex
v[0] v[1] v[2] v[3] v[n-1]
+-----------+-----------+-----------+-----------+ +-----------+
| x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z |
+-----------+-----------+-----------+-----------+ +-----------+
attrib_t::normals => 3 floats per vertex
n[0] n[1] n[2] n[3] n[n-1]
+-----------+-----------+-----------+-----------+ +-----------+
| x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z |
+-----------+-----------+-----------+-----------+ +-----------+
attrib_t::texcoords => 2 floats per vertex
t[0] t[1] t[2] t[3] t[n-1]
+-----------+-----------+-----------+-----------+ +-----------+
| u | v | u | v | u | v | u | v | .... | u | v |
+-----------+-----------+-----------+-----------+ +-----------+
attrib_t::colors => 3 floats per vertex(vertex color. optional)
c[0] c[1] c[2] c[3] c[n-1]
+-----------+-----------+-----------+-----------+ +-----------+
| x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z |
+-----------+-----------+-----------+-----------+ +-----------+
Setiap shape_t::mesh_t tidak mengandung data vertex tetapi berisi indeks array ke attrib_t . Lihat loader_example.cc untuk lebih jelasnya.
mesh_t::indices => array of vertex indices.
+----+----+----+----+----+----+----+----+----+----+ +--------+
| i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 | ... | i(n-1) |
+----+----+----+----+----+----+----+----+----+----+ +--------+
Each index has an array index to attrib_t::vertices, attrib_t::normals and attrib_t::texcoords.
mesh_t::num_face_vertices => array of the number of vertices per face(e.g. 3 = triangle, 4 = quad , 5 or more = N-gons).
+---+---+---+ +---+
| 3 | 4 | 3 | ...... | 3 |
+---+---+---+ +---+
| | | |
| | | +-----------------------------------------+
| | | |
| | +------------------------------+ |
| | | |
| +------------------+ | |
| | | |
|/ |/ |/ |/
mesh_t::indices
| face[0] | face[1] | face[2] | | face[n-1] |
+----+----+----+----+----+----+----+----+----+----+ +--------+--------+--------+
| i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 | ... | i(n-3) | i(n-2) | i(n-1) |
+----+----+----+----+----+----+----+----+----+----+ +--------+--------+--------+
Perhatikan bahwa ketika triangulate Flag benar dalam argumen tinyobj::LoadObj() , num_face_vertices semuanya diisi dengan 3 (segitiga).
Tinyobjloader sekarang menggunakan real_t untuk tipe data floating point. Default adalah float(32bit) . Anda dapat mengaktifkan presisi double(64bit) dengan menggunakan TINYOBJLOADER_USE_DOUBLE Define.
Saat Anda mengaktifkan triangulation (default diaktifkan), Tinyobjloader Triangulate Polygon (wajah dengan 4 atau lebih simpul).
Kode triangulasi bawaan mungkin tidak berfungsi dengan baik dalam bentuk poligon.
Anda dapat mendefinisikan TINYOBJLOADER_USE_MAPBOX_EARCUT untuk triangulasi yang kuat menggunakan mapbox/earcut.hpp . Ini membutuhkan kompiler C ++ 11. Dan Anda perlu menyalin mapbox/earcut.hpp ke proyek Anda. Jika Anda memiliki file mapbox/earcut.hpp Anda sendiri yang ditimbulkan dalam proyek Anda, Anda dapat mendefinisikan TINYOBJLOADER_DONOT_INCLUDE_MAPBOX_EARCUT sehingga mapbox/earcut.hpp tidak termasuk di dalam tiny_obj_loader.h .
# define TINYOBJLOADER_IMPLEMENTATION // define this in only *one* .cc
// Optional. define TINYOBJLOADER_USE_MAPBOX_EARCUT gives robust triangulation. Requires C++11
// #define TINYOBJLOADER_USE_MAPBOX_EARCUT
# include " tiny_obj_loader.h "
std::string inputfile = " cornell_box.obj " ;
tinyobj:: attrib_t attrib;
std::vector<tinyobj:: shape_t > shapes;
std::vector<tinyobj:: material_t > materials;
std::string warn;
std::string err;
bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, inputfile.c_str());
if (!warn.empty()) {
std::cout << warn << std::endl;
}
if (!err.empty()) {
std::cerr << err << std::endl;
}
if (!ret) {
exit ( 1 );
}
// Loop over shapes
for ( size_t s = 0 ; s < shapes.size(); s++) {
// Loop over faces(polygon)
size_t index_offset = 0 ;
for ( size_t f = 0 ; f < shapes[s]. mesh . num_face_vertices . size (); f++) {
size_t fv = size_t (shapes[s]. mesh . num_face_vertices [f]);
// Loop over vertices in the face.
for ( size_t v = 0 ; v < fv; v++) {
// access to vertex
tinyobj:: index_t idx = shapes[s]. mesh . indices [index_offset + v];
tinyobj:: real_t vx = attrib. vertices [ 3 * size_t (idx. vertex_index )+ 0 ];
tinyobj:: real_t vy = attrib. vertices [ 3 * size_t (idx. vertex_index )+ 1 ];
tinyobj:: real_t vz = attrib. vertices [ 3 * size_t (idx. vertex_index )+ 2 ];
// Check if `normal_index` is zero or positive. negative = no normal data
if (idx. normal_index >= 0 ) {
tinyobj:: real_t nx = attrib. normals [ 3 * size_t (idx. normal_index )+ 0 ];
tinyobj:: real_t ny = attrib. normals [ 3 * size_t (idx. normal_index )+ 1 ];
tinyobj:: real_t nz = attrib. normals [ 3 * size_t (idx. normal_index )+ 2 ];
}
// Check if `texcoord_index` is zero or positive. negative = no texcoord data
if (idx. texcoord_index >= 0 ) {
tinyobj:: real_t tx = attrib. texcoords [ 2 * size_t (idx. texcoord_index )+ 0 ];
tinyobj:: real_t ty = attrib. texcoords [ 2 * size_t (idx. texcoord_index )+ 1 ];
}
// Optional: vertex colors
// tinyobj::real_t red = attrib.colors[3*size_t(idx.vertex_index)+0];
// tinyobj::real_t green = attrib.colors[3*size_t(idx.vertex_index)+1];
// tinyobj::real_t blue = attrib.colors[3*size_t(idx.vertex_index)+2];
}
index_offset += fv;
// per-face material
shapes[s]. mesh . material_ids [f];
}
}
# define TINYOBJLOADER_IMPLEMENTATION // define this in only *one* .cc
// Optional. define TINYOBJLOADER_USE_MAPBOX_EARCUT gives robust triangulation. Requires C++11
// #define TINYOBJLOADER_USE_MAPBOX_EARCUT
# include " tiny_obj_loader.h "
std::string inputfile = " cornell_box.obj " ;
tinyobj::ObjReaderConfig reader_config;
reader_config.mtl_search_path = " ./ " ; // Path to material files
tinyobj::ObjReader reader;
if (!reader.ParseFromFile(inputfile, reader_config)) {
if (!reader. Error (). empty ()) {
std::cerr << " TinyObjReader: " << reader. Error ();
}
exit ( 1 );
}
if (!reader.Warning().empty()) {
std::cout << " TinyObjReader: " << reader. Warning ();
}
auto & attrib = reader.GetAttrib();
auto & shapes = reader.GetShapes();
auto & materials = reader.GetMaterials();
// Loop over shapes
for ( size_t s = 0 ; s < shapes.size(); s++) {
// Loop over faces(polygon)
size_t index_offset = 0 ;
for ( size_t f = 0 ; f < shapes[s]. mesh . num_face_vertices . size (); f++) {
size_t fv = size_t (shapes[s]. mesh . num_face_vertices [f]);
// Loop over vertices in the face.
for ( size_t v = 0 ; v < fv; v++) {
// access to vertex
tinyobj:: index_t idx = shapes[s]. mesh . indices [index_offset + v];
tinyobj:: real_t vx = attrib. vertices [ 3 * size_t (idx. vertex_index )+ 0 ];
tinyobj:: real_t vy = attrib. vertices [ 3 * size_t (idx. vertex_index )+ 1 ];
tinyobj:: real_t vz = attrib. vertices [ 3 * size_t (idx. vertex_index )+ 2 ];
// Check if `normal_index` is zero or positive. negative = no normal data
if (idx. normal_index >= 0 ) {
tinyobj:: real_t nx = attrib. normals [ 3 * size_t (idx. normal_index )+ 0 ];
tinyobj:: real_t ny = attrib. normals [ 3 * size_t (idx. normal_index )+ 1 ];
tinyobj:: real_t nz = attrib. normals [ 3 * size_t (idx. normal_index )+ 2 ];
}
// Check if `texcoord_index` is zero or positive. negative = no texcoord data
if (idx. texcoord_index >= 0 ) {
tinyobj:: real_t tx = attrib. texcoords [ 2 * size_t (idx. texcoord_index )+ 0 ];
tinyobj:: real_t ty = attrib. texcoords [ 2 * size_t (idx. texcoord_index )+ 1 ];
}
// Optional: vertex colors
// tinyobj::real_t red = attrib.colors[3*size_t(idx.vertex_index)+0];
// tinyobj::real_t green = attrib.colors[3*size_t(idx.vertex_index)+1];
// tinyobj::real_t blue = attrib.colors[3*size_t(idx.vertex_index)+2];
}
index_offset += fv;
// per-face material
shapes[s]. mesh . material_ids [f];
}
}
Multi-threaded .OBJ Loader yang dioptimalkan tersedia di experimental/ direktori. Jika Anda ingin kinerja absolut memuat data .OBJ, pemuat yang dioptimalkan ini akan sesuai dengan tujuan Anda. Perhatikan bahwa loader yang dioptimalkan menggunakan utas C ++ 11 dan itu melakukan lebih sedikit pemeriksaan kesalahan tetapi dapat berfungsi sebagian besar data .OBJ.
Ini beberapa hasil benchmark. Waktu diukur pada MacBook 12 (awal 2016, Core M5 1.2GHz).
$ python -m pip install tinyobjloader
Lihat Python/Sample.py misalnya penggunaan pengikatan python dari tinyobjloader.
Cibuildwheels + unggahan benang untuk setiap acara penandaan git ditangani dalam aksi github dan cirrus ci (build lengan).
black to Python Files ( python/sample.py )release . Konfirmasi CI Build tidak apa -apa.v (misalnya v2.1.0 )git push --tags Tes unit disediakan di direktori tests . Lihat tests/README.md untuk detailnya.