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

8 KiB
Raw Blame 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.