fix(physics): salta body-body collision quan algun cos té radius=0
resolveBodyPair afegeix early-out per a parells on a.radius<=0 o b.radius<=0.
Honra el comentari de bullet.cpp:30 ("radius=0 → sin colisión física,
cinemática pura") que abans no s'aplicava: amb bala radius=0 + enemic
radius=ENEMY_RADIUS, SUM_R era enemic radius i el body-body disparava
si la bala (a 700 px/s) penetrava el cos l'enemic entre frames.
Símptomes corregits:
- Pentagon: la bala "rebotava espectacularment" en lloc d'impactar.
- Quadrat: rebut un impulse double del cantó de la física que es
sumava (o cancel·lava, segons l'angle) al manual, fent l'efecte
inconsistent.
Ara la gameplay collision (Physics::checkCollision amb entity radius,
que ja és més generós) és l'única que tracta el parell bala-enemic.
A més: IMPACT_MOMENTUM_FACTOR 2.0 → 3.0 per compensar la pèrdua del
rebot físic i donar més empenta:
- Pentagon (m=5) Δv = 210 px/s
- Quadrat (m=8) Δv = 131 px/s
- Molinillo (m=4) Δv = 262 px/s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -15,7 +15,7 @@ namespace Defaults::Physics {
|
|||||||
// un factor de transferència [0..1]. 1.0 = transfereix tot el moment
|
// un factor de transferència [0..1]. 1.0 = transfereix tot el moment
|
||||||
// (col·lisió perfectament inelàstica), 0.5 = transfereix la meitat.
|
// (col·lisió perfectament inelàstica), 0.5 = transfereix la meitat.
|
||||||
namespace Bullet {
|
namespace Bullet {
|
||||||
constexpr float IMPACT_MOMENTUM_FACTOR = 2.0F; // Factor de transferència de moment bala→enemic
|
constexpr float IMPACT_MOMENTUM_FACTOR = 3.0F; // Factor de transferència de moment bala→enemic
|
||||||
} // namespace Bullet
|
} // namespace Bullet
|
||||||
|
|
||||||
// Explosions (debris physics)
|
// Explosions (debris physics)
|
||||||
|
|||||||
@@ -134,6 +134,13 @@ void PhysicsWorld::resolveBodyPair(RigidBody& a, RigidBody& b) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Un cuerpo con radius=0 es cinemático puro (ej. la bala) y no participa
|
||||||
|
// en body-body. La detecció de gameplay (Physics::checkCollision) usa
|
||||||
|
// el radius de l'entity (no el del body) i s'encarrega d'aquesta parella.
|
||||||
|
if (a.radius <= 0.0F || b.radius <= 0.0F) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const Vec2 DELTA = b.position - a.position;
|
const Vec2 DELTA = b.position - a.position;
|
||||||
const float DIST_SQ = DELTA.lengthSquared();
|
const float DIST_SQ = DELTA.lengthSquared();
|
||||||
const float SUM_R = a.radius + b.radius;
|
const float SUM_R = a.radius + b.radius;
|
||||||
|
|||||||
Reference in New Issue
Block a user