refactor(collision): improve wall slide behavior for jumping vs grounded movement
- Remove bShowDebug parameter from PerformSweep and ResolveMovement - Fix wall slide calculation to distinguish jumping from grounded movement * Allow upward wall slide during jumps (RemainingDelta.Z > 0) * Force horizontal movement only when grounded (RemainingDelta.Z <= 0) - Add RemainingDelta scaling by Hit.Time for accurate collision response - Clean up comments: remove Russian text, reduce verbositymain
parent
720ad7888c
commit
abe8f565b6
|
|
@ -175,8 +175,7 @@ bool UTengriCollisionResolver::StepUp(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate actual height difference
|
// Validate actual height difference
|
||||||
const float RealHeightDiff = DownSweep.Location.Z - StartLocation.Z;
|
if (const float RealHeightDiff = DownSweep.Location.Z - StartLocation.Z; RealHeightDiff > (MaxStepHeight + TengriPhysics::StepHeightTolerance))
|
||||||
if (RealHeightDiff > (MaxStepHeight + TengriPhysics::StepHeightTolerance))
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -269,13 +268,17 @@ namespace
|
||||||
return HorizontalTangent * FVector::DotProduct(RemainingDelta, HorizontalTangent);
|
return HorizontalTangent * FVector::DotProduct(RemainingDelta, HorizontalTangent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Calculate slide along wall, preventing upward velocity from steep surfaces */
|
/**
|
||||||
|
* Calculate slide along wall, preventing upward velocity for grounded movement.
|
||||||
|
* When jumping (RemainingDelta.Z > 0), allow sliding upward along walls.
|
||||||
|
* When grounded (RemainingDelta.Z <= 0), force horizontal movement only.
|
||||||
|
*/
|
||||||
FVector CalculateWallSlide(const FVector& RemainingDelta, const FVector& ImpactNormal)
|
FVector CalculateWallSlide(const FVector& RemainingDelta, const FVector& ImpactNormal)
|
||||||
{
|
{
|
||||||
FVector ClipDelta = UTengriCollisionResolver::ClipVelocity(RemainingDelta, ImpactNormal);
|
FVector ClipDelta = UTengriCollisionResolver::ClipVelocity(RemainingDelta, ImpactNormal);
|
||||||
|
|
||||||
// If wall would push us up, force horizontal movement only
|
// Allow upward wall slide during jumps, prevent it when grounded
|
||||||
if (ClipDelta.Z > 0.f)
|
if (const bool bWasJumping = RemainingDelta.Z > TengriPhysics::MinUpwardVelocity; ClipDelta.Z > 0.f && !bWasJumping)
|
||||||
{
|
{
|
||||||
if (FVector HorizontalTangent = FVector::CrossProduct(ImpactNormal, FVector(0.f, 0.f, 1.f)).GetSafeNormal(); !HorizontalTangent.IsNearlyZero())
|
if (FVector HorizontalTangent = FVector::CrossProduct(ImpactNormal, FVector(0.f, 0.f, 1.f)).GetSafeNormal(); !HorizontalTangent.IsNearlyZero())
|
||||||
{
|
{
|
||||||
|
|
@ -346,6 +349,12 @@ FTengriSweepResult UTengriCollisionResolver::ResolveMovement(
|
||||||
FinalResult.bBlocked = true;
|
FinalResult.bBlocked = true;
|
||||||
FinalResult.Hit = Sweep.Hit;
|
FinalResult.Hit = Sweep.Hit;
|
||||||
|
|
||||||
|
// Scale remaining delta by unfinished movement
|
||||||
|
if (Sweep.Hit.Time < 1.0f)
|
||||||
|
{
|
||||||
|
RemainingDelta *= (1.0f - Sweep.Hit.Time);
|
||||||
|
}
|
||||||
|
|
||||||
// Classify surface
|
// Classify surface
|
||||||
const float NormalZ = Sweep.Hit.ImpactNormal.Z;
|
const float NormalZ = Sweep.Hit.ImpactNormal.Z;
|
||||||
const bool bIsFloor = Thresholds.IsWalkable(NormalZ);
|
const bool bIsFloor = Thresholds.IsWalkable(NormalZ);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue