Objectif
Créer un effet naturel de déséquilibre lorsque le personnage se tient sur une pente, en appliquant une légère rotation du torse et du cou en fonction de l’angle du terrain. Ce système ajoute de la crédibilité aux animations tout en restant discret et fluide.
 Fonctionnement général

Deux Line Traces sont lancés vers le bas, à droite et à gauche du personnage, depuis des points placés symétriquement par rapport à son centre.

La différence de distance entre les deux traces indique la pente du sol sous les pieds.

Cette variation est convertie en valeur de rotation, stockée et interpolée (RInterpTo).

Deux Transform (Modify) Bone appliquent cette rotation au spine_04 et au neck_01, blendée à 30% (Clamp à 0.3).
Détail du pipeline (étape par étape)
[Étape 1] Détection de pente (Character BP)
Deux traces (Line Trace by Channel) sont projetées à gauche et à droite du personnage.

Les points de départ sont calculés via le Forward Vector + un Get Right Vector pour déterminer les extrémités latérales.

Chaque trace descend de 200 unités en -Z.

[Étape 2] Calcul de l’inclinaison
La distance entre l’acteur et le sol est récupérée via le Break Hit Result > Distance.

La différence entre les deux distances donne une valeur brute d’inclinaison.

Cette différence est ensuite :

Remise à zéro (distance de référence)

Normalisée dans un Map Range Clamped

Convertie en rotation proportionnelle (ex : [-150, 150] → [-30°, 30°])

[Étape 3] Stockage & interpolation
Le résultat est encapsulé dans un Rotator.

Cette rotation est stockée dans une variable (InclinaisonRotation) accessible dans l’AnimBP.

Dans l’AnimBP Event Graph, on fait un Cast to BP_GhoulieCharacter pour accéder à cette variable.

Elle est interpolée via un RInterpTo avec un InterpSpeed de 25 pour adoucir les transitions.

[Étape 4] Application dans l’AnimGraph
Deux Transform (Modify) Bone sont utilisés :

spine_04

neck_01

Ils appliquent la rotation du Rotator, avec une intensité fixée à 30% (via Clamp(Alpha, 0, 1) à 0.3).

Le tout est encapsulé dans une séquence Component to Local > Modify Bones > Local to Component.
Problèmes rencontrés
Le calcul de la pente renvoyait parfois des valeurs extrêmes ou inversées selon le sens du personnage.

L’application directe de la rotation provoquait des saccades.

Le système interférant avec d'autres poses (ex : attaque, roll).
Solution implémentée

Ajout d’un Map Range Clamped sur la distance pour éviter les valeurs extrêmes.

RInterpTo utilisé pour lisser la rotation.

Utilisation de Clamp Alpha dans les Transform Bone pour limiter l’impact visuel.

Le système est désactivé si le personnage est en Falling ou dans certaines animations.
Tests et validation

Debug par Print String des distances gauche et droite + rotation calculée.

Visualisation des traces avec Draw Debug Line.

Test sur différents types de pentes (douces, cassantes, escaliers).

Comparaison avec et sans rotation activée sur le torse.
 Visuels
Colle ici des captures d’écran :
Blueprint

Résultat dans le viewport

Console debug si pertinent
Notes personnelles ou améliorations futures

Ajouter un blending dynamique : pente douce = rotation faible, pente brutale = alpha plus élevé.

Ajouter un Twist du torse si la pente est diagonale (inclinaison en X et Z).

Combiner le système avec un Pelvis Lean pour un résultat plus complet.

Ajouter un Debug Toggle dans le jeu pour tester la rotation seule.
Back to Top