fix(ship-3d): exit convergeix al VP sense travessar-lo (sense creuament entre naus)

This commit is contained in:
2026-05-22 11:57:16 +02:00
parent 85e7e70767
commit a29c2b9cc2
+10 -10
View File
@@ -24,10 +24,11 @@ namespace Title {
constexpr float SHIP_EXIT_Z = 800.0F;
constexpr Vec3 VANISHING_POINT{.x = 0.0F, .y = 0.0F, .z = SHIP_EXIT_Z};
// Distància que la nau recorre durant EXITING, sumada al forward_dir
// sobre la posició inicial de l'exit. La nau travessa el VP i continua
// allunyant-se per perspectiva fins gairebé desaparèixer per mida.
constexpr float SHIP_EXIT_TRAVEL = 2500.0F;
// Profunditat addicional darrere del VP cap a la qual les naus exiting
// convergeixen. Així P1 (X<0) i P2 (X>0) mantenen sempre els seus
// hemisferis i no es creuen al passar pel VP — totes dues acaben al
// centre projectat (640, 360) sense travessar-lo.
constexpr float SHIP_EXIT_OVERFLOW = 700.0F;
// Directors VP → origen de cada nau, normalitzats. P1 ve des de "les 7"
// del rellotge (baix-esquerra), P2 des de "les 5" (baix-dreta). Els
@@ -283,13 +284,12 @@ namespace Title {
const float PROGRESS = std::min(1.0F, ship.state_time / EXIT_DURATION);
const float EASED = Easing::easeInQuad(PROGRESS);
// Destí: forward_dir prolongat des de l'inici de l'exit. La nau
// segueix la mateixa línia recta (mateix path), travessa el VP i
// continua allunyant-se fins a la mida visual ~0.
// Destí: punt fix a (VP.x, VP.y, VP.z + OVERFLOW). Cada nau s'apropa
// al centre projectat des del seu costat sense creuar el VP.
const Vec3 EXIT_DEST{
.x = ship.initial_position.x + (ship.forward_dir.x * SHIP_EXIT_TRAVEL),
.y = ship.initial_position.y + (ship.forward_dir.y * SHIP_EXIT_TRAVEL),
.z = ship.initial_position.z + (ship.forward_dir.z * SHIP_EXIT_TRAVEL),
.x = VANISHING_POINT.x,
.y = VANISHING_POINT.y,
.z = VANISHING_POINT.z + SHIP_EXIT_OVERFLOW,
};
ship.current_position.x = Easing::lerp(ship.initial_position.x, EXIT_DEST.x, EASED);
ship.current_position.y = Easing::lerp(ship.initial_position.y, EXIT_DEST.y, EASED);