Aller au contenu principal

Session 104 — Synchronisation des pans de porte (vitesse + Y final commun)

Symptôme

Après session 103, la porte 132 s’ouvre fluide (plus de saccades) et a une
vraie épaisseur. Mais on observait encore que les différents pans d’une
porte ne montaient pas tous à la même vitesse ni jusqu’à un Y
final commun
. Résultat : pendant l’ouverture, certains pans étaient
plus avancés que d’autres.

Diagnostic

Depuis la session 100, l’animation était par-seg :

float riseAmount = panelHeight * state;  // panelHeight propre au seg

La session 102 imposait panelHeight = yR - yF (hauteur du couloir). Mais
si une porte est entre deux couloirs de hauteurs différentes (zone A
avec roofH=-128, zone B avec roofH=-256 par exemple), alors :
– les pans du côté A ont panelHeight_A = yR_A - yF_A
– les pans du côté B ont panelHeight_B = yR_B - yF_B ≠ panelHeight_A

À la même valeur de state, les deux groupes ont monté de quantités
différentes en JME, et leurs Y finaux étaient différents.

Fix (DoorControl.java)

Pre-pass dans updateMeshes pour calculer un maxPanelHeight commun à
toute la porte, puis utiliser ce max pour le riseAmount :

float maxPanelHeight = 0f;
for (Spatial child : doorNode.getChildren()) {
    Float yBotSeg = geo.getUserData("yBotSeg");
    Float yTopSeg = geo.getUserData("yTopSeg");
    float h = yTopSeg - yBotSeg;
    if (h > maxPanelHeight) maxPanelHeight = h;
}

// Dans la boucle principale :
float panelHeight    = segTop - segBot;
float riseAmount     = maxPanelHeight * state;        // commun
float effectiveRise  = Math.min(riseAmount, panelHeight);  // clamp
float curYBot        = segBot + effectiveRise;

Comportement :
– Tous les pans montent à la même vitesse JME (maxPanelHeight * d_state/dt)
– À state=1, le pan le plus grand atteint pile son segTop
– Les pans plus courts collapsent à leur segTop plus tôt (quand
riseAmount > panelHeight_seg), puis restent invisibles le reste de
l’animation — c’est l’effet « le pan disparait dans le plafond »
– L’UV vShift utilise effectiveRise au lieu de riseAmount pour ne
pas faire déborder la texture au-delà du sommet

Pour tester

./gradlew run

(Pas besoin de buildScenes cette fois : c’est un changement purement
runtime dans DoorControl.)

Zones de test :
Porte zone 30 (6 pans) : test critique, les 6 pans doivent monter
parfaitement synchronisés
Porte zone 132 (rouge) : confirme que la fluidité session 103 est
préservée, et vérifie la synchronisation
Toutes les portes à 2 couloirs de hauteurs différentes (à chercher
dans le binaire si besoin)

Fichiers modifiés

  • world/DoorControl.java : updateMeshes — ajout pre-pass
    maxPanelHeight, modif riseAmount (commun) + effectiveRise
    (clamp), UV basé sur effectiveRise.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *