cozyclay 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/README.md +12 -30
- package/bin/agent/agent-routes.mjs +40 -113
- package/bin/agent/agent-runner.mjs +9 -10
- package/bin/agent/cliproxy-provider.mjs +135 -0
- package/bin/agent/credential-store.mjs +30 -7
- package/bin/agent/pi-tools.mjs +4 -1
- package/bin/agent/provider-keys.mjs +32 -0
- package/bin/agent/provider-login.mjs +110 -0
- package/bin/agent/provider-routes.mjs +99 -0
- package/bin/agent/providers.mjs +19 -97
- package/bin/agent/script-tool.mjs +17 -4
- package/bin/agent/studio-motion-reference.mjs +23 -0
- package/bin/agent/studio-prompt.mjs +1 -1
- package/bin/agent/studio-rebase-text.mjs +32 -0
- package/bin/agent/studio-rebase.mjs +26 -39
- package/bin/agent/studio-tools.mjs +9 -28
- package/bin/agent/tool-arguments.mjs +49 -0
- package/bin/agent/turn-frames.mjs +66 -0
- package/bin/codex-auth.mjs +9 -2
- package/bin/cozyclay.mjs +10 -116
- package/bin/live/cli.mjs +22 -6
- package/bin/mcp-runtime.mjs +2 -12
- package/bin/package-signature.mjs +0 -4
- package/dist/app/index.html +7 -6
- package/dist/assets/EXRLoader-CvVIvGVE.js +1 -0
- package/dist/assets/analytics-C9sUnndd.js +1 -0
- package/dist/assets/app-CCh--1Hc.js +5087 -0
- package/dist/assets/app-f-fkV5uP.css +1 -0
- package/dist/assets/compile-worker-CkxiD6lH.js +5 -0
- package/dist/assets/fflate.module-KbGj5-H6.js +5 -0
- package/dist/assets/{first-shot-handoff-BlT33CGf.js → first-shot-handoff-CC4xe4HM.js} +1 -1
- package/dist/assets/{landing-BSesrCpL.js → landing-DjHD8u7k.js} +1 -1
- package/dist/assets/scene-asset-sync-Hx_FzdOH.js +20 -0
- package/dist/assets/scene-asset-sync-_S8NQl5B.css +1 -0
- package/dist/assets/workflow-C4yKH1p4.js +179 -0
- package/dist/cozyclay-package.json +1 -1
- package/dist/index.html +3 -3
- package/dist/llms.txt +14 -0
- package/dist/sw.js +3 -6
- package/dist/workflow/index.html +5 -4
- package/mcp/LIVE-PROTOCOL.md +7 -47
- package/mcp/README.md +16 -26
- package/mcp/live-hub.mjs +6 -10
- package/mcp/package.json +1 -3
- package/mcp/tool-handlers.mjs +4 -168
- package/package.json +3 -22
- package/src/App.jsx +174 -2639
- package/src/agent-progress.js +79 -0
- package/src/agent-turn-mark.js +30 -0
- package/src/analytics.js +1 -19
- package/src/app-context.js +5 -0
- package/src/app-stage.jsx +2 -34
- package/src/asset-pane.jsx +6 -5
- package/src/camera-block.js +21 -0
- package/src/camera-direction.js +120 -0
- package/src/character-kind.js +3 -9
- package/src/command-bus.js +8 -6
- package/src/commands/cast.js +5 -34
- package/src/commands/elements/character.js +1 -1
- package/src/commands/elements/motion.js +1 -6
- package/src/commands/elements/object.js +6 -2
- package/src/commands/elements/shot.js +4 -1
- package/src/commands/elements.js +38 -14
- package/src/commands/index.js +3 -1
- package/src/commands/kits.js +37 -0
- package/src/commands/motion-timing.js +57 -0
- package/src/commands/motion.js +9 -152
- package/src/commands/motion3-compile.js +65 -0
- package/src/commands/motion3.js +207 -0
- package/src/commands/objects.js +6 -4
- package/src/commands/shot.js +49 -11
- package/src/commands/stage.js +14 -1
- package/src/commands/view.js +4 -1
- package/src/document-mirrors.js +42 -0
- package/src/document-store.js +4 -0
- package/src/domains/cast.js +19 -194
- package/src/domains/motion/motion-range-pin-rules.js +1 -1
- package/src/domains/motion/take-source.js +51 -0
- package/src/domains/motion.js +60 -1838
- package/src/domains/scenes.js +12 -55
- package/src/domains/shots.js +2 -2
- package/src/domains/stage.js +4 -2
- package/src/draft-ghost.js +46 -0
- package/src/draft-ghost.jsx +129 -0
- package/src/dualview.jsx +4 -3
- package/src/effects/EffectsLayer.jsx +112 -0
- package/src/effects/effect-meshes.js +232 -0
- package/src/effects/effect-record.js +103 -0
- package/src/effects/emitter.js +59 -0
- package/src/effects/simulate.js +261 -0
- package/src/effects/state.js +59 -0
- package/src/execution-telemetry.js +2 -3
- package/src/first-success-guide.jsx +5 -5
- package/src/ghost-set.js +257 -0
- package/src/held-object-edit.jsx +113 -0
- package/src/held-object-pose.js +175 -0
- package/src/hierarchy-model.js +1 -1
- package/src/hierarchy-panel.jsx +1 -1
- package/src/imported-mesh.jsx +103 -0
- package/src/kits/held.js +84 -0
- package/src/kits/index.js +70 -0
- package/src/kits/smoking.js +57 -0
- package/src/light-blockers.js +93 -0
- package/src/motion/beat-board-model.js +84 -0
- package/src/motion/beat-board.css +124 -0
- package/src/motion/beat-board.jsx +59 -0
- package/src/motion/center-of-mass.js +66 -0
- package/src/motion/fix-collisions.js +850 -0
- package/src/motion/physics-review.js +118 -0
- package/src/{ardy → motion}/physics-support.js +1 -76
- package/src/motion/rig-snapshot.js +22 -0
- package/src/motion/take-segments.jsx +140 -0
- package/src/{ardy → motion}/timeline-coordinates.js +0 -21
- package/src/{ardy → motion}/timeline.css +1 -2
- package/src/{ardy → motion}/timeline.jsx +48 -419
- package/src/motion/waypoints.js +76 -0
- package/src/motion3/beats.js +83 -0
- package/src/motion3/body.js +158 -0
- package/src/motion3/bones.js +47 -0
- package/src/motion3/carried.js +47 -0
- package/src/motion3/compile-job.js +75 -0
- package/src/motion3/compile-worker.js +10 -0
- package/src/motion3/compiler/anchors.js +105 -0
- package/src/motion3/compiler/arm-orient.js +128 -0
- package/src/motion3/compiler/channels.js +125 -0
- package/src/motion3/compiler/compile.js +205 -0
- package/src/motion3/compiler/gait-rhythm.js +97 -0
- package/src/motion3/compiler/grip.js +171 -0
- package/src/motion3/compiler/head-steady.js +48 -0
- package/src/motion3/compiler/hold.js +134 -0
- package/src/motion3/compiler/idle.js +113 -0
- package/src/motion3/compiler/limbs.js +170 -0
- package/src/motion3/compiler/math.js +72 -0
- package/src/motion3/compiler/pose.js +162 -0
- package/src/motion3/compiler/quat.js +49 -0
- package/src/motion3/compiler/skeleton.js +74 -0
- package/src/motion3/compiler/validate-common.js +32 -0
- package/src/motion3/compiler/validate-goals.js +118 -0
- package/src/motion3/compiler/validate-objects.js +143 -0
- package/src/motion3/compiler/validate-parts.js +116 -0
- package/src/motion3/compiler/validate.js +122 -0
- package/src/motion3/compiler/vocab.js +73 -0
- package/src/motion3/compiler/walk-pelvis.js +275 -0
- package/src/motion3/compiler/walk.js +207 -0
- package/src/motion3/compiler/wrist-clamp.js +32 -0
- package/src/motion3/delta.js +47 -0
- package/src/motion3/describe.js +174 -0
- package/src/motion3/docs.js +27 -0
- package/src/motion3/edit-carry.js +21 -0
- package/src/motion3/fix/ease.js +16 -0
- package/src/motion3/fix/ground.js +37 -0
- package/src/motion3/fix/index.js +52 -0
- package/src/motion3/fix/push.js +71 -0
- package/src/motion3/fix/reach.js +46 -0
- package/src/motion3/fix/retime.js +79 -0
- package/src/motion3/fix/self.js +211 -0
- package/src/motion3/fix/slide.js +70 -0
- package/src/motion3/fix/turn.js +51 -0
- package/src/motion3/follow.js +39 -0
- package/src/motion3/free-motion.js +173 -0
- package/src/motion3/grip-choice.js +130 -0
- package/src/motion3/hold-plan.js +157 -0
- package/src/motion3/json-patch.js +77 -0
- package/src/motion3/key-aim.js +105 -0
- package/src/motion3/key-edit.js +82 -0
- package/src/motion3/lenient.js +127 -0
- package/src/motion3/object-keys.js +236 -0
- package/src/motion3/object-pose.js +182 -0
- package/src/motion3/object-tracks.js +12 -0
- package/src/motion3/pipeline.js +102 -0
- package/src/motion3/playback.js +51 -0
- package/src/motion3/probes.js +91 -0
- package/src/motion3/qa/body-checks.js +34 -0
- package/src/motion3/qa/check-names.js +14 -0
- package/src/motion3/qa/checks.js +121 -0
- package/src/motion3/qa/contact-checks.js +51 -0
- package/src/motion3/qa/explain.js +80 -0
- package/src/motion3/qa/fmt.js +5 -0
- package/src/motion3/qa/foot-checks.js +72 -0
- package/src/motion3/qa/geometry.js +77 -0
- package/src/motion3/qa/goals.js +191 -0
- package/src/motion3/qa/ground.js +60 -0
- package/src/motion3/qa/hints-contact.js +179 -0
- package/src/motion3/qa/hints-goal.js +160 -0
- package/src/motion3/qa/hints-knee.js +24 -0
- package/src/motion3/qa/hints-motion.js +209 -0
- package/src/motion3/qa/hints-object.js +91 -0
- package/src/motion3/qa/index.js +42 -0
- package/src/motion3/qa/key-checks.js +82 -0
- package/src/motion3/qa/near.js +96 -0
- package/src/motion3/qa/object-checks.js +135 -0
- package/src/motion3/qa/patch.js +161 -0
- package/src/motion3/qa/severity.js +38 -0
- package/src/motion3/qa/spec-checks.js +65 -0
- package/src/motion3/qa/style.js +218 -0
- package/src/motion3/qa/wrist-checks.js +69 -0
- package/src/motion3/qa/wrist-obs.js +60 -0
- package/src/motion3/refs.js +120 -0
- package/src/motion3/repair-tune.js +121 -0
- package/src/motion3/repair.js +83 -0
- package/src/motion3/report.js +67 -0
- package/src/motion3/rigs/index.js +14 -0
- package/src/motion3/rigs/x-bot-tpose-body.json +1 -0
- package/src/motion3/rigs/x-bot-tpose.json +1 -0
- package/src/motion3/rigs/y-bot-tpose-body.json +1 -0
- package/src/motion3/rigs/y-bot-tpose.json +1 -0
- package/src/motion3/scene.js +60 -0
- package/src/motion3/schema/brief.js +89 -0
- package/src/motion3/schema/fields.js +44 -0
- package/src/motion3/schema/spec-examples.js +46 -0
- package/src/motion3/schema/topics.js +111 -0
- package/src/motion3/schema/types.js +147 -0
- package/src/motion3/search.js +117 -0
- package/src/motion3/second-hand.js +112 -0
- package/src/motion3/skills/basic.js +82 -0
- package/src/motion3/skills/book.js +76 -0
- package/src/motion3/skills/car.js +145 -0
- package/src/motion3/skills/frames-auto.js +29 -0
- package/src/motion3/skills/index.js +83 -0
- package/src/motion3/skills/info.js +65 -0
- package/src/motion3/skills/smoke-kit.js +109 -0
- package/src/motion3/skills/smoke.js +160 -0
- package/src/motion3/spec-store.js +59 -0
- package/src/motion3/take-edit.js +155 -0
- package/src/motion3/take.js +63 -0
- package/src/motion3/timeline.js +127 -0
- package/src/motion3/views.js +121 -0
- package/src/motion3/walk-plan.js +119 -0
- package/src/object-catalog.jsx +7 -1
- package/src/object-colors.js +98 -0
- package/src/object-gizmo-parts.js +115 -0
- package/src/object-gizmo.jsx +37 -122
- package/src/object-glow.js +139 -0
- package/src/object-hidden.js +33 -0
- package/src/object-look.js +196 -0
- package/src/object-size.js +10 -0
- package/src/object-travel.js +71 -6
- package/src/panels/CameraPanel.jsx +7 -7
- package/src/panels/HdrEnvironmentControls.jsx +59 -0
- package/src/panels/LightPanel.jsx +25 -4
- package/src/panels/ObjectLookPanel.jsx +88 -0
- package/src/panels/PoseImagePanel.jsx +1 -1
- package/src/panels/PosePanel.jsx +2 -17
- package/src/panels/RigControlPanel.jsx +5 -53
- package/src/panels/SubjectBox.jsx +4 -1
- package/src/panels/details.css +14 -0
- package/src/posestudio.jsx +4 -27
- package/src/project-browser.jsx +3 -4
- package/src/project-resources.js +18 -31
- package/src/project.js +13 -104
- package/src/props.jsx +25 -280
- package/src/rail-dot-drag.js +23 -0
- package/src/render-passes.js +10 -0
- package/src/resource-status.jsx +1 -0
- package/src/result-modal.jsx +4 -19
- package/src/room.jsx +20 -12
- package/src/scene-assets.js +8 -6
- package/src/scene-light-place.js +72 -0
- package/src/scene-lights.jsx +148 -0
- package/src/scene-objects.js +31 -139
- package/src/scenes.js +15 -105
- package/src/semantic-edit.js +2 -5
- package/src/set-pieces.jsx +183 -0
- package/src/settings-menu.jsx +3 -11
- package/src/shell/BottomDock.jsx +11 -53
- package/src/shell/CompositionGuideButton.jsx +20 -0
- package/src/shell/DetailsSlot.jsx +16 -200
- package/src/shell/GhostsMenuGroup.jsx +74 -0
- package/src/shell/LibrarySlot.jsx +1 -3
- package/src/shell/MenuBar.jsx +3 -3
- package/src/shell/PreferencesDialog.jsx +15 -264
- package/src/shell/PreferencesSlot.jsx +2 -8
- package/src/shell/ShotPreviewHeader.jsx +17 -0
- package/src/shell/TopBar.jsx +5 -83
- package/src/shell/ViewportToolbar.jsx +23 -93
- package/src/shell/agent-glass.css +19 -6
- package/src/shell/details-selection.js +42 -0
- package/src/shell/ghosts-menu.css +22 -0
- package/src/shell/glass-regions.css +29 -3
- package/src/shell/preferences.css +6 -1
- package/src/shell/viewport.css +12 -0
- package/src/shot-authoring.js +4 -7
- package/src/soft-shadows.js +37 -0
- package/src/stage-attach-frames.js +12 -12
- package/src/stage-canvas-rigs.jsx +3 -3
- package/src/stage-capture.jsx +42 -8
- package/src/stage-characters.jsx +22 -216
- package/src/stage-editor-gizmos.jsx +6 -6
- package/src/stage-environment.js +93 -0
- package/src/stage-hdr-builtins.js +107 -0
- package/src/stage-hdr-image.js +116 -0
- package/src/stage-hdr-library.js +70 -0
- package/src/stage-hdr-map.js +94 -0
- package/src/stage-hdr.js +130 -0
- package/src/stage-lighting.js +149 -0
- package/src/stage-occlusion.js +210 -0
- package/src/stage-sky.jsx +159 -0
- package/src/stage-startup-defaults.js +5 -9
- package/src/studio-actions.js +12 -14
- package/src/studio-agent-commands.js +46 -16
- package/src/studio-agent-motion.js +9 -9
- package/src/studio-agent-protocol.js +46 -73
- package/src/studio-app-binding.js +29 -45
- package/src/studio-asset-list.js +17 -0
- package/src/studio-contact-sheet.js +37 -5
- package/src/studio-elements.js +27 -7
- package/src/studio-entity-bounds.js +18 -0
- package/src/studio-error-codes.js +8 -0
- package/src/studio-export-framing.js +152 -0
- package/src/studio-lighting-check.js +103 -0
- package/src/studio-motion-visual.js +150 -0
- package/src/studio-schema-errors.js +80 -0
- package/src/studio-support-gap.js +74 -0
- package/src/styles.css +1 -19
- package/src/timeline-defaults.js +5 -0
- package/src/timeline-extent.js +8 -20
- package/src/tutorial-walk.js +17 -0
- package/src/ui-scrub.js +1 -1
- package/src/use-shot-camera-tracks.js +12 -0
- package/src/view-ghosts.js +97 -0
- package/src/view-ghosts.jsx +49 -0
- package/src/workflow/AgentPanel.jsx +47 -166
- package/src/workflow/AgentProgressCard.jsx +107 -0
- package/src/workflow/AgentReplyText.jsx +37 -0
- package/src/workflow/AgentTurnSteps.jsx +84 -0
- package/src/workflow/LoginPanel.jsx +140 -0
- package/src/workflow/WorkflowBuilder.jsx +7 -23
- package/src/workflow/agent-client.js +54 -51
- package/src/workflow/agent-panel.css +71 -1
- package/src/workflow/agent-progress-card.css +167 -0
- package/src/workflow/agent-progress-view.js +47 -0
- package/src/workflow/agent-turn-steps.css +113 -0
- package/src/workflow/agent-turn.js +191 -0
- package/src/workflow/login-client.js +34 -0
- package/src/workflow/motion-input.js +18 -31
- package/src/workflow/node-schema.js +1 -1
- package/src/workflow/reply-markdown.js +69 -0
- package/src/workflow/scene-asset-sync.js +8 -8
- package/tools/agent-session-stats.mjs +61 -0
- package/tools/dev-full.mjs +5 -56
- package/tools/eslint-baseline.json +12 -13
- package/tools/headless-studio.mjs +85 -0
- package/tools/knip-baseline.json +0 -179
- package/tools/loc-baseline.json +33 -83
- package/tools/motion3/extract-body.mjs +103 -0
- package/tools/motion3/extract-rig.mjs +85 -0
- package/tools/process-supervisor.mjs +0 -88
- package/tools/run-tests.mjs +9 -124
- package/bin/agent/motion-runtime.mjs +0 -76
- package/dist/ardy/cskel27-rest.json +0 -557
- package/dist/assets/analytics-B41FmPYI.js +0 -1
- package/dist/assets/app-Do-Og5Pu.css +0 -1
- package/dist/assets/app-DwP-tl2x.js +0 -4920
- package/dist/assets/config-Bx7pYsD9.js +0 -1
- package/dist/assets/config-DeoFTYzb.css +0 -1
- package/dist/assets/demo-Dt0qZfS7.js +0 -1
- package/dist/assets/scene-asset-sync-BCWDJB1d.js +0 -19
- package/dist/assets/scene-asset-sync-DjJ_cJ2R.css +0 -1
- package/dist/assets/ticket-jqMhqL88.js +0 -1
- package/dist/assets/workflow-Br-K7Srs.js +0 -179
- package/dist/demo/walk-then-stop.npz +0 -0
- package/mcp/ardy-prompts.mjs +0 -218
- package/src/ardy/auto-fix-panel.css +0 -108
- package/src/ardy/auto-physics.js +0 -1194
- package/src/ardy/client.js +0 -153
- package/src/ardy/convert.js +0 -313
- package/src/ardy/cskel27-neutral.js +0 -39
- package/src/ardy/cskel27.js +0 -77
- package/src/ardy/export.js +0 -165
- package/src/ardy/fix-collisions.js +0 -2257
- package/src/ardy/foot-lock.js +0 -230
- package/src/ardy/motion-calibration.js +0 -118
- package/src/ardy/motion-edit.js +0 -213
- package/src/ardy/motion-url.js +0 -55
- package/src/ardy/mp4-duration.js +0 -102
- package/src/ardy/npz.js +0 -595
- package/src/ardy/physics-panel.css +0 -21
- package/src/ardy/physics-panel.jsx +0 -89
- package/src/ardy/physics-refine.js +0 -111
- package/src/ardy/physics-review.js +0 -567
- package/src/ardy/physics-temporal.js +0 -54
- package/src/ardy/platform-fit-panel.css +0 -64
- package/src/ardy/platform-fit-panel.jsx +0 -41
- package/src/ardy/platform-fit.js +0 -326
- package/src/ardy/playback.js +0 -711
- package/src/ardy/pose-pin.js +0 -97
- package/src/ardy/prompt-clips.js +0 -30
- package/src/ardy/retime.js +0 -211
- package/src/ardy/root-drop.js +0 -369
- package/src/ardy/timeline-resize.js +0 -13
- package/src/ardy/to-cskel27.js +0 -225
- package/src/ardy/trim.js +0 -33
- package/src/ardy/waypoints.js +0 -369
- package/src/ardy-bridge-contract.js +0 -281
- package/src/domains/motion/motion-video-capture.js +0 -664
- package/src/i2v-motion-client.js +0 -77
- package/src/i2v-motion-studio.jsx +0 -180
- package/src/line-edit.js +0 -1348
- package/src/motion/generation.js +0 -105
- package/src/motion-readiness-ui.jsx +0 -67
- package/src/motion-readiness.js +0 -40
- package/src/motion-resources.js +0 -177
- package/src/motion-store.js +0 -65
- package/src/motion-trail.js +0 -601
- package/src/multimodel-ingest.js +0 -394
- package/src/panels/PromptBlocksPanel.jsx +0 -444
- package/src/panels/VideoCapturePanel.jsx +0 -181
- package/src/pose-extract/browser.js +0 -42
- package/src/pose-extract/detector.js +0 -100
- package/src/pose-extract/fit.js +0 -227
- package/src/pose-extract/image-frame.js +0 -51
- package/src/pose-extract/index.js +0 -58
- package/src/pose-extract/keyframes.js +0 -74
- package/src/pose-extract/landmarks.js +0 -162
- package/src/pose-extract/mirror.js +0 -153
- package/src/pose-extract/take.js +0 -131
- package/src/pose-extract/video-frames.js +0 -91
- package/src/take-recipe.js +0 -165
- package/src/trail-key-conflicts.js +0 -39
- package/src/trail-pick.js +0 -59
- package/src/use-i2v-capture-modal.js +0 -15
- package/tools/ardy/BRIDGE.md +0 -37
- package/tools/ardy/GVHMR-NPZ.md +0 -68
- package/tools/ardy/README.md +0 -124
- package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
- package/tools/ardy/artifacts.mjs +0 -34
- package/tools/ardy/bridge.mjs +0 -1732
- package/tools/ardy/bvh-cskel27.mjs +0 -1265
- package/tools/ardy/cclay_constrained_generate.py +0 -561
- package/tools/ardy/cclay_gvhmr_worker.py +0 -264
- package/tools/ardy/cclay_motion_edit.py +0 -510
- package/tools/ardy/cclay_sequence_generate.py +0 -705
- package/tools/ardy/cclay_worker.py +0 -304
- package/tools/ardy/dump-npz.py +0 -205
- package/tools/ardy/extract-rest.mjs +0 -299
- package/tools/ardy/extract.mjs +0 -507
- package/tools/ardy/footage.mjs +0 -467
- package/tools/ardy/gvhmr-floor.mjs +0 -102
- package/tools/ardy/gvhmr-to-cskel27.mjs +0 -21
- package/tools/ardy/gvhmr_fastpath.py +0 -168
- package/tools/ardy/gvhmr_trajectory.py +0 -240
- package/tools/ardy/merge-text-encoder.py +0 -160
- package/tools/ardy/mocap-metrics.mjs +0 -200
- package/tools/ardy/mocap-quality-gate.mjs +0 -110
- package/tools/ardy/motion-stabilize.mjs +0 -348
- package/tools/ardy/npz.mjs +0 -414
- package/tools/ardy/pose-to-npz.mjs +0 -106
- package/tools/ardy/prompt-limits.mjs +0 -5
- package/tools/ardy/run-edit-on-box.sh +0 -73
- package/tools/ardy/run-local.mjs +0 -233
- package/tools/ardy/run-on-box.sh +0 -593
- package/tools/ardy/run-sequence-on-box.sh +0 -177
- package/tools/ardy/runners/gvhmr-worker.mjs +0 -206
- package/tools/ardy/runners/index.mjs +0 -18
- package/tools/ardy/runners/local.mjs +0 -455
- package/tools/ardy/runners/proc.mjs +0 -125
- package/tools/ardy/runners/remote.mjs +0 -252
- package/tools/ardy/setup-local.mjs +0 -189
- package/tools/ardy/setup-text-encoder-on-box.sh +0 -93
- package/tools/ardy/setup-text-encoder.py +0 -306
- package/tools/ardy/smpl-cskel27.mjs +0 -178
- package/tools/ardy/visual-qa.mjs +0 -196
- package/tools/ardy/vq-car.mjs +0 -52
- package/tools/bench/EXP3.md +0 -61
- package/tools/bench/cclay_bench_extract_incam.py +0 -125
- package/tools/bench/cclay_bench_extract_obs.py +0 -204
- package/tools/bench/cclay_bench_runner.py +0 -42
- package/tools/bench/cube-contact.mjs +0 -162
- package/tools/bench/exp3.mjs +0 -152
- package/tools/bench/extract-bench-lib.mjs +0 -216
- package/tools/bench/extract-bench.mjs +0 -302
- package/tools/bench/fal-generate.mjs +0 -88
- package/tools/bench/fit/README.md +0 -189
- package/tools/bench/fit/camera.mjs +0 -59
- package/tools/bench/fit/contact.mjs +0 -419
- package/tools/bench/fit/footlock.mjs +0 -234
- package/tools/bench/fit/motion.mjs +0 -85
- package/tools/bench/fit/pin.mjs +0 -27
- package/tools/bench/fit/remote.mjs +0 -105
- package/tools/bench/fit-bench.mjs +0 -126
- package/tools/bench/fit-sanity.mjs +0 -45
- package/tools/bench/metrics.mjs +0 -313
- package/tools/bench/obs/depth.mjs +0 -258
- package/tools/bench/obs/extrinsics.mjs +0 -175
- package/tools/bench/obs/fit_mannequin_betas.py +0 -340
- package/tools/bench/obs/ground.mjs +0 -294
- package/tools/bench/obs/heading.mjs +0 -151
- package/tools/bench/obs/ladder.mjs +0 -555
- package/tools/bench/obs/mannequin-betas.json +0 -124
- package/tools/bench/obs/remote.mjs +0 -83
- package/tools/bench/obs/rest_joints.py +0 -52
- package/tools/bench/obs/ybot-targets.mjs +0 -49
- package/tools/bench/obs-bench.mjs +0 -520
- package/tools/bench/score.mjs +0 -343
- package/tools/bench/summarize.mjs +0 -86
- package/tools/demo-worker/README.md +0 -137
- package/tools/demo-worker/api-client.mjs +0 -233
- package/tools/demo-worker/generate.mjs +0 -301
- package/tools/demo-worker/index.mjs +0 -466
- package/tools/demo-worker/sign-core.mjs +0 -112
- package/tools/demo-worker/sign.mjs +0 -161
- package/tools/gt-render/browser.mjs +0 -159
- package/tools/gt-render/camera-math.mjs +0 -276
- package/tools/gt-render/page.mjs +0 -267
- package/tools/gt-render/render.mjs +0 -514
- package/tools/gt-render/scene-box.mjs +0 -31
- package/tools/gt-render/take-transform.mjs +0 -87
- package/tools/kimodo/compare-seam.mjs +0 -108
- package/tools/kimodo/constraints.mjs +0 -244
- package/tools/kimodo/edit.mjs +0 -259
- package/tools/kimodo/effector-constraints.mjs +0 -200
- package/tools/kimodo/generate.mjs +0 -646
- package/tools/kimodo/local-output.mjs +0 -265
- package/tools/kimodo/measure-pose.mjs +0 -65
- package/tools/kimodo/measure-preserve.mjs +0 -899
- package/tools/kimodo/measure-waypoints.mjs +0 -55
- package/tools/kimodo/mlx-generate.py +0 -111
- package/tools/kimodo/pose-constraints.mjs +0 -248
- package/tools/kimodo/preserve-mask.mjs +0 -543
- package/tools/kimodo/read-npz.mjs +0 -189
- package/tools/kimodo/run-edit-on-box.mjs +0 -155
- package/tools/kimodo/run-sequence-on-box.mjs +0 -178
- package/tools/kimodo/runner.mjs +0 -284
- package/tools/kimodo/seam-batch.mjs +0 -77
- package/tools/kimodo/setup-local.mjs +0 -30
- package/tools/kimodo/setup-on-box.sh +0 -339
- package/tools/kimodo/soma77-to-cskel27.mjs +0 -305
- package/tools/morphgs/assets/gen_truth.py +0 -39
- package/tools/morphgs/assets/mesh_ori_rig.txt +0 -27
- package/tools/morphgs/assets/playback-check.mjs +0 -30
- package/tools/morphgs/demo-gate.sh +0 -26
- package/tools/morphgs/fbx2morphgs.mjs +0 -68
- package/tools/morphgs/morphgs-to-cskel27.mjs +0 -105
- package/tools/morphgs/patches/preprocess_src-none-mode.patch +0 -76
- package/tools/morphgs/setup-on-cluster.sh +0 -126
- package/tools/projflow/driver.py +0 -1069
- package/tools/projflow/generate.mjs +0 -805
- package/tools/projflow/hml22-to-cskel27.mjs +0 -735
- package/tools/projflow/line-edit-job.mjs +0 -547
- package/tools/projflow/replay.mjs +0 -452
- package/tools/projflow/runner.mjs +0 -269
- package/tools/projflow/service.mjs +0 -742
- package/tools/track/DESIGN.md +0 -513
- package/tools/track/backfill-provenance.mjs +0 -116
- package/tools/track/budget.mjs +0 -8
- package/tools/track/check-rig.mjs +0 -209
- package/tools/track/diagnostics.schema.json +0 -60
- package/tools/track/export-rig.mjs +0 -256
- package/tools/track/fallback.mjs +0 -7
- package/tools/track/fk-parity-fixture.mjs +0 -161
- package/tools/track/gate.mjs +0 -349
- package/tools/track/masks.mjs +0 -318
- package/tools/track/metrics.mjs +0 -201
- package/tools/track/publish-obs.mjs +0 -108
- package/tools/track/py/check_env.py +0 -61
- package/tools/track/py/eval_lr.py +0 -229
- package/tools/track/py/lr_viterbi.py +0 -294
- package/tools/track/py/masks.py +0 -405
- package/tools/track/py/objective.py +0 -382
- package/tools/track/py/rig.py +0 -508
- package/tools/track/py/scene.py +0 -326
- package/tools/track/py/test_joint_indices.py +0 -123
- package/tools/track/py/test_lr_viterbi.py +0 -195
- package/tools/track/py/test_masks.py +0 -229
- package/tools/track/py/test_rig.py +0 -288
- package/tools/track/py/test_scene.py +0 -354
- package/tools/track/py/test_track.py +0 -328
- package/tools/track/py/track.py +0 -411
- package/tools/track/remote.mjs +0 -140
- package/tools/track/rig-dump.mjs +0 -227
- package/tools/track/run-box-tests.mjs +0 -14
- package/tools/track/run-box.mjs +0 -168
- package/tools/track/setup-box.sh +0 -59
- package/tools/track/study-2d.mjs +0 -728
- /package/src/{ardy → motion}/collision-blockers.js +0 -0
- /package/src/{ardy → motion}/ground.js +0 -0
- /package/src/{ardy → motion}/ik-drag.js +0 -0
- /package/src/{ardy → motion}/ik-key-json.js +0 -0
- /package/src/{ardy → motion}/ik.js +0 -0
- /package/src/{ardy → motion}/physics-surface.js +0 -0
- /package/src/{ardy → motion}/playback-clock.js +0 -0
- /package/src/{ardy → motion}/range-pin.js +0 -0
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Extract the cskel27 rest rotations (Rb) from a CozyClay T-pose FBX rig.
|
|
4
|
-
*
|
|
5
|
-
* Rb is the rotation part of each bone's rest (bind) transform in the
|
|
6
|
-
* armature root's space. The ARDY retarget feeds it into
|
|
7
|
-
* `basis = Rb^T @ L @ Rb` (CozyClay motion_retarget.py), where it is the
|
|
8
|
-
* Blender-side `bone.matrix_local.to_3x3()` -- the bone's rest orientation in
|
|
9
|
-
* armature space, NOT its parent-relative rotation and NOT its world
|
|
10
|
-
* orientation including the FBX object transform. Bind data comes from the
|
|
11
|
-
* skeleton's boneInverses (three.js FBXLoader builds those from the FBX
|
|
12
|
-
* TransformLink matrices, the authoritative bind), with the armature
|
|
13
|
-
* container's own world transform divided out.
|
|
14
|
-
*
|
|
15
|
-
* Usage: node tools/ardy/extract-rest.mjs
|
|
16
|
-
* Writes: public/ardy/cskel27-rest.json (x-bot rig), 27 entries in cskel27
|
|
17
|
-
* index order. Also extracts y-bot-tpose.fbx and prints the maximum
|
|
18
|
-
* per-joint angular difference between the two rigs' rest rotations.
|
|
19
|
-
*
|
|
20
|
-
* Exits non-zero if any emitted matrix fails the orthonormality + det checks
|
|
21
|
-
* (same tolerances as motion_retarget._validate_rotation_matrix).
|
|
22
|
-
*/
|
|
23
|
-
import * as THREE from "three";
|
|
24
|
-
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader.js";
|
|
25
|
-
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
26
|
-
import { dirname, resolve } from "node:path";
|
|
27
|
-
import { fileURLToPath } from "node:url";
|
|
28
|
-
// Project matcher primitive: strip every non-alphanumeric char, lowercase.
|
|
29
|
-
// Reused here so the FBX side and the pose studio can never drift apart.
|
|
30
|
-
import { normalizeBoneName } from "../../src/poses.js";
|
|
31
|
-
|
|
32
|
-
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
33
|
-
const MODEL_DIR = resolve(HERE, "../../public/models");
|
|
34
|
-
const OUT_FILE = resolve(HERE, "../../public/ardy/cskel27-rest.json");
|
|
35
|
-
|
|
36
|
-
/** cskel27 joint order; array index == npz joint index. Verbatim from
|
|
37
|
-
* motion_retarget.CSKEL27_JOINTS. */
|
|
38
|
-
const CSKEL27_JOINTS = [
|
|
39
|
-
"Hips", "Spine", "Spine1", "Spine2", "Spine3", "Neck", "Head",
|
|
40
|
-
"RightShoulder", "RightArm", "RightForeArm", "RightHand",
|
|
41
|
-
"RightHandEnd", "RightHandThumb1",
|
|
42
|
-
"LeftShoulder", "LeftArm", "LeftForeArm", "LeftHand",
|
|
43
|
-
"LeftHandEnd", "LeftHandThumb1",
|
|
44
|
-
"RightUpLeg", "RightLeg", "RightFoot", "RightToeBase",
|
|
45
|
-
"LeftUpLeg", "LeftLeg", "LeftFoot", "LeftToeBase",
|
|
46
|
-
];
|
|
47
|
-
|
|
48
|
-
/** Mirrors ROTATION_MATRIX_TOLERANCE in CozyClay motion_retarget.py. */
|
|
49
|
-
const ROTATION_MATRIX_TOLERANCE = 1e-3;
|
|
50
|
-
|
|
51
|
-
// FBXLoader touches two browser globals on paths this script never exercises
|
|
52
|
-
// (embedded-texture blob URLs, camera aspect fallback). Keep the loader
|
|
53
|
-
// loadable under Node without pretending those paths work. No fetch/self shim
|
|
54
|
-
// is needed: parse() reads the buffer directly and FBXLoader never references
|
|
55
|
-
// `self`.
|
|
56
|
-
if (typeof globalThis.window === "undefined") {
|
|
57
|
-
globalThis.window = {
|
|
58
|
-
innerWidth: 1920,
|
|
59
|
-
innerHeight: 1080,
|
|
60
|
-
URL: {
|
|
61
|
-
createObjectURL(blob) {
|
|
62
|
-
if (typeof URL.createObjectURL === "function") {
|
|
63
|
-
return URL.createObjectURL(blob);
|
|
64
|
-
}
|
|
65
|
-
throw new Error(
|
|
66
|
-
"extract-rest: embedded FBX texture loading is not supported under Node"
|
|
67
|
-
);
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** The project's bone-matching rule (poses.js boneMatches): normalised names
|
|
74
|
-
* equal, or one is a suffix of the other (`mixamorigleftarm` vs `leftarm`). */
|
|
75
|
-
function matchesJoint(boneName, cskelName) {
|
|
76
|
-
const norm = normalizeBoneName(boneName);
|
|
77
|
-
const target = normalizeBoneName(cskelName);
|
|
78
|
-
return norm === target || norm.endsWith(target) || target.endsWith(norm);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/** Find the control skeleton of a parsed FBX root: the one whose root bone
|
|
82
|
-
* hangs off the armature container (a non-bone). Mixamo exports also nest an
|
|
83
|
-
* identity "skinned" copy of every bone under its control bone; those copy
|
|
84
|
-
* skeletons fail this test (their root's parent is a bone), so this rule
|
|
85
|
-
* picks the real hierarchy skeleton regardless of mesh order. */
|
|
86
|
-
function findControlSkeleton(root) {
|
|
87
|
-
const candidates = [];
|
|
88
|
-
root.traverse((object) => {
|
|
89
|
-
if (!object.isSkinnedMesh || !object.skeleton) return;
|
|
90
|
-
const skeleton = object.skeleton;
|
|
91
|
-
if (!skeleton.bones.length) return;
|
|
92
|
-
const rootBone = skeleton.bones.find(
|
|
93
|
-
(bone) => !bone.parent || !bone.parent.isBone
|
|
94
|
-
);
|
|
95
|
-
if (rootBone) candidates.push({ skeleton, rootBone });
|
|
96
|
-
});
|
|
97
|
-
if (!candidates.length) {
|
|
98
|
-
throw new Error("no skinned skeleton with a non-bone root found");
|
|
99
|
-
}
|
|
100
|
-
if (candidates.length > 1) {
|
|
101
|
-
console.warn(
|
|
102
|
-
`extract-rest: ${candidates.length} control skeletons; using the first`
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
return candidates[0];
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/** Load a rig and index every bind bone by normalised name.
|
|
109
|
-
* Returns Map<normalised name, { name, bind }> where `bind` is the bone's
|
|
110
|
-
* rest (bind) transform in armature space as a Matrix4. */
|
|
111
|
-
function loadRig(rigName) {
|
|
112
|
-
const path = resolve(MODEL_DIR, `${rigName}.fbx`);
|
|
113
|
-
const buffer = readFileSync(path);
|
|
114
|
-
const arrayBuffer = buffer.buffer.slice(
|
|
115
|
-
buffer.byteOffset,
|
|
116
|
-
buffer.byteOffset + buffer.byteLength
|
|
117
|
-
);
|
|
118
|
-
const root = new FBXLoader().parse(arrayBuffer, path);
|
|
119
|
-
root.updateMatrixWorld(true);
|
|
120
|
-
|
|
121
|
-
const { skeleton, rootBone } = findControlSkeleton(root);
|
|
122
|
-
// Blender's matrix_local divides out the armature object's world
|
|
123
|
-
// transform; the FBX analogue is the skeleton root's non-bone parent.
|
|
124
|
-
const armatureWorld = rootBone.parent
|
|
125
|
-
? rootBone.parent.matrixWorld
|
|
126
|
-
: new THREE.Matrix4();
|
|
127
|
-
const toArmature = armatureWorld.clone().invert();
|
|
128
|
-
|
|
129
|
-
const bindByName = new Map();
|
|
130
|
-
skeleton.bones.forEach((bone, index) => {
|
|
131
|
-
const bindGlobal = skeleton.boneInverses[index].clone().invert();
|
|
132
|
-
// Keep the full Matrix4: Quaternion.setFromRotationMatrix reads 4x4
|
|
133
|
-
// element indices, so a Matrix3 would silently produce NaN.
|
|
134
|
-
const bind = toArmature.clone().multiply(bindGlobal);
|
|
135
|
-
bindByName.set(normalizeBoneName(bone.name), { name: bone.name, bind });
|
|
136
|
-
});
|
|
137
|
-
return bindByName;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/** Column-major Matrix3 -> row-major 3x3 arrays. The JSON schema is
|
|
141
|
-
* row-major, matching motion_retarget's nested-list matrices. */
|
|
142
|
-
function rowMajor(m3) {
|
|
143
|
-
const e = m3.elements;
|
|
144
|
-
return [
|
|
145
|
-
[e[0], e[3], e[6]],
|
|
146
|
-
[e[1], e[4], e[7]],
|
|
147
|
-
[e[2], e[5], e[8]],
|
|
148
|
-
];
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/** Verify an orthonormal proper rotation exactly like
|
|
152
|
-
* motion_retarget._validate_rotation_matrix: every row and column must have
|
|
153
|
-
* squared norm 1 and pairwise dot 0 within the tolerance, and the determinant
|
|
154
|
-
* must be +1 within the tolerance. Returns null when valid, else a
|
|
155
|
-
* description of the failure. */
|
|
156
|
-
function validateRotationMatrix(rows) {
|
|
157
|
-
const tolerance = ROTATION_MATRIX_TOLERANCE;
|
|
158
|
-
const columns = [
|
|
159
|
-
[rows[0][0], rows[1][0], rows[2][0]],
|
|
160
|
-
[rows[0][1], rows[1][1], rows[2][1]],
|
|
161
|
-
[rows[0][2], rows[1][2], rows[2][2]],
|
|
162
|
-
];
|
|
163
|
-
for (const vectors of [rows, columns]) {
|
|
164
|
-
for (const vector of vectors) {
|
|
165
|
-
const squaredNorm =
|
|
166
|
-
vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2];
|
|
167
|
-
if (
|
|
168
|
-
!Number.isFinite(squaredNorm) ||
|
|
169
|
-
Math.abs(squaredNorm - 1) > tolerance
|
|
170
|
-
) {
|
|
171
|
-
return `squared norm ${squaredNorm}`;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
for (const [first, second] of [[0, 1], [0, 2], [1, 2]]) {
|
|
175
|
-
const dot =
|
|
176
|
-
vectors[first][0] * vectors[second][0] +
|
|
177
|
-
vectors[first][1] * vectors[second][1] +
|
|
178
|
-
vectors[first][2] * vectors[second][2];
|
|
179
|
-
if (!Number.isFinite(dot) || Math.abs(dot) > tolerance) {
|
|
180
|
-
return `pairwise dot ${dot}`;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
const determinant =
|
|
185
|
-
rows[0][0] * (rows[1][1] * rows[2][2] - rows[1][2] * rows[2][1]) -
|
|
186
|
-
rows[0][1] * (rows[1][0] * rows[2][2] - rows[1][2] * rows[2][0]) +
|
|
187
|
-
rows[0][2] * (rows[1][0] * rows[2][1] - rows[1][1] * rows[2][0]);
|
|
188
|
-
if (!Number.isFinite(determinant) || Math.abs(determinant - 1) > tolerance) {
|
|
189
|
-
return `determinant ${determinant}`;
|
|
190
|
-
}
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/** Orthonormalise a near-rotation matrix and emit it. The quaternion
|
|
195
|
-
* round-trip yields the closest proper rotation, so the emitted matrix always
|
|
196
|
-
* satisfies the rotation checks; the RAW bind matrix is validated first,
|
|
197
|
-
* which is the check that can actually fail (scale/shear/reflection would
|
|
198
|
-
* survive the tolerance and must not be shipped as a rest rotation). */
|
|
199
|
-
function restRotationRows(bind, jointName) {
|
|
200
|
-
const rawFailure = validateRotationMatrix(rowMajor(new THREE.Matrix3().setFromMatrix4(bind)));
|
|
201
|
-
if (rawFailure !== null) {
|
|
202
|
-
throw new Error(
|
|
203
|
-
`${jointName}: raw bind matrix is not a proper rotation (${rawFailure})`
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
const closest = new THREE.Matrix4()
|
|
207
|
-
.makeRotationFromQuaternion(new THREE.Quaternion().setFromRotationMatrix(bind));
|
|
208
|
-
const rows = rowMajor(new THREE.Matrix3().setFromMatrix4(closest));
|
|
209
|
-
const emittedFailure = validateRotationMatrix(rows);
|
|
210
|
-
if (emittedFailure !== null) {
|
|
211
|
-
throw new Error(
|
|
212
|
-
`${jointName}: orthonormalised rest rotation failed validation (${emittedFailure})`
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
return rows;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/** Angle in degrees between two rotations (the rotation of q1^-1 @ q2). */
|
|
219
|
-
function angleDegrees(q1, q2) {
|
|
220
|
-
const relative = q1.clone().invert().multiply(q2);
|
|
221
|
-
const axisLength = Math.hypot(relative.x, relative.y, relative.z);
|
|
222
|
-
return (2 * Math.atan2(axisLength, relative.w) * 180) / Math.PI;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
function main() {
|
|
226
|
-
const xRig = loadRig("x-bot-tpose");
|
|
227
|
-
|
|
228
|
-
const joints = [];
|
|
229
|
-
const missing = [];
|
|
230
|
-
for (let index = 0; index < CSKEL27_JOINTS.length; index++) {
|
|
231
|
-
const name = CSKEL27_JOINTS[index];
|
|
232
|
-
let matchedBone = null;
|
|
233
|
-
let rest = null;
|
|
234
|
-
for (const entry of xRig.values()) {
|
|
235
|
-
if (matchesJoint(entry.name, name)) {
|
|
236
|
-
matchedBone = entry.name;
|
|
237
|
-
rest = restRotationRows(entry.bind, name);
|
|
238
|
-
break;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
if (matchedBone === null) missing.push(name);
|
|
242
|
-
joints.push({ name, index, matched_bone: matchedBone, rest });
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
const json = {
|
|
246
|
-
schema: "cskel27.rest.v1",
|
|
247
|
-
rig: "x-bot-tpose",
|
|
248
|
-
joints,
|
|
249
|
-
missing,
|
|
250
|
-
};
|
|
251
|
-
mkdirSync(dirname(OUT_FILE), { recursive: true });
|
|
252
|
-
writeFileSync(OUT_FILE, `${JSON.stringify(json, null, 2)}\n`);
|
|
253
|
-
|
|
254
|
-
const resolved = joints.filter((joint) => joint.rest !== null).length;
|
|
255
|
-
console.log(`wrote ${OUT_FILE}`);
|
|
256
|
-
console.log(`resolved ${resolved}/${CSKEL27_JOINTS.length} cskel27 joints`);
|
|
257
|
-
for (const joint of joints) {
|
|
258
|
-
const match = joint.matched_bone ?? "MISSING";
|
|
259
|
-
console.log(` ${joint.index.toString().padStart(2)} ${joint.name.padEnd(15)} -> ${match}`);
|
|
260
|
-
}
|
|
261
|
-
console.log(`missing: ${missing.length ? missing.join(", ") : "none"}`);
|
|
262
|
-
|
|
263
|
-
// Same extraction against the y-bot rig; the gap between the two rigs'
|
|
264
|
-
// rest rotations is why poses travel as deltas, not absolute rotations.
|
|
265
|
-
const yRig = loadRig("y-bot-tpose");
|
|
266
|
-
let maxAngle = -1;
|
|
267
|
-
let maxJoint = null;
|
|
268
|
-
let compared = 0;
|
|
269
|
-
for (const joint of joints) {
|
|
270
|
-
if (joint.rest === null) continue;
|
|
271
|
-
const yEntry = yRig.get(normalizeBoneName(joint.matched_bone));
|
|
272
|
-
if (!yEntry) continue;
|
|
273
|
-
compared += 1;
|
|
274
|
-
const angle = angleDegrees(
|
|
275
|
-
new THREE.Quaternion().setFromRotationMatrix(
|
|
276
|
-
new THREE.Matrix4().setFromMatrix3(matrixFromRows(joint.rest))
|
|
277
|
-
),
|
|
278
|
-
new THREE.Quaternion().setFromRotationMatrix(yEntry.bind)
|
|
279
|
-
);
|
|
280
|
-
if (angle > maxAngle) {
|
|
281
|
-
maxAngle = angle;
|
|
282
|
-
maxJoint = joint.name;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
console.log(
|
|
286
|
-
`max per-joint rest rotation difference x-bot vs y-bot: ${maxAngle.toFixed(3)} deg (${maxJoint}, ${compared} joints compared)`
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/** Row-major nested arrays -> Matrix3. Matrix3.set takes row-major arguments. */
|
|
291
|
-
function matrixFromRows(rows) {
|
|
292
|
-
return new THREE.Matrix3().set(
|
|
293
|
-
rows[0][0], rows[0][1], rows[0][2],
|
|
294
|
-
rows[1][0], rows[1][1], rows[1][2],
|
|
295
|
-
rows[2][0], rows[2][1], rows[2][2]
|
|
296
|
-
);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
main();
|