slice_hands
Slice B of **CHAFF**. The hero subject of a film shot entirely from inside one man's head: two gloved hands, two forearms, a twelve-round bolt-driver, and the visor between him and hard vacuum. In frame in all fourteen shots.
slice_hands — the hands, the bolt-driver and the visor
Slice B of CHAFF. The hero subject of a film shot entirely from inside one man's head: two gloved hands, two forearms, a twelve-round bolt-driver, and the visor between him and hard vacuum. In frame in all fourteen shots.
local Hands = require("demo.chaff.slice_hands")
Registers itself with demo.chaff.film as b.hands (and as e.handsKick, see
below) and is driven by FilmDirector. It never ticks on its own.
The ammunition is the film's clock
The weapon is the diver's only thruster, so twelve rounds going to zero is the
structure of the whole piece. FIRE is the single list of when each round goes,
and a flash, a casing, a bolt cycle, a drum step, a counter digit, a shove on
the viewmodel and a shove on the head all come off it. Add an entry and all
seven happen together.
| shot | rounds | counter |
|---|---|---|
| 5 | three into the hero drone | 12 → 9 |
| 6 | nine as thrust, to kill the spin | 9 → 0 |
| 7 | the last spare seats, and it holds four | 0 → 4 |
| 9 | one down the gallery | 4 → 3 |
| 10 | two fired back the way he came | 3 → 1 |
| 12 | one at contact range | 1 → 0 |
Hands.ammoAt(t) answers what the counter reads at any film second, and
Hands.recoil(t) what the recoil is doing. Both are pure functions of t — a
seek to a second gives the same answer as playing to it.
What it puts on screen
- A hand is a wrist, a palm, four three-bone fingers and a two-bone thumb, posed from curls rather than from angles. The left hand is the same rig with every x mirrored and a mirrored palm mesh.
- The forearm is aimed at the shoulder every frame and stretched to reach part of the way, so it runs back out of frame from any hand station instead of standing up into the picture.
- The bolt-driver is a receiver, a finned barrel and hex brake, a twelve-round drum whose rounds stand proud of its face, a grip, a foregrip, a reciprocating bolt, a brace, and a seven-segment counter in a recessed bezel canted up and left so it faces the eye whenever the weapon is read.
- The visor is a ring of forty ticks that hugs the frame edge whatever the lens is doing, a sweep index, a reticle at constant angular size, and an auto-tint pane that takes stops out on a muzzle flash and at the breach.
- The gloves go from clean grey to gold-dusted across the film, and tear at the left knuckle from the frame the vane is shoved aside.
Two things worth knowing before changing it
The rig lives under a half turn. The film's camera stands on Eye and looks
at EyeAim, which is at Eye's local +Z — so the camera is Eye turned a half
turn about Y. B_VM carries that turn, and everything inside it is authored in
the ordinary engine basis: +X screen right, +Y up, -Z the way he is looking.
Lens compensation is a scale AND a division. Scaling the rig alone does
nothing — scaling a model and its distance together leaves the angle it subtends
unchanged. B_Sway is scaled by zoom and every station is divided by it,
which holds the distance fixed and changes only the size.
The frame's kick, and how slice D takes it over
The head is slice D's; nothing else may author its station. But a round that
does not move the camera is not this film's thesis, so this slice registers a
second participant, e.handsKick, whose name sorts after d.look: it runs once
D has placed the head and adds the recoil on top, then D recomputes its own
station from its own data next frame, so nothing accumulates.
To take it over, set Hands.applyCameraKick = false and drive the head from
Hands.recoil(t), which returns { back, up, roll, side }.
The viewmodel's own light
B_VMKey, B_VMFill and B_VMRim hang off B_VM and travel with the head.
They exist because this world has no sky and no environment probe: a metal
surface has no diffuse term and nothing to reflect, so a weapon lit only by the
scene is a black cut-out for ninety-four seconds. They stand three to four
metres off — a point light half a metre from a forearm falls off by a factor of
nine across the length of it — and their colour follows the film, ochre bounce
off the grain for two acts and raw sun by the breach.
Files
| Path | What |
|---|---|
demo/chaff/slice_hands.module | this slice: the fire list, the poses, the shot script, the frame |
demo/chaff/vmRig.module | quaternion maths, the entity hierarchy, the rig lights |
demo/chaff/vmParts.module | every solid, as geometry |
demo/chaff/vmGeom.module | the loft kit the solids are built with |
demo/chaff/meshes/viewmodel/ | the baked .mesh assets |
demo/chaff/materials/suit/ | glove, sleeve, steel, grip, glass, HUD, brass |
The meshes and materials are baked once, in edit, by the generators in
vmParts — build() only spawns entities and references them by name.
Scoped to this part · feeds back into the world's score.