From 95f84aa7bb5f3111e68cff3b3a1aec6bc34e83e6 Mon Sep 17 00:00:00 2001 From: CatryBenoit Date: Sat, 19 Sep 2026 18:13:06 +0200 Subject: [PATCH] update 19/09/26 add metahuman --- Architecture_Projet.md | 30 +++++++++++++++++++ Config/DefaultEngine.ini | 2 +- Content/Maps/DevMap/GM_Dev.uasset | 4 +-- .../Mover/AC_VisualOverrideManager.uasset | 2 +- Content/Systems/Mover/GM_Sandbox.uasset | 4 +-- .../ABP_GenericRetarget.uasset | 3 ++ .../BP_VisualOverride_MetaHuman.uasset | 3 ++ .../VisualOverrides/IK_MetaHuman_test.uasset | 3 ++ .../RTG_UEFN_to_MetaHuman_test.uasset | 3 ++ 9 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 Content/Systems/Mover/VisualOverrides/ABP_GenericRetarget.uasset create mode 100644 Content/Systems/Mover/VisualOverrides/BP_VisualOverride_MetaHuman.uasset create mode 100644 Content/Systems/Mover/VisualOverrides/IK_MetaHuman_test.uasset create mode 100644 Content/Systems/Mover/VisualOverrides/RTG_UEFN_to_MetaHuman_test.uasset diff --git a/Architecture_Projet.md b/Architecture_Projet.md index d33ba5e9..1bd3a33f 100644 --- a/Architecture_Projet.md +++ b/Architecture_Projet.md @@ -456,6 +456,35 @@ Restant à faire : - `SandboxCharacter_Mover` n'a **pas** de composant `AC_Stats` (le CMC en a un) : `BFL_WeaponDamage::ApplyPointDamage` résout `AC_Stats` sur la cible, donc le pion Mover ne peut pas encaisser de dégâts. Il lui manque aussi les capsules de hitbox et le `PerceptionStimuliSource` du CMC. - La visée n'a pas d'équivalent de `SandboxCharacter_CMC::ISaiming` sur le Mover (seuls `PlayerInputState.WantsToAim` et `WantToshot` existent). +#### 4.2.4 MetaHuman en « visual override » du personnage Mover (2026-09-19) + +Approche retenue (celle du sample GASP, cf. la vidéo de référence) : **le mannequin UEFN reste le mesh du pion et porte toute l'animation ; le MetaHuman est un acteur enfant qui le recopie par retarget IK.** Le mesh du pion est simplement rendu invisible. Avantage : rien ne change côté Motion Matching, sockets, prone/nage, ragdoll — et on peut changer de « peau » à chaud. + +Le pipeline existait déjà dans le projet mais était **incomplet** : `SandboxCharacter_Mover` a son `ChildActorComponent` `VisualOverride` (tagué `VisualOverride`) et son `AC_VisualOverrideManager`, mais tous les acteurs de skin du sample (`BP_Manny`, `BP_Quinn`, `BP_Echo`, `BP_Twinblast`, `BP_UE4_Mannequin`) **et l'AnimBP qui les pilote** avaient été supprimés au nettoyage de la démo GASP. + +Assets créés / restaurés, tous dans `Content/Systems/Mover/VisualOverrides/` : + +- **`ABP_GenericRetarget`** — récupéré du commit initial (`538ebd2a`). C'est un **Animation Blueprint Template** (`bIsTemplate`, donc sans squelette cible : utilisable sur n'importe quel mesh). Son AnimGraph tient un seul nœud `Retarget Pose From Mesh` ; son `EventBlueprintUpdateAnimation` choisit l'`IKRetargeter` dans la map `IKRetargeter_Map` **en utilisant le premier Component Tag du composant qui l'héberge** comme clé. La map garde ses entrées d'origine (toutes à `None`, les retargeters du sample ayant été supprimés) plus la nôtre. +- **`IK_MetaHuman_test`** — IK Rig sur `/Game/test/Body/SKM_test_BodyMesh`, généré par `IKRigController.apply_auto_generated_retarget_definition()` (l'auto-caractérisation reconnaît le squelette MetaHuman : bassin = `pelvis`, 29 chaînes standard). +- **`RTG_UEFN_to_MetaHuman_test`** — source `IK_UEFN_Mannequin`, cible `IK_MetaHuman_test`. `auto_map_chains(EXACT)` mappe tout sauf deux chaînes, l'auto-caractérisation MetaHuman nommant `LeftFoot`/`RightFoot` ce que le mannequin appelle `LeftToe`/`RightToe` — mappées à la main. + ⚠️ **`add_default_ops()` ne crée PAS l'op des chaînes IK.** La pile par défaut est Pelvis Motion / FK Chains / Run IK Rig / Root Motion / Remap Curves ; or `ABP_GenericRetarget::UpdateRetargetProfile` va chercher l'op **nommée « Retarget IK Goals »** (`GetOpControllerFromRetargetProfile` → cast vers `IKRetarget_IKChains_Controller`) pour moduler l'alpha d'IK par chaîne. Sans elle, le cast renvoie None et `SetSettings` spamme un *Blueprint Runtime Error* à chaque frame. Correctif : `add_retarget_op("/Script/IKRig.IKRetargetIKChainsOp")` — le **chemin de classe complet est obligatoire**, le nom court est refusé (retourne -1). L'op arrive déjà nommée « Retarget IK Goals » et se place juste avant « Run IK Rig » ; il faut ensuite refaire `assign_ik_rig_to_all_ops` + `auto_map_chains` (les mappings de chaînes sont **par op**). Résultat : 4 chaînes IK (LeftLeg, LeftArm, RightLeg, RightArm), plus aucune erreur en PIE. +- **`BP_VisualOverride_MetaHuman`** — Actor : `Body` (racine, `SKM_test_BodyMesh`, `AnimClass = ABP_GenericRetarget_C`, **Component Tag `RTG_UEFN_to_MetaHuman_test`**) → `Face` (`SKM_test_FaceMesh`, `ABP_Face_C`) ; plus un `MetaHumanComponentUE` (`BodyComponentName = "Body"`, `FaceComponentName = "Face"`, post-process `ABP_Clothing_PostProcess`). Pas de grooms : ce MetaHuman n'en a aucun d'assigné. + +Câblage de la sélection : + +- `GM_Sandbox` (`Systems/Mover/`) reçoit `BP_VisualOverride_MetaHuman` dans `VisualOverrides_Soft`. +- **`GM_Dev` est reparenté sur `GM_Sandbox`.** C'était un `GameModeBase` totalement vide (aucune variable, aucun nœud) qui ne servait qu'à fixer `DefaultPawnClass` ; or `AC_VisualOverrideManager::FindAndApplyVisualOverride` fait un `Cast To GM_Sandbox` — sans ce reparentage, la DevMap n'appliquait **jamais** d'override (pire : le cast raté le remettait activement à zéro). `DefaultPawnClass`, `PawnClasses_Soft` et `VisualOverrides_Soft` sont renseignés sur `GM_Dev`. +- La sélection se fait par le CVar **`DDCvar.VisualOverride`** (index dans la liste, `-1` = pas d'override). Son défaut est passé de `-1` à **`0`** dans `Config/DefaultEngine.ini` pour que le MetaHuman soit affiché d'entrée. Repasser à `-1` (ou taper `DDCvar.VisualOverride -1` en console) rend le mannequin. + +Vérifié en PIE : le mannequin passe invisible, `BP_VisualOverride_MetaHuman` est spawné dans le `ChildActorComponent`, le MetaHuman (corps + tête + matériaux) suit l'animation à l'arrêt comme en course, le Motion Matching continue de tourner normalement sur le mannequin caché (`PSD_Relaxed_Stand_Idles` → `PSD_Relaxed_Stand_Run_F_Loops`). + +⚠️ **Limite structurelle de cette approche** : les objets équipés s'accrochent aux sockets du **mesh pilote caché**, pas du MetaHuman (`Inventory_Equipper` attache sur `OwnerMesh`, qui est le composant `SkeletalMesh` du pion). Mesuré en PIE : ~**12 cm** d'écart entre `hand_r` du mannequin et `hand_r` du MetaHuman — une arme en main flottera d'autant. Correctif à prévoir : pointer `OwnerMesh` sur le composant `Body` de l'override quand un override est actif, ou n'utiliser l'override que pour des skins aux proportions du mannequin. + +Autres points : +- Le ragdoll n'a pas été testé avec l'override actif (il simule sur le mesh caché ; le MetaHuman devrait suivre par retarget). +- Les 13 sockets recopiées sur `SKM_test_BodyMesh` lors de la tentative précédente ont été retirées : elles ne servent plus, les attaches restant sur le mannequin. +- Pour ajouter une autre peau : créer `IK_X` + `RTG_UEFN_to_X`, ajouter l'entrée dans `ABP_GenericRetarget.IKRetargeter_Map`, dupliquer `BP_VisualOverride_MetaHuman` en changeant meshes et Component Tag, et l'ajouter à `VisualOverrides_Soft`. + ### 4.3 Autres systèmes de gameplay (ajouts spécifiques au projet) ```text @@ -848,3 +877,4 @@ Ce document **doit toujours refléter l'état réel du projet**. Un skill dédi - *2026-09-18 (migration cover / prone / nage du CMC vers le Mover, voir §4.2.2) : `SandboxCharacter_Mover` reçoit `AC_Cover` + `Arrow1`, les variables et fonctions de cover/prone/nage, l'enregistrement du mode « Swimming » au BeginPlay, et ses fonctions `Get_Gait`/`Get_MoveInput`/`Get_PropertiesForAnimation`/`On_PreSimulateTick` étendues. Nouveaux assets : `Systems/Mover/MovementModes/BP_MovementMode_Swimming`, `Characters/UEFN_Mannequin/Animations/MotionMatchingData/CHT_PoseSearchDatabases_Mover`. Corrections annexes : `BP_MovementMode_Walking` (vitesse/accélération nulles pour les allures prone et nage), `MovementModeMap` (Ragdoll→Climbing et Flying→SwimmingOnSurface, séquelles de la fusion des enums — le ragdoll du pion refonctionne), `SandboxCharacter_Mover_ABP` (contexte `self` absent des `Evaluate Chooser` → branche Motion Matching inerte ; nouvelle bascule `AnimBranchIndex`). Testé en PIE : prone (capsule 40 ↔ 86 via le `StanceModifier`, base `PSD_Dense_Prone_Idles` sélectionnée), nage dans `WaterBodyLake_0` (entrée/flottaison à la profondeur cible/plongée/sortie, `PSD_SwimmingIdle` sélectionnée), accroupi de couverture. NON testé : entrée en couverture par la touche P et déplacement le long d'un vrai mur. Sauvegarde des assets avant modification : `E:\projet\ProjectFv1_backup_mover_migration_2026-09-17\`.* - *2026-09-18 (suite) : à la demande de l'utilisateur, `SandboxCharacter_Mover_ABP` passe **entièrement en Motion Matching** — `Update_Logic` ne calcule plus la bascule, `AnimBranchIndex` est fixé à `0` (nœuds `Select` / `Not Equal (Enum)` / `AND` / `Get Stance` supprimés, valeur par défaut de la variable mise à 0). Diagnostic de la **T-pose en nage** : ce n'était pas l'ABP mais le contenu — 5 des 6 bases Pose Search de nage n'ont que des lignes à `AnimAsset = None` et la table `SwimmingInDeepIdle` du chooser est vide ; seul `PSD_SwimmingMoving` est rempli. Contournement dans `CHT_PoseSearchDatabases_Mover` (lignes vers bases vides neutralisées, lignes 13/16 élargies en MatchAny), détail et procédure de correction définitive en §4.2.2. Vérifié en PIE avec MM permanent : idle debout (`PSD_Relaxed_Stand_Idles`), course avant (`PSD_Relaxed_Stand_Run_F_Starts/Loops`), prone (`PSD_Dense_Prone_Idles` → `anim_Prone_Idle`), nage surface immobile / en mouvement et nage profonde (`PSD_SwimmingMoving` → `RM_Breastroke_overwater_01_right_turn_Retargeted`).* - *2026-09-19 (système d'armes sur le Mover, voir §4.2.3) : `AC_Weapon::Equip/Unequip` reçoivent une branche `Cast Failed` → `SandboxCharacter_Mover` (leur `Cast To SandboxCharacter_CMC` échouait en silence sur le Mover, d'où `Weapon`/`isArmed` jamais renseignés). Nouvelle fonction `SandboxCharacter_Mover::SetEquippedWeapon` + variables `Weapon_Equip`/`WantToshot` sur le pion, `Weapon_Equip`/`Weapon_Equip Last Frame`/`Want Toshot` sur `SandboxCharacter_Mover_ABP` (alimentées dans `Update_PropertiesFromCharacter`, thread principal). `IA_Aim` renseigne `WantToshot`. `Update_MotionMatching` consulte aussi `CHT_PoseSearchDatabases_Mover` quand `Is Armed`, et `Get_MMInterruptMode` force l'interruption au changement d'arme. Dans `CHT_PoseSearchDatabases_Mover` : colonnes `Is Armed` et `IS Moving Object` réactivées, ligne 1 (« Stand Idles Bow ») passée en `Gait = MatchAny`. Testé en PIE de bout en bout (ramassage → main → anims arc → visée → tir) avec non-régression prone/nage. `Inventory_Equipper.uasset` apparaît modifié sans changement de contenu (resauvegarde automatique du MCP, mêmes références `/Game/`).* +- *2026-09-19 (MetaHuman en visual override, voir §4.2.4) : une première tentative mettait le corps MetaHuman directement comme mesh du pion (squelettes déclarés compatibles + sockets recopiées) ; elle a été **annulée** au profit de l'approche du sample GASP. Restauration de `ABP_GenericRetarget` depuis le commit initial (supprimé au nettoyage de la démo GASP), création de `IK_MetaHuman_test`, `RTG_UEFN_to_MetaHuman_test` et `BP_VisualOverride_MetaHuman` dans `Systems/Mover/VisualOverrides/`, `GM_Dev` reparenté sur `GM_Sandbox` (il était vide) et `VisualOverrides_Soft` renseigné, défaut du CVar `DDCvar.VisualOverride` passé de -1 à 0. Limite connue : les objets équipés restent accrochés au mannequin caché, ~12 cm d'écart avec la main du MetaHuman.* diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index aaac535c..9933dd4f 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -116,7 +116,7 @@ ManualIPAddress= +CVarsArray=(Type=CVarInt,Name="DDCvar.FootPlacementMode",ToolTip="0 == off, 1 == foot placement node, 2 == biped control rig",DefaultValueFloat=0.000000,DefaultValueInt=1,DefaultValueBool=False) +CVarsArray=(Type=CVarInt,Name="DDCvar.ControlStyle",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False) +CVarsArray=(Type=CVarInt,Name="DDCvar.PawnClass",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=-1,DefaultValueBool=False) -+CVarsArray=(Type=CVarInt,Name="DDCvar.VisualOverride",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=-1,DefaultValueBool=False) ++CVarsArray=(Type=CVarInt,Name="DDCvar.VisualOverride",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False) +CVarsArray=(Type=CVarInt,Name="DDCvar.AnalogInputStyle",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False) [/Script/Engine.CollisionProfile] diff --git a/Content/Maps/DevMap/GM_Dev.uasset b/Content/Maps/DevMap/GM_Dev.uasset index 1691cb3e..b773b41e 100644 --- a/Content/Maps/DevMap/GM_Dev.uasset +++ b/Content/Maps/DevMap/GM_Dev.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:887fcbd9c2b2167aea30429e35cb3701faff05be01700e235cefa5491db4aa40 -size 21056 +oid sha256:e4872ca837455fa5a86c3199878b271bd8ffa868986524f4fea19e7c4d81e33e +size 20226 diff --git a/Content/Systems/Mover/AC_VisualOverrideManager.uasset b/Content/Systems/Mover/AC_VisualOverrideManager.uasset index 07e5cee2..e19513c0 100644 --- a/Content/Systems/Mover/AC_VisualOverrideManager.uasset +++ b/Content/Systems/Mover/AC_VisualOverrideManager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:41b0415696947e6301cc8139f02d186f0e766aca044aff498586a431d70a6256 +oid sha256:1919caab7724649b1fe9a7867db4ec4455ed70589c77c791b7d1c1969b0e15f3 size 118713 diff --git a/Content/Systems/Mover/GM_Sandbox.uasset b/Content/Systems/Mover/GM_Sandbox.uasset index b9fb36e6..23695527 100644 --- a/Content/Systems/Mover/GM_Sandbox.uasset +++ b/Content/Systems/Mover/GM_Sandbox.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:100461a27ae713245bb079a14701bc579ebafdeef27690ba1695c449b83d8f82 -size 199329 +oid sha256:dc1973a93a6f70d3953c5e9128bf58b23fd958a30bfee4a8c9d486826fd7fb81 +size 199780 diff --git a/Content/Systems/Mover/VisualOverrides/ABP_GenericRetarget.uasset b/Content/Systems/Mover/VisualOverrides/ABP_GenericRetarget.uasset new file mode 100644 index 00000000..7d259ab3 --- /dev/null +++ b/Content/Systems/Mover/VisualOverrides/ABP_GenericRetarget.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f373575fdc152f93c79b65a0426fb2752c093551c850ccc714733eeb96ff413e +size 198858 diff --git a/Content/Systems/Mover/VisualOverrides/BP_VisualOverride_MetaHuman.uasset b/Content/Systems/Mover/VisualOverrides/BP_VisualOverride_MetaHuman.uasset new file mode 100644 index 00000000..379ebd89 --- /dev/null +++ b/Content/Systems/Mover/VisualOverrides/BP_VisualOverride_MetaHuman.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6aa2d5c988f1f087bd158a766b791ae0abeb42165384a072bb5071655c7945d +size 32915 diff --git a/Content/Systems/Mover/VisualOverrides/IK_MetaHuman_test.uasset b/Content/Systems/Mover/VisualOverrides/IK_MetaHuman_test.uasset new file mode 100644 index 00000000..390ee3c5 --- /dev/null +++ b/Content/Systems/Mover/VisualOverrides/IK_MetaHuman_test.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd74aef94360073a536ba6aedae7d70e62368b0d604b1bcdc5ffff3417472b64 +size 269015 diff --git a/Content/Systems/Mover/VisualOverrides/RTG_UEFN_to_MetaHuman_test.uasset b/Content/Systems/Mover/VisualOverrides/RTG_UEFN_to_MetaHuman_test.uasset new file mode 100644 index 00000000..4fc71fdd --- /dev/null +++ b/Content/Systems/Mover/VisualOverrides/RTG_UEFN_to_MetaHuman_test.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf9d311da992948c988defdf2bdcc3bdfbbf7b98e4fc49704bcd1517d039c4bc +size 28731