LifePlay-Revival/Docs/Migration/etat/CAM/CAM-COMMUN5-DIAG.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

114 lines
8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`.