gltf2cpp: glTF モデルを C++ コードに変換する
bin/gltf2cpp は glTF 2.0 (.gltf / .glb) を、Graphics3D::putScene() で描ける
static const データ一式のヘッダに変換します。実行時のメモリ確保も RAM 消費もありません。
python3 -m pip install -r bin/requirements.txt # Pillow, numpy, pygltflib
bin/gltf2cpp robot.glb robot.hpp # 名前空間 robot
bin/gltf2cpp --namespace assets --texformat argb4444 --dither diffusion model.gltf model.hpp
オプション
オプション |
既定値 |
説明 |
|---|---|---|
|
入力ファイル名 |
生成物を囲む名前空間 |
|
|
|
|
|
テクスチャの形式。 |
|
|
テクスチャのディザ ( |
|
なし |
テクスチャで透明にする色 |
|
なし |
N より大きいテクスチャを縮小する |
|
オフ |
2 の冪へのリサイズを行わず警告だけ出す |
対応する glTF の機能
項目 |
扱い |
|---|---|
プリミティブモード |
全モード対応。POINTS / LINES / LINE_LOOP / LINE_STRIP は |
POSITION |
必須 |
NORMAL |
なければ面法線を頂点に累積して生成 |
TEXCOORD_0 |
UV (それ以外の UV セットは無視) |
COLOR_0 |
|
添字 |
|
baseColorFactor |
|
baseColorTexture |
|
alphaMode |
BLEND → |
doubleSided |
|
ノードの変換 |
TRS (四元数含む) または matrix をツール側で列優先の 4x4 に合成 |
シーン |
全シーンと、既定シーンの別名 |
未対応 |
スキン、アニメーション、カメラ、ライト、KHR 拡張 (テクスチャ変形など) |
出力の構成
名前空間の中に次の名前で static const オブジェクトが並びます。
名前 |
内容 |
|---|---|
|
画像 i のピクセル配列と |
|
マテリアル i ( |
|
プリミティブの頂点配列、 |
|
プリミティブ配列と |
|
ノード。glTF の名前が識別子として使えて重複しなければ名前付き。子は親より前に定義される |
|
シーンと既定シーンの参照 |
#include "windmill.hpp"
g3d.putScene(windmill::scene); // 全体
g3d.putNode(windmill::node_Blades); // 部分木だけ
const g3::Mesh *m = windmill::node_Tower.mesh;
ノード名で部品をアニメーションさせる方法は 静的シーン (Mesh / Node / Scene) の NodeVisitor を参照してください。
サイズの目安
頂点 1 個は 36 バイト (位置 12、法線 12、UV 8、色 4)、添字は 2 バイトです。 ツールは末尾のコメントに頂点数・添字数・テクスチャ数と概算バイト数を出力します。
ワークフローの例
demo3d の風車は次の手順で作られています。
python3 example/wasm/demo3d/model/make_windmill.py # windmill.glb を生成 (Blender 等の出力でも同じ)
bin/gltf2cpp --namespace windmill example/wasm/demo3d/model/windmill.glb \
example/wasm/demo3d/model/windmill.hpp
Blender からエクスポートする場合は「glTF Binary (.glb)」で、テクスチャは埋め込み、 +Y up (既定) のままにしてください。