From 26c6decd7434fb2f2bdad25887492c2f477863cc Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 22 May 2026 10:06:06 +0200 Subject: [PATCH] =?UTF-8?q?fix(ship-3d):=20path=20=C3=BAnic=20VP=E2=86=92l?= =?UTF-8?q?es7/les5=20perqu=C3=A8=20initial,=20target=20i=20VP=20siguen=20?= =?UTF-8?q?col=C2=B7lineals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/game/title/ship_animator3d.cpp | 51 +++++++++++---------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/source/game/title/ship_animator3d.cpp b/source/game/title/ship_animator3d.cpp index d28ecca..6792c4d 100644 --- a/source/game/title/ship_animator3d.cpp +++ b/source/game/title/ship_animator3d.cpp @@ -18,22 +18,23 @@ namespace Title { // 0.0F → emet només la silueta plana. >0 emet volum extrudit. constexpr float SHIP_EXTRUSION_DEPTH = 1.0F; - // Posicions en l'espai 3D (càmera a (0,0,0) mirant cap a +Z, Y cap amunt). - constexpr float SHIP_FLOAT_X = 25.0F; // Separació horitzontal - constexpr float SHIP_FLOAT_Y = -8.0F; // Lleugerament per davall del centre - constexpr float SHIP_FLOAT_Z = 90.0F; // Distància de flotació (allunyada per fer-les més petites) - - // Posició d'entrada (a prop de càmera, fora del frustrum lateral). - constexpr float SHIP_ENTRY_X = 62.0F; - constexpr float SHIP_ENTRY_Y = -15.0F; - constexpr float SHIP_ENTRY_Z = 42.0F; - - // Posició de fuga (al fons, centre projectat). + // Punt de fuga (al fons, centre projectat). Tots els paths convergeixen aquí. constexpr float SHIP_EXIT_Z = 800.0F; - - // Punt cap a on apunten les naus durant FLOATING i EXITING (centre lluny). constexpr Vec3 VANISHING_POINT{.x = 0.0F, .y = 0.0F, .z = SHIP_EXIT_Z}; + // Directors VP → origen de cada nau, normalitzats. P1 ve des de "les 7" + // del rellotge (baix-esquerra), P2 des de "les 5" (baix-dreta). El rellotge + // envolta el VP en l'espai 3D; el seu centre coincideix amb el VP a pantalla. + // Tots tres punts d'animació (initial, target, EXIT) cauen sobre aquesta + // línia recta, així el forward_dir és constant i no hi ha "POP" en + // canviar d'estat. + constexpr Vec3 PATH_DIR_P1{.x = -0.286F, .y = -0.143F, .z = -0.949F}; + constexpr Vec3 PATH_DIR_P2{.x = +0.286F, .y = -0.143F, .z = -0.949F}; + + // Distàncies des del VP al llarg del path (unitats mundials). + constexpr float TARGET_DIST = 540.0F; // Posició de descans (intermèdia) + constexpr float ENTRY_DIST = 740.0F; // Posició inicial (més a prop de càmera) + // Look-at: calcula pitch+yaw que duen (0,-1,0) local a forward_dir mundial. // Requereix l'ordre de rotació X→Y→Z al applyTransform de wireframe3d. // Si forward és quasi vertical (sin(pitch) ≈ 0), retorna yaw=0 (qualsevol). @@ -282,15 +283,9 @@ namespace Title { void ShipAnimator3D::configureShipP1(TitleShip3D& ship) { ship.state = ShipState3D::FLOATING; ship.state_time = 0.0F; - // Esquerra: x negatiu. - ship.target_position = Vec3{ - .x = -SHIP_FLOAT_X, - .y = SHIP_FLOAT_Y, - .z = SHIP_FLOAT_Z}; - ship.initial_position = Vec3{ - .x = -SHIP_ENTRY_X, - .y = SHIP_ENTRY_Y, - .z = SHIP_ENTRY_Z}; + // Target i initial sobre el path VP → "les 7" del rellotge (P1). + ship.target_position = VANISHING_POINT + (PATH_DIR_P1 * TARGET_DIST); + ship.initial_position = VANISHING_POINT + (PATH_DIR_P1 * ENTRY_DIST); ship.current_position = ship.initial_position; ship.target_scale = SHIP_FLOAT_SCALE; ship.current_scale = SHIP_FLOAT_SCALE; @@ -308,15 +303,9 @@ namespace Title { void ShipAnimator3D::configureShipP2(TitleShip3D& ship) { ship.state = ShipState3D::FLOATING; ship.state_time = 0.0F; - // Dreta: x positiu. - ship.target_position = Vec3{ - .x = SHIP_FLOAT_X, - .y = SHIP_FLOAT_Y, - .z = SHIP_FLOAT_Z}; - ship.initial_position = Vec3{ - .x = SHIP_ENTRY_X, - .y = SHIP_ENTRY_Y, - .z = SHIP_ENTRY_Z}; + // Target i initial sobre el path VP → "les 5" del rellotge (P2). + ship.target_position = VANISHING_POINT + (PATH_DIR_P2 * TARGET_DIST); + ship.initial_position = VANISHING_POINT + (PATH_DIR_P2 * ENTRY_DIST); ship.current_position = ship.initial_position; ship.target_scale = SHIP_FLOAT_SCALE; ship.current_scale = SHIP_FLOAT_SCALE;