LifePlay-Revival/Docs/Migration/etat/CAM/CAM-COMMUN5-DIAG.md

115 lines
8 KiB
Markdown
Raw Normal View History

# CAM-COMMUN5-DIAG : KO caméra de l'essai COMMUN-5 (2026-10-14)
Demande de Big Boss : C5-2, C5-3, et une piste pour le défaut d'origine (orbite en mode Scene, rotation POV).
Lecture seule, sans UE. Journal `D:\Game\LifePlay_Backup_5.5\COMMUN-5\essais\LifePlay_commun5_session1_BOSS.log`
(MD5 `9c1ebcdc…`, heures UTC). Dumps :
- Room après B2i : `CAM-B2i-VAL_LPDumpFunction_20261013-225125.txt` ;
- PC : `CAM-B1-VAL_LPDumpFunction_20261013-085611.txt`.
## 0. Précision sur `CameraActor_2147480663`
Ce n'est pas une caméra de la scène précédente : c'est **`CamRoom`, la caméra C2** créée par `EnsureCamRoom`
(`CameraActor` sans nom propre). Le témoin la donne comme vue à chaque passage en C2 :
- 22:07:25 et 22:17:04 : `CamC1On=0 CamC3On=0`, puis « C2 Follow » ;
- 22:13:10, pendant le sexe lancé depuis C2 : la vue reste `CamRoom` (cas traité par B2i).
La ligne `Touche C` de 22:17:04 est donc un passage C1 → C2 normal.
## 1. C5-3 : caméra C1 dans le buste après le show (22:15:37)
**DIAG (prouvé par le dump et le journal).**
- B1-3 et B1c posent la caméra C1 **une seule fois**, au passage en C1 :
- `FirstPersonSM` est attachée à la douille `head` (430), puis `SetRelativeTransform(0, (90, 90, 0))` (431) ;
- `SetWorldLocation` au **milieu des yeux** (446 ← PO_2 = (`lEye` + `rEye`) × 0,5, nœuds 447 et 448) ;
- puis elle est **rattachée à la racine du maillage en gardant sa position** (433, `KeepWorld`, sans douille).
- Elle ne suit donc plus la tête. Elle reste à l'endroit où étaient les yeux, par rapport à la racine du maillage, au
moment du passage en C1.
- À 22:15:37, Bridget est **assise** : `currentAnimation = fnt_chair02-f-0-sit` de 22:15:12 à 22:15:52, immobile. La
caméra est posée à hauteur des yeux d'une personne assise.
- À 22:15:51, `LOAD ROOM pub` replace le personnage (au centre, puis sur `fnt_new048`). Dès que la pose change, les
yeux ne sont plus là où était la caméra, et celle-ci se retrouve dans le buste. C'est conforme aux captures (écran de
la couleur du haut).
- Le show n'est pas la cause : c'est **l'entrée en C1 en position assise** (ou dans toute pose basse), suivie d'un
changement de pose. Le même défaut existe hors show.
**Correctif proposé B2k (Room seul, `lp-mcp-bp`)** : recaler la caméra C1 sur les yeux à chaque passage de la
minuterie.
- La minuterie `UpdateRoomCam` (0,016 s) a déjà une branche C1 :
91.else → 81 (`SexOn`) faux → 82 (`CamC1On`) vrai → 83 (vue = joueur, PO_0) **vrai → vide**.
- (N) `K2_SetWorldLocation` (`SceneComponent`) :
- execute ← `IfThenElse_83.then` ;
- self ← `VariableGet_265.FirstPersonSM` (self ← `VariableGet_261.PlayerCharacter`) ;
- NewLocation ← `PromotableOperator_2.ReturnValue`, le milieu des yeux, déjà calculé par un nœud pur, réutilisé.
- 1 nœud, 3 liens. L'orientation reste celle du corps : la partie STG de `Walk` pose déjà le lacet en C1.
- Effet : en C1, la caméra suit la position des yeux, assis, debout ou en marche (léger balancement naturel de la
tête). Hors C1, rien ne change.
- Pendant le sexe, `IfThenElse_81` (`SexOn`) sort avant : les scènes ne sont pas touchées.
- Barème : a0 b1 c0 d0 e1 f1 = 3 → N1, ajusté à N3 (MCP) ; S = C3 1 + f 1 = 2 : une fiche.
- Coût : 2 `GetSocketLocation` par passage, négligeable.
- Estimation : environ 15 appels MCP, une ouverture d'éditeur, puis V5 et V6.
- À relire à l'étape 1 : que la minuterie tourne bien en C1 (`K2_SetTimerDelegate` sur la voie C1
d'`ApplyRoomCamera`).
- **Peut entrer dans l'alpha** : Room seul, hors sexe.
- Essai : s'asseoir, C jusqu'à C1, se lever (ZQSD), marcher, se rasseoir. La vue reste à la hauteur des yeux.
## 2. C5-2 : personnage qui disparaît en C2, assis au pub (22:04-22:05)
**Faits.**
- Le joueur (John) est assis (`fnt_new048-f-0-sit`, `_81`), visible (`hidden=0`) et immobile, en
X = -3131982, Y = -14967134.
- Le pub est à l'échelle 16 × 16, soit environ 7,7 m de demi-largeur : le joueur est à 4,4 m du centre, pas contre un
mur.
- C2 du début à la fin (aucune bascule entre 22:00:53 et 22:06:24).
- Aucune ligne `Temoin C2` : la caméra était donc à 1 m ou plus de la tête, puisque le témoin ne parle qu'en dessous.
**DIAG (probable, non prouvé).**
- Les 3 sondes de C2 ont `bIgnoreSelf = true`, avec self = Room. Elles ignorent **tous les meubles**, qui sont des
composants de Room (DIAG COMMUN-2 § KO 2). La caméra peut donc se placer derrière un meuble haut (dossier de
banquette, comptoir, cloison) ou dedans.
- Le meuble masque alors le joueur, et un mouvement de souris déplace la caméra hors de l'axe, d'où le « réapparaît ».
- Rien d'autre dans le journal ne l'explique : boîte loin, aucun personnage proche dans l'axe.
- Le témoin actuel ne le voit pas : il ne parle que sous 1 m, et ses sondes ignorent aussi Room.
**Correctifs possibles** :
- (a) **Témoin d'occlusion** (C++, sans Blueprint) pour prouver la cause au prochain essai. En C2, toutes les 0,5 s,
un tracé Visibility **complexe**, Room compris, de la caméra vers la tête. S'il touche un composant de Room, une
ligne par seconde au plus : `Temoin C2 : joueur masque par <composant> (<maille>) a N cm de la camera`. N1, S = 0,
environ 30 lignes. **Peut entrer dans l'alpha** : journal seulement.
- (b) **Évitement des meubles** (B2l, Room) :
- sondes avec `bIgnoreSelf = false` et `bTraceComplex = true` (collision par polygone, pas les boîtes englobantes
des `fnt_ext`) ;
- le meuble **occupé** par le joueur (`OccupyingFnt`) ajouté aux composants ignorés ; sinon, assis sur une chaise
haute, la caméra irait au-dessus du crâne (cas D8-3) ;
- les murs restent tenus par la boîte.
- Risques : cas assis, couloirs étroits, coût du tracé complexe. Environ 10 nœuds, N3, S = 3 : à scinder (SPEC
courte puis IMPL).
- **Recommandé après l'alpha**, une fois la cause prouvée par (a).
## 3. Défaut d'origine (4.27) : orbite en mode Scene, rotation POV horizontale (piste seulement, après l'alpha)
- **POV, piste forte (dump du PC)** :
- le tangage passe par `FirstPersonSM.AddWorldRotation(MakeRotator(Pitch = souris Y))` (nœud 316, branche 164) ;
c'est un vrai tangage dans le monde, qui marche (« la tête tourne de bas en haut ») ;
- l'horizontal passe par `FirstPersonSM.AddRelativeRotation(MakeRotator(**Roll** = souris X))` (nœud 951,
branche 136). Un nœud mort, `AddWorldRotation` (204), reçoit le même rotateur ;
- la caméra a une rotation relative (90, 90, 0), prise dans le repère de l'os `head`, puis elle est rattachée au
maillage en gardant sa position (PC:3364-3373) ;
- un Roll dans le repère du composant fait alors **pencher** l'image autour de l'axe de visée au lieu de la tourner
à gauche ou à droite ;
- correctif probable : remplacer le Roll relatif par un **lacet monde**, `AddWorldRotation(MakeRotator(Yaw = souris
X))`, sur le modèle du nœud 316. PC seul, environ 3 nœuds. À faire après l'alpha (scènes gelées).
- **Orbite en mode Scene, piste** :
- en mode Scene, sans Maj, la souris passe par `CircleCamera` → 96.else → 26 → 19 faux → **`SetActorRotation
(SceneCamera)`** (nœud 149, lacet augmenté) ;
- la caméra tourne **sur place**, sans tourner autour du couple : une orbite demande aussi de déplacer la position
(pivot + décalage tourné, comme C2).
- Correctif probable, après l'alpha : position = pivot du couple (milieu de `SexPersons`) + décalage tourné, avec la
même rotation.
## 4. Ce qui peut entrer dans l'alpha sans toucher aux scènes de sexe
| Id | Quoi | Fichier | Avis |
|---|---|---|---|
| B2k | recalage de C1 sur les yeux (C5-3) | Room (MCP) | oui : 1 nœud, hors sexe |
| T-occ | témoin d'occlusion C2 (C5-2) | `LPCameraModeSubsystem.cpp` | oui : journal seulement |
| B2l | évitement des meubles (C5-2) | Room | non : après preuve et SPEC |
| POV / Scene | lacet POV, orbite Scene | PC, Room (voie sexe) | non : scènes gelées |
MD5 avant écriture :
- Room `18565365B1195BF2416A1048BF9051B6` ;
- `LPCameraModeSubsystem.cpp` `D8981529E3773FBF50BB7FC1C91BC91F` et `.h` `2E1E245883960C2AFFC667A9A48FD96D`.