Model head anchors and independent pose timing
This commit is contained in:
parent
a45e89f4e4
commit
49ece8dee6
17 changed files with 521 additions and 215 deletions
|
|
@ -339,54 +339,47 @@ head is placed and scaled where it belongs and the rest of the frame is simply
|
|||
not on stage. The full frame stays *available* for tracing without being
|
||||
*visible*, and those are different requirements.
|
||||
|
||||
## The anchor: stabilisation is a channel, not a mode
|
||||
## Head motion: free or anchored to measured frames
|
||||
|
||||
`stabilize` produces `{s, θ, tx, ty}` per frame, which is exactly
|
||||
`[:xform :scale]`, `[:xform :rot]` and `[:xform :pos]`. So removing the head's
|
||||
motion is not a pipeline setting — it is a question of **which node holds that
|
||||
motion**, and the answer is one channel definition:
|
||||
`stabilize` produces `{s, θ, tx, ty}` per source frame. Its inverse is stored
|
||||
densely on `:head`'s position, rotation and scale channels. The same measured
|
||||
track serves every placement choice:
|
||||
|
||||
```clojure
|
||||
;; locked: the head sits still, for tracing and for judging articulation
|
||||
[:xform :pos] {:animated? false :value [0.0 0.0]}
|
||||
|
||||
;; as filmed: the head moves around the stage
|
||||
[:xform :pos] {:animated? true :interp :hold
|
||||
:dense {:store "sha256:…" :stride 2 :frames 600}
|
||||
:generated {:by :anchor/similarity}}
|
||||
|
||||
;; per plate: the head snaps at each selected frame and holds
|
||||
[:xform :pos] {:animated? true :interp :hold :keys {0 […], 12 […], 23 […]}}
|
||||
;; no :anchors — free: read the measured transform at the current frame
|
||||
;; one key — lock to a chosen measured frame throughout
|
||||
:anchors {0 12}
|
||||
;; several keys — cut to another measured head transform at frame 40
|
||||
:anchors {0 12, 40 42}
|
||||
```
|
||||
|
||||
The three modes are the three channel shapes, on one channel, on one node. The
|
||||
third is the one a plate strip wants — the head pose is stable for exactly as
|
||||
long as a drawing is on screen — and it costs nothing because `:keys` already
|
||||
exists. Its frame set is the kept-frame set, which is `suggestPlateFrames` in the
|
||||
prototype and belongs to painting rather than to measurement.
|
||||
The map is `local change frame -> measured source frame`. A single lock is a
|
||||
one-key map. Position, rotation and scale read the same held source frame. The
|
||||
frame set belongs to head placement, independently of plate drawings and stage
|
||||
pose cuts. No measured block is copied into authored transform keys.
|
||||
|
||||
**Always measure, always store factored, toggle the parent.** The fit is computed
|
||||
and the geometry is stored head-local in every mode, and only the parent's
|
||||
channel changes. Two things downstream require it, and both would be lost by
|
||||
making this an analysis-time switch:
|
||||
**Always measure, always store factored.** The fit is computed and the geometry
|
||||
is stored head-local in every mode. Only the frame address used to read the
|
||||
head's measured transform changes. Two things downstream require that split:
|
||||
|
||||
- *Smoothing.* "Smooth the transform, never the contour" only means anything
|
||||
while the two are separate.
|
||||
- *Key selection.* A velocity minimum is "articulation paused" in head-local
|
||||
space and "the head happened to be still" in image space.
|
||||
|
||||
It also makes the toggle an edit to the document rather than a reason to
|
||||
re-analyse: tier 1, undoable, syncable, and instant.
|
||||
This is a document edit, not a reason to re-analyse. A registered tracing photo
|
||||
will use its own source frame's stabilising transform followed by the same
|
||||
selected head placement, so it aligns with the vectors drawn over it.
|
||||
|
||||
### Two nodes, because two different things want that transform
|
||||
|
||||
```
|
||||
:face group — AUTHORED. where the face sits on the stage, and how big.
|
||||
:head group — MEASURED. the head's motion, or identity.
|
||||
:head group — MEASURED. dense head motion read at the selected frame.
|
||||
:mouth :mouth-in :teeth :lid-r :lid-l :brow-r :brow-l …
|
||||
```
|
||||
|
||||
Switching modes rewrites `:head` and never touches `:face`, so it cannot move
|
||||
Changing anchor keys edits `:head` and never touches `:face`, so it cannot move
|
||||
something that was placed by hand. A group node is free, and keeping the authored
|
||||
and the measured transform apart is the whole reason the transform is decomposed
|
||||
in the first place.
|
||||
|
|
@ -627,12 +620,12 @@ Proof that it covers what exists, not just what is wanted:
|
|||
| brow ring + quantised raise | node `:brow-r`, `[:geom :pts]` dense (the traced ring with height removed), `[:xform :pos]` dense (the quantised raise). **The decomposition design.md insists on is two channels.** |
|
||||
| head plate, kept frames | node `:head`, `:symbol` per instance, keys on `[:symbol]` at kept frames |
|
||||
| `makeXform` face-oval crop | **gone.** Placement is `[:xform :*]` on `:face`; the stage clips |
|
||||
| `stabilize` transforms | `[:xform :*]` on `:head` — framed identity, dense, or keyed at kept frames |
|
||||
| `stabilize` transforms | dense `[:xform :*]` on `:head`, read through its optional `:anchors` map |
|
||||
| registered underlay | not data — a UI layer riding `(world-of resolver :head)` |
|
||||
| painted background cel | node per layer, `[:geom :pts]` **framed**, `[:style :color]` framed |
|
||||
| `mouth lead` | `:time {:offset k}` on performance nodes only |
|
||||
| `exposure` | `:time {:expose n}` on the clip root, inherited |
|
||||
| picture fps | `:time {:source-fps s :sample-fps p}` on the clip root, applied after analysis |
|
||||
| picture fps | resolver samples marked generated channels at the picture rate; authored keys keep their own time |
|
||||
| hand correction | an `:over` layer, `:offset` or `:replace` |
|
||||
|
||||
The brow row is the one worth looking at twice. `docs/design.md` argues at length
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue