P0 - Division by zero fixes:
- Clamp PhysMaterial->Density to min 0.001 before division
- Clamp MuzzleVelocity averages to min 1.0 in all divisions
- Clamp PhysMaterial->Restitution to [0, 1]
P1 - Edge case guards:
- Stop bullet immediately when velocity is near-zero (prevents NaN)
- Handle near-zero cross product at very shallow grazing angles
- Handle zero-length bounceAngle in ricochet calculation
P2 - Improvements:
- Fix typo: BlockTIme -> BlockTime
- Add incidence angle factor to penetration depth: grazing shots
penetrate less (5% at ~5deg) while head-on shots get full depth
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove ~920 lines of dead code:
- Calibration system (replaced by Python analyze_shots.py)
- IMU shock simulation (no longer needed for testing)
- Debug HUD overlay (values are in CSV logs instead)
- Debug line thickness property (fixed to 0)
- Quadratic regression anti-recoil mode (linear regression sufficient)
- AdaptiveMinSpeed property (optimized to 0, not useful)
- AimStabilization dead zone (smoothing done in Blueprint instead)
Remaining anti-recoil modes: Buffer, LinearExtrapolation,
WeightedLinearRegression, KalmanFilter, AdaptiveExtrapolation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Update defaults from test-driven optimization:
BufferTime=200ms, DiscardTime=30ms, Sensitivity=3.0,
DeadZone=0.95, MinSpeed=0.0, Damping=5.0
- Add ShotFired column to CSV recording for contamination analysis
- Rewrite Python optimizer with 6-parameter search (sensitivity,
dead zone, min speed, damping, buffer time, discard time)
- Fix velocity weighting order bug in Python simulation
- Add dead zone, min speed threshold, and damping to Python sim
- Add shot contamination analysis (analyze_shots.py) to measure
exact IMU perturbation duration per shot
- Support multi-file optimization with mean/worst_case strategies
- Add jitter and overshoot scoring metrics
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add AdaptiveMinSpeed UPROPERTY (default 30 cm/s) to avoid false deceleration at low speeds
- Update default values: BufferTime=300ms, DiscardTime=40ms, Sensitivity=1.5, Damping=8.0
- Replace debug spheres with points to not obstruct aiming view
- Add detailed debug logs with [LOW]/[DZ]/[DEC] tags for dead zone diagnosis
- Convert buffer/discard time units to milliseconds
- Set AdaptiveExtrapolation as default AntiRecoil mode
- Fix DLL copy error handling in DinkeyPlugin and ViveVBS build scripts
- Add AimStabilization dead zone with smooth transition (no hard jumps)
- Add AimSmoothingSpeed property for temporal aim smoothing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace variance-based confidence (caused constant lag) with targeted
deceleration detection: compares recent speed (last 25% of safe window)
to average speed. During steady movement ratio≈1 → zero lag.
Only reduces extrapolation when actual braking is detected.
- AdaptiveSensitivity: now a power exponent (0.1-5.0, default 1.0)
- AdaptiveDeadZone: new parameter (default 0.8) to ignore normal
speed fluctuations and only react to real deceleration
- DebugAntiRecoilHUD: real-time display of ratio, confidence, speeds, errors
- EndPlay: auto-close CSV file when stopping play (no more locked files)
- Python script updated to match new deceleration-based algorithm
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Anti-recoil prediction improvements:
- New ARM_AdaptiveExtrapolation mode: velocity variance-based confidence
with separate pos/aim tracking and low-speed protection
- New ARM_WeightedLinearRegression mode: preserves original simple linear fit
- ARM_WeightedRegression upgraded to quadratic (y=a+bt+ct²) with
linear/quadratic blend and velocity-reversal clamping
- ExtrapolationDamping parameter (all modes): exp decay on extrapolated velocity
- CSV recording (RecordPredictionCSV) for offline parameter tuning
- Python analysis tool (Tools/analyze_antirecoil.py) to find optimal
AdaptiveSensitivity from recorded data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Only the top-level plugin folder is renamed. Internal module name
and .uplugin file remain unchanged (EasyBallistics).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds detailed tooltips (units, ranges, behavior, examples) to 82 UPROPERTY
across EBBullet.h (42), EBBarrel.h (25), and EBMaterialResponseMap.h (15).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Set Kalman Filter as default mode with tuned parameters:
BufferTime=0.15, DiscardTime=0.03, KalmanProcessNoise=200,
KalmanMeasurementNoise=0.01, RegressionWeightExponent=3.0,
DebugAntiRecoilLineThickness=0.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Save and restore OwnerSafe state during retrace to prevent the bullet
from hitting the owner's actors when replaying a previous trace where
OwnerSafe was true. Also fix debug DrawDebugLine in Trace.cpp to use
proper velocity-based colors instead of hardcoded values.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>