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