TinyGLTFは、ヘッダーのみのC ++ 11 GLTF 2.0 https://github.com/khronosgroup/Gltfライブラリです。
TinyGLTF 、Niels LohmannのJSONライブラリ(https://github.com/nlohmann/json)を使用しているため、C ++ 11コンパイラが必要です。 (また、radpidjsonをJSONバックエンドとして使用できます)古いC ++ 03バージョンを探している場合は、 devel-picojsonブランチを使用してください(維持されていません)。
現在、TinyGltfは安定してメンテナンスモードです。劇的な変更や機能の追加が計画されていません。
sajson :Sajsonを使用してJsonを解析します。コンパイル時間のみを解析しますが、時間のみ(json.hppおよびrapidjsonと比較して2倍減少)ですが、十分に維持されていません。 おそらくほとんど機能が複雑です。最後に欠落している機能は、Dracoエンコードです:#207
json.hppコンパイルに失敗したため、サポートされていません。 .binファイルをロードします。拡張機能( ExtensionMap )では、JSON番号値はintまたはfloat(number)として解析され、 tinygltf::Valueオブジェクトとして保存されます。 tinygltf::Valueのフローティングポイント値が必要な場合は、 GetNumberAsDouble()メソッドを使用してください。
IsNumber()基礎となる値がint値または浮動ポイント値である場合にtrueを返します。
TinyGltfを安全かつ安全に実行したいユーザー(たとえば、オンラインGLTF Converを提供するために不正なGLTFファイルを処理する必要があります)、WASMターゲット用のTinyGltfを構築することをお勧めします。 WASIビルドの例はWASMにあります。
-modernグラフィックを備えた3Dエンジンextensionsとextrasプロパティをサポートしますanimationとskinの例とテストを書いてくださいTinyGltfは、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 :JSON解析でC ++例外を無効にします。 -fno-exceptionsを使用するか、シンボルJSON_NOEXCEPTIONとTINYGLTF_NOEXCEPTIONを定義して、tinygltfをコンパイルするときにC ++例外コードを完全に削除できます。TINYGLTF_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 :外部画像ファイルをロードしようとしないでください。このオプションは、GLTF解析中に画像ファイルをロードしたくない場合に役立ちます。TINYGLTF_ANDROID_LOAD_FROM_ASSETS :通常のファイルシステムではなく、パッケージ化されたアプリアセットからすべてのファイルをロードします。注:有効なアセットマネージャーをAndroidアプリからtinygltf::asset_managerに事前に渡す必要があります。TINYGLTF_ENABLE_DRACO :ドラコ圧縮を有効にします。ユーザーは、プロジェクトファイルにライブラリを通信するパスとリンクを含める必要があります。TINYGLTF_NO_INCLUDE_JSON : tiny_gltf.h内からjson.hppを含む無効化するか、以前に既に含まれているか、 tiny_gltf.hを含む前にカスタムパスを使用して含めることをお勧めします。TINYGLTF_NO_INCLUDE_RAPIDJSON : tiny_gltf.h内からrapidjsonのヘッダーファイルを含めることを無効にします。これは、 tiny_gltf.hを含む前にカスタムパスを使用してそれを含めています。TINYGLTF_NO_INCLUDE_STB_IMAGE : tiny_gltf.h内からstb_image.hを含む無効化することは、 tiny_gltf.hを含む前にカスタムパスを使用してカスタムパスを使用して含めたいためです。TINYGLTF_NO_INCLUDE_STB_IMAGE_WRITE : tiny_gltf.h内からstb_image_write.hを含む無効化します。これは、 tiny_gltf.hを含める前にカスタムパスを使用して含めています。TINYGLTF_USE_RAPIDJSON :rapidjsonをjsonパーサー/シリアルとして使用します。 RapidJSONファイルはTinyGltf Repoに含まれていません。この機能を有効にする場合は、rapidjsonへのパスを含めてください。TINYGLTF_USE_CPP14 :C ++ 14機能を使用します(C ++ 14コンパイラが必要です)。これにより、C ++ 11よりも優れたパフォーマンスが得られる場合があります。 add_subdirectory機能を使用してtinygltfを追加できます。 add_subdirectoryを使用してプロジェクトにtinygltfを追加する場合は、 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は地元の監督に。
loader_exampleを構築した後、 test_runner.pyを編集します。
$ python test_runner.py$ cd tests
$ make
$ ./tester
$ ./tester_noexcept詳細については、 tests/fuzzerを参照してください。
Ryzen9 3950Xでファッツァーを週に3950倍実行した後、少なくともFuzzerのメモリ外エラーを除き、少なくともLoadASCIIFromString安全に見えます。 GLTFデータを解析するときに、境界のあるメモリサイズのチェックを導入することをお勧めします。