fix(debris): bugs rotacion cuadratica y shrink exponencial (geometria autoritativa)
This commit is contained in:
@@ -112,7 +112,14 @@ namespace Effects {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Geometria
|
||||
// Geometria autoritaritzada: centro + original_angle + original_half_length.
|
||||
// p1/p2 es reconstrueixen cada frame en update() des d'aquestes dades.
|
||||
const float DX = world_p2.x - world_p1.x;
|
||||
const float DY = world_p2.y - world_p1.y;
|
||||
debris->centro = {.x = (world_p1.x + world_p2.x) / 2.0F,
|
||||
.y = (world_p1.y + world_p2.y) / 2.0F};
|
||||
debris->original_angle = std::atan2(DY, DX);
|
||||
debris->original_half_length = std::sqrt((DX * DX) + (DY * DY)) / 2.0F;
|
||||
debris->p1 = world_p1;
|
||||
debris->p2 = world_p2;
|
||||
|
||||
@@ -319,40 +326,33 @@ namespace Effects {
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Calcular centro del segment
|
||||
Vec2 centro = {.x = (debris.p1.x + debris.p2.x) / 2.0F,
|
||||
.y = (debris.p1.y + debris.p2.y) / 2.0F};
|
||||
// 3. Actualitzar posició del centre (integra velocity).
|
||||
debris.centro.x += debris.velocity.x * delta_time;
|
||||
debris.centro.y += debris.velocity.y * delta_time;
|
||||
|
||||
// 4. Actualitzar posición del centro
|
||||
centro.x += debris.velocity.x * delta_time;
|
||||
centro.y += debris.velocity.y * delta_time;
|
||||
// 4. Rebot contra els límits del PLAYAREA.
|
||||
bounceOffPlayArea(debris.centro, debris.velocity);
|
||||
|
||||
// 4b. Rebot contra els límits del PLAYAREA.
|
||||
bounceOffPlayArea(centro, debris.velocity);
|
||||
|
||||
// 5. Actualitzar rotación VISUAL
|
||||
// 5. Actualitzar rotació visual acumulada.
|
||||
debris.angle_rotacio += debris.velocitat_rot_visual * delta_time;
|
||||
|
||||
// 6. Aplicar shrinking (reducció de distancia entre points).
|
||||
// El shrink es normalitza al min_lifetime (capat a 1.0) perquè els
|
||||
// fragments que viuen més no es continuïn fent més petits per sempre.
|
||||
// 6. Shrink lineal sobre la longitud ORIGINAL (no iteratiu).
|
||||
// SHRINK_T va de 0 a 1 al llarg de min_lifetime; després queda
|
||||
// a 1 i el shrink_factor manté el valor mínim (1 - factor_shrink).
|
||||
const float SHRINK_T = std::min(debris.temps_vida / debris.min_lifetime, 1.0F);
|
||||
float shrink_factor = 1.0F - (debris.factor_shrink * SHRINK_T);
|
||||
shrink_factor = std::max(0.0F, shrink_factor); // No negatiu
|
||||
const float SHRINK_FACTOR = std::max(0.0F, 1.0F - (debris.factor_shrink * SHRINK_T));
|
||||
|
||||
// Calcular distancia original entre points
|
||||
float dx = debris.p2.x - debris.p1.x;
|
||||
float dy = debris.p2.y - debris.p1.y;
|
||||
|
||||
// 7. Reconstruir segment con nueva mida i rotación
|
||||
float half_length = std::sqrt((dx * dx) + (dy * dy)) * shrink_factor / 2.0F;
|
||||
float original_angle = std::atan2(dy, dx);
|
||||
float new_angle = original_angle + debris.angle_rotacio;
|
||||
|
||||
debris.p1.x = centro.x - (half_length * std::cos(new_angle));
|
||||
debris.p1.y = centro.y - (half_length * std::sin(new_angle));
|
||||
debris.p2.x = centro.x + (half_length * std::cos(new_angle));
|
||||
debris.p2.y = centro.y + (half_length * std::sin(new_angle));
|
||||
// 7. Reconstruir p1/p2 des de la geometria autoritaritzada:
|
||||
// centro + (cos/sin(original_angle + angle_rotacio)) × original_half_length × shrink_factor
|
||||
// No iteratiu — evita la rotació quadràtica i el shrink exponencial.
|
||||
const float CURRENT_ANGLE = debris.original_angle + debris.angle_rotacio;
|
||||
const float HALF_LEN = debris.original_half_length * SHRINK_FACTOR;
|
||||
const float COS_A = std::cos(CURRENT_ANGLE);
|
||||
const float SIN_A = std::sin(CURRENT_ANGLE);
|
||||
debris.p1.x = debris.centro.x - (HALF_LEN * COS_A);
|
||||
debris.p1.y = debris.centro.y - (HALF_LEN * SIN_A);
|
||||
debris.p2.x = debris.centro.x + (HALF_LEN * COS_A);
|
||||
debris.p2.y = debris.centro.y + (HALF_LEN * SIN_A);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user