stabilize dead air camera reconciliation
All checks were successful
build / image (push) Successful in 27s
All checks were successful
build / image (push) Successful in 27s
This commit is contained in:
@@ -172,7 +172,7 @@ function updateRuntime(
|
||||
const local = world.players.find((player) => player.id === playerId);
|
||||
const fractionalSeconds = frame.interpolationAlpha / DEAD_AIR_TICK_RATE;
|
||||
if (local) {
|
||||
const correctionLife = Math.max(0, 1 - (time - frame.localCorrection.updatedAt) / 130);
|
||||
const correctionLife = Math.exp(-(time - frame.localCorrection.updatedAt) / 115);
|
||||
runtime.camera.position.set(
|
||||
local.x + local.velocityX * fractionalSeconds + frame.localCorrection.x * correctionLife,
|
||||
1.62,
|
||||
|
||||
@@ -203,11 +203,36 @@ export function useDeadAirClient(): DeadAirClientView {
|
||||
const localAfter = (engine.currentState as DeadAirClientState).players.find(
|
||||
(player) => player.id === engine.localPlayerId,
|
||||
);
|
||||
if (localBefore && localAfter && decoded.snapshot.state.round === renderSource.current.state.round) {
|
||||
if (
|
||||
localBefore &&
|
||||
localAfter &&
|
||||
localBefore.alive === localAfter.alive &&
|
||||
decoded.snapshot.state.round === renderSource.current.state.round
|
||||
) {
|
||||
const now = performance.now();
|
||||
const correction = renderSource.current.localCorrection;
|
||||
correction.x += localBefore.x - localAfter.x;
|
||||
correction.z += localBefore.z - localAfter.z;
|
||||
correction.updatedAt = performance.now();
|
||||
const decay = Math.exp(-(now - correction.updatedAt) / 115);
|
||||
const leadSeconds = clock.interpolationAlpha / deadAirGame.tickRateHz;
|
||||
const deltaX =
|
||||
localBefore.x + localBefore.velocityX * leadSeconds -
|
||||
localAfter.x - localAfter.velocityX * leadSeconds;
|
||||
const deltaZ =
|
||||
localBefore.z + localBefore.velocityZ * leadSeconds -
|
||||
localAfter.z - localAfter.velocityZ * leadSeconds;
|
||||
if (Math.hypot(deltaX, deltaZ) < 3) {
|
||||
correction.x = correction.x * decay + deltaX;
|
||||
correction.z = correction.z * decay + deltaZ;
|
||||
} else {
|
||||
correction.x = 0;
|
||||
correction.z = 0;
|
||||
}
|
||||
correction.updatedAt = now;
|
||||
} else {
|
||||
renderSource.current.localCorrection = {
|
||||
x: 0,
|
||||
z: 0,
|
||||
updatedAt: performance.now(),
|
||||
};
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user