Skip to content

Commit 663fa03

Browse files
TMHSDigitalclaude
andcommitted
fix(examples): redesign damped-track-aim as a ring of spotlights aimed at a glowing orb
The spike cage bled past three edges, blew out its core and showed a stray plinth crescent. The subject is now twelve lathed spotlight heads: red enamel cans with brass bezels, steel cooling fins, tilt-lock knobs and warm lenses on local +Z. They stand on steel stands with ball pivots at alternating low and high heights, in an open ring around an amber orb on a turned brass pedestal. Every head is created with an identity rotation, so DAMPED_TRACK alone swings each lens onto the orb: heads above it aim down, heads below aim up. The ring opens toward the camera so no head hides the orb. The check logic is unchanged (renamed Needle/Core -> Lamp/Orb). The render path now runs the gallery_framing gate (exit 10). The old Framing deviation is gone, since the composition sits inside the Layer 1 band. The no-file exit moves from 10 to 12. The view transform moves from Filmic to Standard per VISUAL-STYLE. Evidence (live runs, local): - .scratch/blender-5.2.1-windows-x64/blender.exe (Blender 5.2.1 LTS): check-only exit 0, "12 DAMPED_TRACK lamp heads -> Orb on TRACK_Z; worst aim dot=1.000000". --mute exits 7 ("Lamp_00 mute=True influence=1.0"). Aim-dot probe (scratch copy reading the lens axis as -Z, deleted after) exits 9: "aim dot=-1.000000 (179.97 deg) < 0.998". - .scratch/blender-4.5.11-windows-x64/blender.exe (Blender 4.5.11 LTS): check-only exit 0, same output. The render path ran on 5.2.1 only. - Framing: fill x=0.712 y=0.756, margins l=0.144 r=0.144 b=0.128 t=0.117. - Contact sheet (docs/gallery/contact-sheets/damped-track-aim-contact-sheet.webp): candidate luma 0.237 / stage 0.218 / warmth +0.105 / sat 0.178, against armature-bend 0.279/0.213/-0.428/0.144 (pre-redesign hero at this base) and bmesh-gear 0.236/0.177/+0.303/0.250. Luma matches bmesh-gear. The stage is slightly brighter because of the warm wedge pool on the upper-right wall. Warmth and saturation sit inside the set's range. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 9123f54 commit 663fa03

7 files changed

Lines changed: 263 additions & 214 deletions

File tree

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ harness asserts `exit_pre-ok` after the process exits. Skips 4.5
720720
</tr>
721721
<tr>
722722
<td width="46%" valign="middle">
723-
<a href="examples/damped-track-aim/"><img src="examples/damped-track-aim/preview.webp" alt="Damped Track aim: brass spikes in a tilted cage around an ember core on a dark studio plinth, each tip constrained toward the center" /></a>
723+
<a href="examples/damped-track-aim/"><img src="examples/damped-track-aim/preview.webp" alt="Damped Track aim: twelve red-and-brass spotlight heads on stands in an open ring, each lens constrained to face a glowing amber orb on a brass pedestal" /></a>
724724
</td>
725725
<td valign="middle">
726726

9.5 KB
Loading
-9.58 KB
Loading

‎examples/damped-track-aim/README.md‎

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
# Damped Track Aim
22

3-
A runnable example that aims twelve brass spikes at an ember core with
3+
A runnable example that swings twelve spotlight heads onto one glowing orb with
44
`Object.constraints.new('DAMPED_TRACK')` — the data-API path, not
55
`bpy.ops.object.constraint_add` (which needs an active object and fails in
66
headless loops). Damped Track is the twist-stable aim constraint: it points one
77
local axis at a target without the roll fights Track To is known for.
88

9-
**What it witnesses:** every spike carries exactly one unmuted `DAMPED_TRACK`
10-
bound to the core on `TRACK_Z`. After a depsgraph update, each evaluated local
11-
`+Z` aligns with the world vector toward the core (dot ≥ 0.998 ≈ 3.6°). A missing
9+
Each head is lathed with its lens on local `+Z` and created with an identity
10+
rotation, standing in an open ring at alternating low and high heights. Only the
11+
constraint turns the lenses onto the orb, so heads above it aim down and heads
12+
below it aim up. In the still, every lens facing the orb is the aim.
13+
14+
**What it witnesses:** every lamp head carries exactly one unmuted `DAMPED_TRACK`
15+
bound to the orb on `TRACK_Z`. After a depsgraph update, each evaluated local
16+
`+Z` aligns with the world vector toward the orb (dot ≥ 0.998 ≈ 3.6°). A missing
1217
constraint, a muted one, a `TRACK_TO` stand-in, or a flipped axis fails the
1318
check.
1419

15-
## Framing deviation
16-
17-
Radiating composition — the twelve spikes read as converging on the core from
18-
beyond the frame, so their tails bleed past the left, right, and bottom edges
19-
by design (measured fill 1.000x/0.917y with edge touch on three sides). If
20-
wired to `examples/gallery_framing.py`, call it with
21-
`deviation="radiating composition; spikes read as extending past frame"`.
20+
The stands, ball pivots and the orb's pedestal are render-only staging, built after
21+
the check. The ring opens toward the camera so no head hides the orb. The render
22+
path gates framing through `examples/gallery_framing.py` (exit 10) before writing the
23+
still.
2224

2325
## Run
2426

@@ -44,16 +46,16 @@ against it.
4446
| 0 | Success |
4547
| 1 | Uncaught exception (FATAL wrapper) |
4648
| 2 | argparse / usage |
47-
| 3 | Needle count ≠ 12 |
48-
| 4 | Needle does not carry exactly one DAMPED_TRACK |
49-
| 5 | Constraint target is not Core |
49+
| 3 | Lamp count ≠ 12 |
50+
| 4 | Lamp does not carry exactly one DAMPED_TRACK |
51+
| 5 | Constraint target is not Orb |
5052
| 6 | `track_axis` is not TRACK_Z |
5153
| 7 | Constraint muted or influence < 1 (`--mute` lands here) |
5254
| 8 | TRACK_TO still present |
5355
| 9 | Evaluated aim dot below 0.998 |
54-
| 10 | `--output` produced no file |
56+
| 10 | Framing gate violation on the `--output` path (`gallery_framing`) |
57+
| 12 | `--output` produced no file |
5558

5659
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
5760
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
5861
Smoke does not pass `--output` or `--mute`.
59-

0 commit comments

Comments
 (0)