TinyGLTF เป็นส่วนหัวเท่านั้น C ++ 11 GLTF 2.0 https://github.com/khronosgroup/gltf ไลบรารี
TinyGLTF ใช้ห้องสมุด JSON ของ Niels Lohmann (https://github.com/nlohmann/json) ดังนั้นตอนนี้มันต้องใช้คอมไพเลอร์ C ++ 11 (นอกจากนี้คุณสามารถใช้ Radpidjson เป็นแบ็กเอนด์ JSON) หากคุณกำลังมองหารุ่นเก่า C ++ 03 โปรดใช้สาขา devel-picojson (แต่ไม่ได้รับการดูแลอีกต่อไป)
ปัจจุบัน TinyGltf มีความเสถียรและโหมดการบำรุงรักษา ไม่มีการเปลี่ยนแปลงอย่างรุนแรงและการเพิ่มคุณสมบัติตามแผน
sajson : ใช้ SAJSON เพื่อแยกวิเคราะห์ JSON การแยกวิเคราะห์เท่านั้น แต่เวลารวบรวมเร็วกว่า (ลด 2x เมื่อเทียบกับ JSON.hpp และ Rapidjson) แต่ไม่ได้รับการดูแลอย่างดี อาจเป็นส่วนใหญ่ที่สมบูรณ์ คุณสมบัติที่หายไปล่าสุดคือการเข้ารหัส Draco: #207
json.hpp .bin ในส่วนขยาย ( ExtensionMap ) ค่าหมายเลข JSON จะถูกแยกวิเคราะห์เป็น int หรือ float (จำนวน) และเก็บไว้เป็นวัตถุ tinygltf::Value หากคุณต้องการค่าจุดลอยตัวจากค่า tinygltf::Value ใช้วิธี GetNumberAsDouble()
IsNumber() ส่งคืนจริงหากค่าพื้นฐานเป็นค่า int หรือค่าจุดลอยตัว
ผู้ใช้ที่ต้องการเรียกใช้ TinyGLTF อย่างปลอดภัยและปลอดภัย (เช่นจำเป็นต้องจัดการไฟล์ GLTF Malcious เพื่อให้บริการแปลง GLTF ออนไลน์) ฉันขอแนะนำให้สร้าง TinyGLTF สำหรับเป้าหมาย WASM ตัวอย่าง Wasi Build ตั้งอยู่ใน WASM
- เครื่องยนต์ 3 มิติพร้อมกราฟิกที่ทันสมัยextensions และคุณสมบัติ extras animation และ skinTinyGltf ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT
TinyGltf ใช้ห้องสมุดบุคคลที่สามต่อไปนี้
คัดลอก stb_image.h , stb_image_write.h , json.hpp และ tiny_gltf.h ไปยังโครงการของคุณ
// Define these only in *one* .cc file.
# define TINYGLTF_IMPLEMENTATION
# define STB_IMAGE_IMPLEMENTATION
# define STB_IMAGE_WRITE_IMPLEMENTATION
// #define TINYGLTF_NOEXCEPTION // optional. disable exception handling.
# include " tiny_gltf.h "
using namespace tinygltf ;
Model model;
TinyGLTF loader;
std::string err;
std::string warn;
bool ret = loader.LoadASCIIFromFile(&model, &err, &warn, argv[ 1 ]);
// bool ret = loader.LoadBinaryFromFile(&model, &err, &warn, argv[1]); // for binary glTF(.glb)
if (!warn.empty()) {
printf ( " Warn: %s n " , warn. c_str ());
}
if (!err.empty()) {
printf ( " Err: %s n " , err. c_str ());
}
if (!ret) {
printf ( " Failed to parse glTF n " );
return - 1 ;
}TinyGLTF::SetPreserveimageChannels(bool onoff) true เพื่อรักษาช่องสัญญาณภาพตามที่เก็บไว้ในไฟล์ภาพสำหรับภาพที่โหลด false โดยค่าเริ่มต้นสำหรับความเข้ากันได้ย้อนหลัง (ช่องภาพขยายไปยังช่อง RGBA 4) มีผลเฉพาะเมื่อใช้ตัวโหลดอิมเมจในตัว (ตัวโหลดภาพ STB) TINYGLTF_NOEXCEPTION : ปิดการใช้งาน C ++ ยกเว้นในการแยกวิเคราะห์ JSON คุณสามารถใช้ -fno-exceptions หรือโดยการกำหนดสัญลักษณ์ JSON_NOEXCEPTION และ TINYGLTF_NOEXCEPTION เพื่อลบรหัสข้อยกเว้น C ++ อย่างเต็มที่เมื่อรวบรวม TinyGltfTINYGLTF_NO_STB_IMAGE : อย่าโหลดภาพด้วย STB_IMAGE ใช้ TinyGLTF::SetImageLoader(LoadimageDataFunction LoadImageData, void *user_data) เพื่อตั้งค่าการเรียกกลับสำหรับการโหลดภาพTINYGLTF_NO_STB_IMAGE_WRITE : อย่าเขียนภาพด้วย STB_IMAGE_WRITE ใช้ TinyGLTF::SetImageWriter(WriteimageDataFunction WriteImageData, void *user_data) เพื่อตั้งค่าการโทรกลับสำหรับการเขียนภาพTINYGLTF_NO_EXTERNAL_IMAGE : อย่าพยายามโหลดไฟล์ภาพภายนอก ตัวเลือกนี้จะเป็นประโยชน์หากคุณไม่ต้องการโหลดไฟล์ภาพระหว่างการแยกวิเคราะห์ GLTFTINYGLTF_ANDROID_LOAD_FROM_ASSETS : โหลดไฟล์ทั้งหมดจากสินทรัพย์แอปแพ็คแทนระบบไฟล์ปกติ หมายเหตุ: คุณต้องผ่านตัวจัดการสินทรัพย์ที่ถูกต้องจากแอพ Android ของคุณไปยัง tinygltf::asset_manager ล่วงหน้าTINYGLTF_ENABLE_DRACO : เปิดใช้งานการบีบอัด Draco ผู้ใช้จะต้องให้รวม PATH และ LINK CORSTNDING LIBRIALY ในไฟล์โครงการของคุณTINYGLTF_NO_INCLUDE_JSON : ปิดการใช้งานรวมถึง json.hpp จากภายใน tiny_gltf.h เพราะมันรวมอยู่แล้วก่อนหน้านี้หรือคุณต้องการรวมมันโดยใช้เส้นทางที่กำหนดเองก่อนรวม tiny_gltf.hTINYGLTF_NO_INCLUDE_RAPIDJSON : ปิดการใช้งานรวมถึงไฟล์ส่วนหัวของ Rapidjson จากภายใน tiny_gltf.h เพราะมันรวมอยู่แล้วก่อนหน้านี้หรือคุณต้องการรวมมันโดยใช้เส้นทางที่กำหนดเองก่อนรวม tiny_gltf.hTINYGLTF_NO_INCLUDE_STB_IMAGE : ปิดการใช้งานรวมถึง stb_image.h จากภายใน tiny_gltf.h เพราะมันรวมอยู่แล้วก่อนหน้านี้หรือคุณต้องการรวมมันโดยใช้เส้นทางที่กำหนดเองก่อนรวม tiny_gltf.hTINYGLTF_NO_INCLUDE_STB_IMAGE_WRITE : ปิดการใช้งานรวมถึง stb_image_write.h จากภายใน tiny_gltf.h เพราะมันรวมอยู่แล้วก่อนหน้านี้หรือคุณต้องการรวมมันโดยใช้เส้นทางที่กำหนดเองก่อนรวม tiny_gltf.hTINYGLTF_USE_RAPIDJSON : ใช้ rapidjson เป็นตัวแยกวิเคราะห์ JSON/serializer ไฟล์ Rapidjson ไม่รวมอยู่ใน TinyGltf repo โปรดตั้งค่าเส้นทางรวมไปยัง Rapidjson หากคุณเปิดใช้งานคุณสมบัตินี้TINYGLTF_USE_CPP14 : ใช้คุณสมบัติ C ++ 14 (ต้องใช้คอมไพเลอร์ C ++ 14) สิ่งนี้อาจให้ประสิทธิภาพที่ดีกว่า C ++ 11 คุณสามารถเพิ่ม TinyGltf โดยใช้คุณสมบัติ add_subdirectory หากคุณเพิ่ม TinyGltf ลงในโครงการของคุณโดยใช้ add_subdirectory มันจะดีกว่าถ้าจะตั้งค่า TINYGLTF_HEADER_ONLY (เพียงเพิ่มเส้นทางรวมไปยัง TinyGltf) และ TINYGLTF_INSTALL ปิด (ซึ่งไม่ได้ติดตั้งไฟล์ TinyGltf)
// Your project's CMakeLists.txt
...
set(TINYGLTF_HEADER_ONLY ON CACHE INTERNAL "" FORCE)
set(TINYGLTF_INSTALL OFF CACHE INTERNAL "" FORCE)
add_subdirectory(/path/to/tinygltf)
ต้องใช้ Python git clone https://github.com/khronosgroup/gltf-sample-models ไปยัง Dir ท้องถิ่นของคุณ
หลังจากสร้าง loader_example แก้ไข test_runner.py แล้ว
$ python test_runner.py$ cd tests
$ make
$ ./tester
$ ./tester_noexcept ดู tests/fuzzer สำหรับรายละเอียด
หลังจากเรียกใช้ฟัซเซอร์บน Ryzen9 3950x ต่อสัปดาห์อย่างน้อย LoadASCIIFromString ก็ดูปลอดภัยยกเว้นข้อผิดพลาดนอกหน่วยความจำในฟัซเซอร์ เราอาจจะดีกว่าที่จะแนะนำการตรวจสอบขนาดหน่วยความจำที่มีขอบเขตเมื่อแยกข้อมูล GLTF