test(vehicle): clamping the velocity to zero does not stop the rise - the transform is written

The decisive clamp: zero linear and angular velocity every frame for two seconds.

  t=0.25 Z=3220 vZ=0 | t=0.75 Z=3683 vZ=0 | t=1.25 Z=4197 vZ=0

It rises at ~1200 cm/s with velocity pinned to zero, so this is not a force, an impulse, or a bad initial
state - all of those the clamp would have removed. Something calls a transform setter on the vehicle every
frame.

Our own source contains exactly one direct transform write outside the character (the shot actor's camera),
so the writer is engine-side: the Chaos vehicle component driving UpdatedComponent from a vehicle state that
was never created, or a skeletal-mesh transform update.

Also diffed the two maps, since the pawn works in ReviewMap and not in DemoMap: kill_z, gravity, lights and
partitioning are identical; DemoMap adds 593 static mesh actors, a height fog and a post-process volume,
ReviewMap adds a shot actor and the character. Nothing in either list can write a transform, so the map
difference is not in its actors or settings.
This commit is contained in:
zwitschi committed 2026-11-09 22:11:13 +01:00
1 parent 331e2016be
commit 387a4530de
78 files changed
+111 -76

No files matched your search

@@ -359,6 +359,17 @@ void AGigLineVehicle::Tick(float DeltaSeconds)
}
}
// Kill any injected velocity every frame for the first two seconds. If the pawn still rises, the
// writer sets the transform directly; if it settles, the whole thing was one bad initial impulse.
if (SettleElapsed < 2.0f)
{
if (USkeletalMeshComponent* Body = GetMesh())
{
Body->SetPhysicsLinearVelocity(FVector::ZeroVector);
Body->SetPhysicsAngularVelocityInDegrees(FVector::ZeroVector);
}
}
// Velocity profile: an impulse shows as a spike at t=0, a force as steady growth.
{
static float NextSample = 0.0f;