fix(camera): smooth chase-camera Z follow so the jump arc is visible on screen
Diagnostic from K-fix10 confirmed our local jump physics is
mathematically perfect — every full-charge jump produces
formulaPeak = actualPeakDz = vz²/19.6 to four-digit precision
(3.11 m for Jump skill 208). Yet the user observed retail
clients seeing the SAME character jump much higher than ACdream
sees of itself.
Root cause: ChaseCamera tracked player.Z 1:1. When the player
rises 3 m the camera rises 3 m too — the player's screen
position never changes during the arc, so the jump is visually
invisible. Retail's chase camera lags the Z follow, so an
observer sees the player visibly rise on screen.
Fix: low-pass filter the camera's Z target.
ChaseCamera.Update gains a dt parameter and an exponential
smoother:
alpha = 1 - exp(-dt / ZFollowTimeConstant)
smoothedZ += (player.Z - smoothedZ) * alpha
ZFollowTimeConstant defaults to 0.15 s — slow enough that a
~1 s jump arc shows up clearly on screen, fast enough that
slope walking still feels glued. The look-at point still uses
the raw player Z so the camera tilts up to keep the airborne
character in frame.
Drive-by: stripped K-fix10 jump diagnostic logging now that the
math has been confirmed correct.
Tests stay 1222 green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
13cc08e506
commit
05ce090346
3 changed files with 43 additions and 33 deletions
|
|
@ -3987,8 +3987,11 @@ public sealed class GameWindow : IDisposable
|
|||
_worldState.RelocateEntity(pe, currentLb);
|
||||
}
|
||||
|
||||
// Update chase camera.
|
||||
_chaseCamera.Update(result.Position, _playerController.Yaw);
|
||||
// Update chase camera. K-fix11 (2026-04-26): pass dt so the
|
||||
// Z-smoothing low-pass filter tracks correctly on variable
|
||||
// frame rates — without this the camera tracks player.Z 1:1
|
||||
// and jumps look invisible (camera rises with player).
|
||||
_chaseCamera.Update(result.Position, _playerController.Yaw, (float)dt);
|
||||
|
||||
// Send outbound movement messages to the live server.
|
||||
if (_liveSession is not null)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue