Give machine props world-space 3D form that rotates with the camera

Scene shapes, cable anchors, bar angles, pad perpendiculars, and roller
offsets all resolve in the authored view exactly as before, then rotate
about the world-vertical axis through the root anchor - the same
resolve-then-rotate pattern as the figure's pins and the mat - so at the
authored yaw every exercise renders bit-identically to today, and under
an orbiting camera the equipment turns with the figure while staying
welded to its hands and feet. Scene lines gain an optional depth plane
(z) and slab extrusion (depth) so seats, backrests, and platforms keep
form edge-on; the rect shape is retired (re-authored as slab lines).
All 14 machines' props re-authored with depths and verified at eight
orbit angles. The fixture snapshots move into the pipeline as
render.py --fixtures and now cover orbit-presentation samples with
resolved prop primitives for a spread of prop flavors; the in-app
renderer resolves props in MotionSolver (lockstep with resolve_props)
and the view just draws primitives.

Claude-Session: https://claude.ai/code/session_01HJDQQDA9QdP8zByg43H5v3
This commit is contained in:
2026-07-06 22:15:45 -04:00
parent ed906535b6
commit 81186c51b1
92 changed files with 723 additions and 403 deletions
+10 -8
View File
@@ -140,20 +140,22 @@ enum PropJointRef: Codable {
}
}
/// One static shape of a `scene` prop, in canvas coordinates.
/// One static shape of a `scene` prop, authored in canvas coordinates in the
/// authored view, with world-space 3D form for the orbiting presentation.
struct PropSceneShape: Codable {
let kind: String // "line" | "circle" | "rect"
/// line: polyline points; `w` is the stroke width.
let kind: String // "line" | "circle"
/// line: polyline points, `[x, y]` or `[x, y, z]`; `w` is the stroke width.
let pts: [[Double]]?
let w: Double?
/// circle: center + radius; `fill` false draws an outline.
let c: [Double]?
let r: Double?
let fill: Bool?
/// rect: origin + size (`w`/`h`), corner radius `r`; always filled.
let x: Double?
let y: Double?
let h: Double?
/// The shape's depth plane (+ toward the camera in the authored view).
let z: Double?
/// Extrusion half-width: a line with `depth` is a slab (a seat, a platform)
/// that opens into a swept quad as the camera orbits.
let depth: Double?
/// Optional palette override: `"prop"` for the darker attached-item gray.
let color: String?
}
@@ -164,7 +166,7 @@ struct MotionProp: Codable {
let type: String // "scene" | "cable" | "bar" | "dumbbell" | "pad" | "roller"
/// scene: the static shapes.
let shapes: [PropSceneShape]?
/// cable: fixed anchor `[x, y]` moving joint `to`.
/// cable: fixed anchor `[x, y]` or `[x, y, z]` moving joint `to`.
let from: [Double]?
let to: PropJointRef?
/// bar/dumbbell/pad: the joint(s) the item is centered on.