LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2b-AMENDEMENT.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

96 lines
8.1 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-B2b : amendement de la SPEC après les essais de B2 (brouillon, 2026-10-13)
Brouillon de la session CAM, à reporter dans `CAM-SPEC.md` (§ (a) B2, § (e) C2, § (f), § 7 V5) après l'accord de Big Boss.
Copie d'avant prévue : `D:\Game\LifePlay_Backup_5.5\CAM\SPEC-avant-B2b\CAM-SPEC.md`. Aucun asset touché par ce document.
## 1. Entrées
- Essais de B2 (utilisateur, relayés par Big Boss, 2026-10-13) :
- « quand on est près d'un mur la camera est trop proche » ;
- « J'ai perdu la capacité de me déplacer ou de déplacer la caméra » ;
- « les 2 caméra dans les scène de sexe sont toujours oprationnelles » (point 7 conforme).
- Exigence de l'utilisateur (relayée par Big Boss) : « la caméra doit toujours être placée dans la pièce et jamais
dehors sinon le mur fait obstruction quand on change de vue ».
- Diagnostic : `CAM-B2-journal.txt`, section « Essais utilisateur ».
## 2. Faits relus (lecture seule)
| Fait | Preuve |
|---|---|
| Room sait déjà définir son volume : `isPointInsideRoom(Point)` = `IsPointInBox(Point, O, E)`. Origine `O` = (Room.X, Room.Y, Room.Z + H/2). Étendue `E` = (`Wall2.X − sol.X`, `Wall4.Y − sol.Y`, H/2), avec H = `WallT.Z − sol.Z` et sol = `StaticMeshComponent`. Boîte alignée sur les axes du monde | dump `CAM-B2-VAL_LPDumpFunction_20261013-132919.txt:4051-4162` |
| En extérieur, l'échelle Z de la racine vaut 0,01 : `WallT` descend à ≈ 20 cm du sol, donc la hauteur de la boîte vaut ≈ 20 cm. Les positions X/Y des murs ne changent pas (seul Z est mis à l'échelle) | `LPOutdoorRoomSubsystem.cpp:13-16, 55` ; journal des essais l. 1269 « Piece exterieure (echelle Z 0.010) » |
| La ruelle de la capture est une pièce extérieure | même ligne 1269 |
| Les murs `Wall1-4` ne bloquent le canal Camera que par estimation (réponses par défaut, R5) ; le plafond `WallT` ignore Camera | SPEC R5 (RCOMP:17-19, copie 5.5) |
| Les flèches, la molette et la souris de pièce déplacent `SceneCamera` = `ChargenCameras[0]` (`ScrollDownUp`, `LeftRight`, `DownUp`, `CircleCamera`, `RotateCamera`, sous `BuilderOn OR SexOn OR SpaceOn`) | CAM-T2 § 3 ; ROOM:1326-1340, 394-700 |
| La marche ZQSD (`Walk`) ne dépend pas de la cible de vue ; elle est bloquée par un menu de `MenuClasses` ou par `GI.CurrentScene` non vide | `LPDirectControlSubsystem.cpp:51-55, 606, 840-895` |
## 3. Règle de confinement (nouvelle, s'applique à toute vue de pièce posée par CAM)
**Volume de la pièce** = boîte de `isPointInsideRoom`, réduite d'une marge `m` = 30 cm (rayon de balayage 20 + 10) :
- X dans [O.X − |E.X| + m, O.X + |E.X| − m] ; même règle pour Y avec E.Y ;
- **intérieur** (échelle Z ≥ 0,05) : Z dans [sol.Z + 50, `WallT`.Z − 25] ;
- **extérieur** (échelle Z < 0,05) : Z ≥ sol.Z + 50, sans borne haute (pas de plafond).
En extérieur, « dans la pièce » veut donc dire : dans l'emprise au sol de Room (positions de `Wall2` / `Wall4`) et du
côté du personnage par rapport aux façades. Les façades de la rue ne sont pas des murs de Room ; c'est le balayage
(canal Camera) qui les traite. Que cette emprise coïncide avec l'espace de la ruelle entre les façades reste
**estimé** : à mesurer à l'essai (point (f) ajouté ci-dessous).
Une boîte reste vide si la pièce est plus étroite que 2 m. Dans ce cas, la borne retenue est le centre O sur cet axe.
## 4. Modifications de C2 (remplacent B2-3 et B2-6 pour la partie position)
- **B2b-1 Cible confinée** (`ComputeC2Target`) : `Desired` → **Clamp** dans le volume (§ 3) → balayage de la tête vers la
cible bornée (rayon **20**, au lieu de 12). En cas d'impact : `Location + Normal × 20`, puis Clamp → `C2Target`.
- **B2b-2 Repli vers l'intérieur et vers le haut** : si `Distance(C2Target, tête) < 80`, on recalcule un second point
`Desired2` = tête + (0, 0, 100) − F × 60. Ce point est borné (Clamp), balayé de la tête vers lui, puis borné à
nouveau. Il devient `C2Target`. La vue plonge alors sur le personnage au lieu de coller au mur. La hauteur plafond
− 25 reste respectée à l'intérieur.
- **B2b-3 Trajectoire protégée** (`UpdateRoomCam`, poursuite) : après `VInterpTo`, on balaie de la tête vers `Next`
(rayon 20) ; en cas d'impact, `Next` := `Location + Normal × 20`, puis Clamp. Le lissage ne passe donc jamais derrière
un mur ni hors de la boîte, même pendant un demi-tour du personnage.
- **B2b-4 Commutation sans lissage** : `PlaceC2` pose déjà la caméra sans lissage avant `SetViewTargetWithBlend`. Le
point posé est désormais celui de B2b-1 / B2b-2, donc dans le volume. `CamRoom` naît à la position du personnage
(B2-2), ce qui est sans effet puisque `PlaceC2` la replace avant la bascule de vue. Vérification : V5 relit l'ordre
`PlaceC2` → `SetViewTargetWithBlend` (466).
## 5. Contrôle des autres vues (exigence « jamais dehors »)
| Vue | Position | Dans la pièce ? |
|---|---|---|
| Entrée en pièce, touche C vers C2 | `PlaceC2` (B2b-1, B2b-2) | oui, par construction |
| C2 pendant la poursuite | B2b-3 | oui, par construction |
| C1 | yeux du personnage | oui |
| **C3 provisoire (jusqu'à B3)** | `ChargenCameras[0]` = ancienne caméra de pièce, placée par l'ancienne logique | **non garanti** : c'est l'ancienne vue, qui peut se trouver derrière un mur. C'est vraisemblablement le « mur qui fait obstruction quand on change de vue » (estimé) |
| C3 de B3, intérieur | (O.X, O.Y, plafond − 5) | oui, si B3 prend la boîte du § 3 et non `GetActorBounds` (le mobilier peut élargir les bornes de l'acteur) |
| C3 de B3, extérieur | `O + s·(E.A − 50)·Â`, Z = sol + 380 | oui en XY si la boîte du § 3 est utilisée ; Z libre dehors |
Amendement de B3, à reporter : remplacer `GetActorBounds(Room)` par la boîte du § 3 (B3-1, § (e) C3), avec la même marge.
## 6. Pilotage de la caméra en C2 (choix de l'utilisateur en attente)
- **Option 1 (recommandée)** : en C2, `LeftRight` / `CircleCamera` (flèches gauche/droite, souris X) font varier un
décalage de lacet `C2Yaw`. `DownUp` / `RotateCamera` (flèches haut/bas, souris Y) font varier un décalage de hauteur
`C2Pitch`, borné. La molette (`ScrollDownUp`) fait varier la distance `C2Dist`, entre 100 et 300 cm (175 au
départ). `Desired` tourne avec `C2Yaw` autour du personnage. Le confinement du § 3 et le repli s'appliquent
ensuite, sans changement. Relais : en tête des 5 événements de déplacement de Room, une branche « vue = `CamRoom` »
vrai → réglage de C2 ; faux → chaîne actuelle (déplacement de `SceneCamera`).
- **Option 2** : en C2, le premier appui sur une commande de caméra rend la vue manuelle (`SceneCamera`, comme avant
B2), puis la touche C reprend le cycle. C'est plus simple, mais la poursuite est perdue jusqu'au prochain C.
## 7. Marche du personnage
Hors périmètre de cet amendement tant que le test qui tranche n'est pas fait : C3 (ancienne vue) puis ZQSD, dans le
build B2. Si le personnage marche en C3 et pas en C2, la cause est CAM et une section 7 sera écrite. Sinon, la cause
est hors CAM et se signale au lot concerné (B-SOL, menu ou scène restés actifs).
## 8. Critères ajoutés
- V5 (dump de Room) : `SphereTraceSingle` 3 (cible, repli, trajectoire) ; `FClamp` ou `Clamp` ≥ 3 ;
`Vector_Distance` ≥ 1 ; `VInterpTo` 1 ; `RInterpTo` 1 ; `SetViewTargetWithBlend` 3 ; ordre 465 → 466 inchangé.
- Essais (§ (f)) :
- dos à un mur, coin de pièce, couloir étroit : la caméra reste dans la pièce et se relève au lieu de coller au mur ;
- demi-tour rapide : aucune image derrière un mur ;
- C1 → C2 : la première image est déjà dans la pièce ;
- ruelle extérieure : la caméra reste entre les façades (mesure de l'emprise, § 3) ;
- option 1 : flèches, souris et molette font tourner et éloigner C2.
## 9. Coût estimé (copie UE)
| Partie | Nœuds | MCP | Contrôles et build |
|---|---|---|---|
| B2b-1 à B2b-4 (confinement, repli, trajectoire) | ≈ 40 | ≈ 45 min | V5, V6 ≈ 5 min ; V7 ≈ 5 min |
| Option 1 (pilotage) | ≈ 30 | ≈ 35 min | dans le même build |
| Option 2 (pilotage) | ≈ 10 | ≈ 15 min | dans le même build |
Total avec l'option 1 : ≈ 1 h 30 de copie UE, puis un nouvel essai.