fix(rig): curl the fingers, derive the arm angle

Two defects from the 0.2.0 review, both fixed and both measured.

- Fingers splayed because the bind is an A-pose hand. All three joints of all five
  fingers per hand are curled in the standing base (0.28/0.34/0.22 rad), with the
  curl axis probed on the rig first. The front shot now shows relaxed hands.
- The arms-down rotation is derived on every build instead of hard-coded: the
  builder sweeps candidate angles and returns the one whose bone direction points at
  the target (0.60 rad, direction dot 1.000 this build). The old 0.55 was a
  hand-swept constant.
- Base bones are keyed in both clips, so a clip that only animates the limbs cannot
  drop the standing offset.

Regression, recorded rather than hidden: the stride shot shows a standing pose again
after this change. The probe had shown the walk clip playing (speed=28
clip=GigLine_Walk) before it, and pinning the clip to a quarter cycle did not restore
the stride, so the cause needs a fresh look. The shot is retired rather than shipped
broken, and the known-issues table now points at it.
This commit is contained in:
zwitschi committed 2026-11-09 12:48:40 +01:00
1 parent 30e4d65743
commit 03af8146a6
48 files changed
+162 -78

No files matched your search

@@ -92,6 +92,17 @@ void AGigLineShotActor::UpdateFollowCamera()
if (AGigLineCharacter* Character = Cast<AGigLineCharacter>(Pawn))
{
Character->SetReviewWalk(true);
// Park the walk clip at a quarter cycle the first frame of the shot, so the
// capture lands mid-stride. Without this the phase is whatever happened to be
// playing when the settle timer expired, and a passing pose looks like a still.
if (!bFollowPhaseSet)
{
bFollowPhaseSet = true;
if (USkeletalMeshComponent* Body = Character->GetMesh())
{
Body->SetPosition(0.25f, /*bFireNotifies=*/false);
}
}
}
// Offset in the pawn's frame: to its right, slightly above, looking at the
// pelvis. Right-of-pawn gives a profile view, which is where a stride reads.
@@ -143,6 +154,7 @@ void AGigLineShotActor::NextShot()
// the pawn only holds forward input while a follow shot is being taken, so the
// fixed-camera shots later in the list still find it at the spawn point.
const bool bFollowThisShot = ShotFollow.IsValidIndex(CurrentShot) && ShotFollow[CurrentShot];
bFollowPhaseSet = false;
if (AGigLineCharacter* Character = Cast<AGigLineCharacter>(UGameplayStatics::GetPlayerPawn(this, 0)))
{
Character->SetReviewWalk(bFollowThisShot);