โ† All examples

asset contracts

Articulation manifest with a Godot runtime joint builder

Give a glTF asset working hinges and sliders: a manifest binds joints (axis, pivot, limits) to named nodes, a checker validates the binding and predicts poses at the limits, and a Godot 4 node applies it at run time with clamping, clips and a saved scene.

What this component contains

  • ATTRIBUTION.md
  • LICENSE
  • README.md
  • articulation_manifest_godot_builder.py
  • asset_report.py
  • component.json
  • fixtures/bad_axis_zero.articulation.json
  • fixtures/bad_duplicate_names.gltf
  • fixtures/bad_joint_type.articulation.json
  • fixtures/bad_limits_reversed.articulation.json
  • fixtures/bad_node_jointed_twice.articulation.json
  • fixtures/bad_node_missing.articulation.json
  • fixtures/bad_record_type.articulation.json
  • fixtures/door.articulation.json
  • fixtures/door.gltf
  • fixtures/toolbox.articulation.json
  • fixtures/toolbox.gltf
  • gltfio.py
  • godot/articulated_asset.gd
  • godot/articulation_probe.gd
  • pngio.py
  • schema.json
  • schema_lite.py
  • test_articulation_manifest_godot_builder.py
  • test_package.py
  • verification/native.json

How it works

Entry points
read_manifest, joint_motion, pose, predictions, check, run, main, godot/articulated_asset.gd and 2 more
Proves
Every joint names exactly one node, no node carries two joints, axes are unit vectors, pivots are finite, and limits are ordered around the rest value; the reported poses are the forward kinematics of the manifest.
Does not prove
That the motion is free of collisions, that the limits match the real object, or that a physics engine would behave the same way (the Godot node sets transforms; it adds no physics joints).
Catches
asset_unreadable, manifest_invalid, joint_type_invalid, node_missing, node_ambiguous, node_jointed_twice, axis_invalid, pivot_invalid and 2 more

Recorded checks

blender_and_godot blender 5.2.1 LTS (hash 9e2066aef7ef built 2026-08-25 02:12:34); godot 4.7.2.stable.official.ed1daf0bf

  • checker_matches_contract
  • schema_agrees_with_jsonschema
  • godot_moves_each_joint_to_its_limits
  • godot_joint_player_reaches_each_limit
  • godot_reopens_the_built_scene
  • godot_builder_refuses_each_known_wrong_binding
  • blender_finds_every_bound_node

Limits to consider

Hinges and sliders only; no ball, planar or coupled joints. Axes and pivots are in the moving node's own frame at rest. The Godot node moves nodes by transform, not with physics joints, and its clips approximate a hinge arc with ten linear steps (exact at every step). Node names are matched exactly against the glTF names, so a renamed node breaks the binding. The saved scene embeds meshes and materials as sub-resources.