glTF Physics 拡張エクスポータ
glTF(GL Transmission Format)は3Dモデルやシーンを表現する為のフォーマットです。
glTF Phycis 拡張は glTF の拡張の1つで物理演算の情報を埋め込むための拡張です。現在、ドラフト仕様となっており将来的に仕様変更が入る可能性があります。
今回のエクスポータのサンプルはドラフト仕様に基づき、glTF Physics 拡張ファイルとしてファイル化する為のサンプルです。
https://scrapbox.io/files/6a0cc6c234d306895b7a3ca3.png
Created by cx20.icon
https://scrapbox.io/files/6a109d7265e24daf8cafb49e.png
glTF Physics 拡張エクスポータの使い方
基本フロー
code:javascript
// 1. プラグインを読み込む
await BABYLON.Tools.LoadScriptAsync(
// 2. シーン構築後に初期姿勢を保存
BABYLON.GLTFPhysicsExport.snapshot(scene);
// 3. 任意のタイミングでエクスポート
await BABYLON.GLTFPhysicsExport.GLBAsync(scene, "filename");
→ filename.glb がブラウザでダウンロードされます。
前提条件
Babylon.js V2 物理 API (PhysicsAggregate) を使うこと
プラグインは mesh.physicsBody から shape/material/motion を読み取ります
V1 の PhysicsImpostor は非対応 (= Havok 必須)
メッシュ名がユニークであること
プラグインは mesh.name で物理ボディを索引し、glTF ノードに紐付けます
API リファレンス
table:api
関数 役割
snapshot(scene) 全 physicsBody 付きメッシュの現在の位置/回転を記録。エクスポート時にこの姿勢へ戻す
GLBAsync(scene, name, options?) GLB をダウンロード。options.useCurrentPose = true で現在姿勢をそのまま出力。options.download = false で ArrayBuffer だけ取得
サポートする shape
PhysicsShapeType の BOX / SPHERE / CYLINDER / CAPSULE を自動判別
形状サイズはメッシュのバウンディングボックス × absoluteScaling から計算されます
MESH (凸殻/三角形メッシュ) は未対応
出力例
code:json
extensions:
nodes*.extensions.KHR_physics_rigid_bodies: - 静的: { collider: {geometry, physicsMaterial} }
- 動的: { motion: {mass}, collider: {...} }
典型的なワークフロー
code:javascript
const createScene = async function () {
// ... シーン構築 ...
scene.enablePhysics(g, new BABYLON.HavokPlugin(true, await HavokPhysics()));
mesh.aggregate = new BABYLON.PhysicsAggregate(mesh, type, params, scene);
// (繰り返し)
// プラグイン: ロード → スナップショット → ボタン設置
await BABYLON.Tools.LoadScriptAsync(".../gltf-physics-exporter.js");
BABYLON.GLTFPhysicsExport.snapshot(scene);
button.onPointerClickObservable.add(() =>
BABYLON.GLTFPhysicsExport.GLBAsync(scene, "scene_physics"));
return scene;
};
補足
エクスポートした .glb は eoineoineoin の Blender アドオン経由で取り込むと、各ノードの rigid body / collider が復元できます
glTF 拡張
参考