Releases: chordee/kimodo-houdini-bridge
Releases · chordee/kimodo-houdini-bridge
v0.4.0
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_motionnode: it drops an independent A-pose rig (akimodo_pose_rigsource + 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-globalconstraint dicts. - The server builds
FullBodyConstraintSet/EndEffectorConstraintSetvia the constructor (the path Kimodo's demo uses) and slices the 77-joint payload down to the model's 30-joint skeleton (SOMASkeleton30) viaget_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
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'stypeselects 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
root2dconstraint from the geometry: points with an integerframeattribute 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
GenerateRequestgains aconstraintsfield; the resident model is called withconstraint_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
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 thegen_sopandrest_sopcook scripts. It now lives once inscripts/_soma77.pyand is embedded as the HDA's PythonModule section, which both cook scripts read viahou.pwd().parent().type().hdaModule(). Swapping or extending the skeleton is now a one-file edit. (#9)
Docs
- Noted that the
kimodo_motionHDA 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