debris hereten velocitat angular

This commit is contained in:
2025-12-09 12:30:03 +01:00
parent 523342fed9
commit 3c3857c1b2
6 changed files with 93 additions and 18 deletions

View File

@@ -49,7 +49,9 @@ void DebrisManager::explotar(const std::shared_ptr<Graphics::Shape>& shape,
float escala,
float velocitat_base,
float brightness,
const Punt& velocitat_objecte) {
const Punt& velocitat_objecte,
float velocitat_angular,
float factor_herencia_visual) {
if (!shape || !shape->es_valida()) {
return;
}
@@ -110,16 +112,45 @@ void DebrisManager::explotar(const std::shared_ptr<Graphics::Shape>& shape,
debris->velocitat.y = direccio.y * speed + velocitat_objecte.y;
debris->acceleracio = Defaults::Physics::Debris::ACCELERACIO;
// 6. Rotació lenta aleatòria
debris->velocitat_rot =
Defaults::Physics::Debris::ROTACIO_MIN +
(std::rand() / static_cast<float>(RAND_MAX)) *
(Defaults::Physics::Debris::ROTACIO_MAX -
Defaults::Physics::Debris::ROTACIO_MIN);
// 6. Herència de velocitat angular
// 50% probabilitat de rotació en sentit contrari
if (std::rand() % 2 == 0) {
debris->velocitat_rot = -debris->velocitat_rot;
// 6a. Rotació de TRAYECTORIA (sempre hereda si velocitat_angular > 0)
if (std::abs(velocitat_angular) > 0.01f) {
float factor_herencia =
Defaults::Physics::Debris::FACTOR_HERENCIA_MIN +
(std::rand() / static_cast<float>(RAND_MAX)) *
(Defaults::Physics::Debris::FACTOR_HERENCIA_MAX -
Defaults::Physics::Debris::FACTOR_HERENCIA_MIN);
debris->velocitat_rot = velocitat_angular * factor_herencia;
float variacio =
(std::rand() / static_cast<float>(RAND_MAX)) * 0.2f - 0.1f;
debris->velocitat_rot *= (1.0f + variacio);
} else {
debris->velocitat_rot = 0.0f; // Nave: sin curvas
}
// 6b. Rotació VISUAL (proporcional según factor_herencia_visual)
if (factor_herencia_visual > 0.01f && std::abs(velocitat_angular) > 0.01f) {
// Heredar rotación visual con factor proporcional
debris->velocitat_rot_visual = debris->velocitat_rot * factor_herencia_visual;
// Variació aleatòria petita (±5%) per naturalitat
float variacio_visual =
(std::rand() / static_cast<float>(RAND_MAX)) * 0.1f - 0.05f;
debris->velocitat_rot_visual *= (1.0f + variacio_visual);
} else {
// Rotació visual aleatòria (factor = 0.0 o sin velocidad angular)
debris->velocitat_rot_visual =
Defaults::Physics::Debris::ROTACIO_MIN +
(std::rand() / static_cast<float>(RAND_MAX)) *
(Defaults::Physics::Debris::ROTACIO_MAX -
Defaults::Physics::Debris::ROTACIO_MIN);
// 50% probabilitat de rotació en sentit contrari
if (std::rand() % 2 == 0) {
debris->velocitat_rot_visual = -debris->velocitat_rot_visual;
}
}
debris->angle_rotacio = 0.0f;
@@ -175,6 +206,35 @@ void DebrisManager::actualitzar(float delta_time) {
debris.velocitat.y = 0.0f;
}
// 2b. Rotar vector de velocitat (trayectoria curva)
if (std::abs(debris.velocitat_rot) > 0.01f) {
// Calcular angle de rotació aquest frame
float dangle = debris.velocitat_rot * delta_time;
// Rotar vector de velocitat usant matriu de rotació 2D
float vel_x_old = debris.velocitat.x;
float vel_y_old = debris.velocitat.y;
float cos_a = std::cos(dangle);
float sin_a = std::sin(dangle);
debris.velocitat.x = vel_x_old * cos_a - vel_y_old * sin_a;
debris.velocitat.y = vel_x_old * sin_a + vel_y_old * cos_a;
}
// 2c. Aplicar fricció angular (desacceleració gradual)
if (std::abs(debris.velocitat_rot) > 0.01f) {
float sign = (debris.velocitat_rot > 0) ? 1.0f : -1.0f;
float reduccion =
Defaults::Physics::Debris::FRICCIO_ANGULAR * delta_time;
debris.velocitat_rot -= sign * reduccion;
// Evitar canvi de signe (no pot passar de CW a CCW)
if ((debris.velocitat_rot > 0) != (sign > 0)) {
debris.velocitat_rot = 0.0f;
}
}
// 3. Calcular centre del segment
Punt centre = {(debris.p1.x + debris.p2.x) / 2.0f,
(debris.p1.y + debris.p2.y) / 2.0f};
@@ -183,8 +243,8 @@ void DebrisManager::actualitzar(float delta_time) {
centre.x += debris.velocitat.x * delta_time;
centre.y += debris.velocitat.y * delta_time;
// 5. Actualitzar rotació
debris.angle_rotacio += debris.velocitat_rot * delta_time;
// 5. Actualitzar rotació VISUAL
debris.angle_rotacio += debris.velocitat_rot_visual * delta_time;
// 6. Aplicar shrinking (reducció de distància entre punts)
float shrink_factor =