Skip to content

Releases: chordee/kimodo-houdini-bridge

v0.4.0

10 Jun 08:26
67f18b5

Choose a tag to compare

Adds full-body and end-effector pose constraints — author them by posing a skeleton in Houdini instead of hand-writing JSON (#11, #12). Extends the constraints support from v0.3.0.

Added

  • Pose-driven constraints — press Create Pose Rig on the kimodo_motion node: it drops an independent A-pose rig (a kimodo_pose_rig source + a KineFX Rig Pose) into the network and wires it to the node's input 1. Pose / keyframe it, set Pose Keyframes (e.g. 0 45 89), and choose Pose Constraint = Full-Body or End-Effector (toggle which Hand/Foot to pin). At each keyframe the node converts the posed joints to a Kimodo constraint.
  • The rig is a standalone source node, so the graph never loops the generator's output back into its own input.

How it works

  • The HDA inverts its own forward transform to recover Kimodo's global rotations from the posed skeleton (positions are already global), and sends fullbody-global / ee-global constraint dicts.
  • The server builds FullBodyConstraintSet / EndEffectorConstraintSet via the constructor (the path Kimodo's demo uses) and slices the 77-joint payload down to the model's 30-joint skeleton (SOMASkeleton30) via get_skel_slice.

Notes

  • Empty pose keyframes / no input 1 reproduce the previous behaviour exactly.
  • Docs (help card, README, setup, HDA README — EN + zh-TW) updated.

Full Changelog: v0.3.0...v0.4.0

v0.3.0

09 Jun 16:03
be9853a

Choose a tag to compare

Adds optional Kimodo constraints for guided motion generation, end-to-end (#10).

Added

  • Constraints (JSON passthrough) — new Constraints File (*.json) and Constraints JSON (inline, wins when non-empty) node parameters. They are two sources for the same JSON payload, where each dict's type selects the kind, so all constraint types are supported (root 2D path/waypoints, full-body keyframes, end-effector hand/foot targets). Interoperates with JSON exported from the Kimodo demo.
  • Geometry-driven root path — a new optional Root Path / Waypoints input. Connect a curve or points and the node builds a root2d constraint from the geometry: points with an integer frame attribute become sparse waypoints (you control the timing); otherwise the points are spread evenly across the clip as a denser path. Houdini world XZ maps 1:1 to Kimodo's space, so it's coordinate-consistent with the node's own output. The geometry-derived constraint is appended to any JSON constraints.

Server

  • GenerateRequest gains a constraints field; the resident model is called with constraint_lst (post-processing already on). Constraints are folded into the cache key, so a new constraint set triggers a fresh generation. Empty constraints reproduce the previous behaviour exactly.

Docs

  • Help card, README, setup guide and HDA README (EN + zh-TW) document the parameters, the input, the JSON format and Kimodo's coordinate space.

Follow-up

  • Houdini-native full-body / end-effector authoring (pose the rig, keyframe → constraint) tracked in #11.

Full Changelog: v0.2.1...v0.3.0

v0.2.1

04 Jun 19:53

Choose a tag to compare

Maintenance release: internal refactor and a documentation note. No user-facing behavior change.

Changed

  • Single SOMA77 data source — the SOMA77 skeleton data (SOMA77_JOINTS, SOMA77_PARENTS, NEUTRAL_JOINTS, TPOSE_ROTS) was duplicated inline across the gen_sop and rest_sop cook scripts. It now lives once in scripts/_soma77.py and is embedded as the HDA's PythonModule section, which both cook scripts read via hou.pwd().parent().type().hdaModule(). Swapping or extending the skeleton is now a one-file edit. (#9)

Docs

  • Noted that the kimodo_motion HDA works standalone: even without the inference server (so no generation), it reads any compatible SOMA77 NPZ produced elsewhere and reconstructs the skeleton motion as KineFX geometry via the NPZ Path parameter.

Full Changelog: v0.2.0...v0.2.1