fix(debris): rotación visual decae con fricción + modulada por size_factor

This commit is contained in:
2026-05-21 13:23:16 +02:00
parent 048263a1d0
commit e84f555a66
2 changed files with 38 additions and 22 deletions
+36 -21
View File
@@ -256,30 +256,42 @@ namespace Effects {
}
}
// Rota el vector velocity (trajectòria corba) i aplica fricció angular.
static void applyAngularDynamics(Debris& debris, float delta_time) {
if (std::abs(debris.velocitat_rot) <= 0.01F) {
// Aplica fricció a una velocity angular (genèric per a trajectòria i visual).
static void decayAngular(float& vel, float friction, float delta_time) {
if (std::abs(vel) <= 0.01F) {
vel = 0.0F;
return;
}
// Rotar vector de velocity amb matriu 2D
const float DANGLE = debris.velocitat_rot * delta_time;
const float VX = debris.velocity.x;
const float VY = debris.velocity.y;
const float COS_A = std::cos(DANGLE);
const float SIN_A = std::sin(DANGLE);
debris.velocity.x = (VX * COS_A) - (VY * SIN_A);
debris.velocity.y = (VX * SIN_A) + (VY * COS_A);
// Fricció angular (desacceleració gradual)
const float SIGN = (debris.velocitat_rot > 0) ? 1.0F : -1.0F;
const float REDUCCION = Defaults::Physics::Debris::FRICCIO_ANGULAR * delta_time;
debris.velocitat_rot -= SIGN * REDUCCION;
if ((debris.velocitat_rot > 0) != (SIGN > 0)) {
debris.velocitat_rot = 0.0F;
const float SIGN = (vel > 0) ? 1.0F : -1.0F;
vel -= SIGN * friction * delta_time;
if ((vel > 0) != (SIGN > 0)) {
vel = 0.0F;
}
}
// Rota el vector velocity (trajectòria corba) i aplica fricció a ambdues
// velocitats angulars (trajectòria i visual).
static void applyAngularDynamics(Debris& debris, float delta_time) {
// Rotar vector de velocity amb matriu 2D (només si encara gira la trajectòria)
if (std::abs(debris.velocitat_rot) > 0.01F) {
const float DANGLE = debris.velocitat_rot * delta_time;
const float VX = debris.velocity.x;
const float VY = debris.velocity.y;
const float COS_A = std::cos(DANGLE);
const float SIN_A = std::sin(DANGLE);
debris.velocity.x = (VX * COS_A) - (VY * SIN_A);
debris.velocity.y = (VX * SIN_A) + (VY * COS_A);
}
// Decay independent de les dues velocitats angulars.
decayAngular(debris.velocitat_rot,
Defaults::Physics::Debris::FRICCIO_ANGULAR,
delta_time);
decayAngular(debris.velocitat_rot_visual,
Defaults::Physics::Debris::FRICCIO_VISUAL,
delta_time);
}
void DebrisManager::update(float delta_time) {
for (auto& debris : debris_pool_) {
if (!debris.active) {
@@ -299,8 +311,11 @@ namespace Effects {
centro.x += debris.velocity.x * delta_time;
centro.y += debris.velocity.y * delta_time;
// Rotació visual del segment
debris.angle_rotacio += debris.velocitat_rot_visual * delta_time;
// Rotació visual del segment. Modulada per size_factor: durant
// INTACTE (size=1) no afecta, però quan el segment mengua la
// rotació també s'apaga, evitant l'efecte "hèlix d'avió" quan
// el segment es fa molt petit.
debris.angle_rotacio += debris.velocitat_rot_visual * debris.size_factor * delta_time;
// Mida actual = size_factor (1.0 intacte, decreix durant MENGUANT)
const float SHRINK_FACTOR = std::max(0.0F, debris.size_factor);