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

93 lines
6.2 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-B2n : orbite de la caméra de scène autour du couple (Room, fiche lp-mcp-bp, 2026-10-14)
Origine : `CAM-COMMUN5-DIAG.md` § 3. Défaut d'origine : en mode Scene, la souris fait tourner la caméra sur place au
lieu de tourner autour du couple. Gel des scènes levé pour l'alpha. Room seul.
## Barème
a0 b1 c1 d0 e1 f1 = 4 → N1, ajusté à N3 (MCP) ; S = C3 1 + f 1 (choix du pivot) = 2 < 3 : une fiche, sans SPEC
séparée. 7 nœuds, environ 14 liens, environ 35 appels. Case C9a.
## État (dump Room `CAM-B2i-VAL_LPDumpFunction_20261013-225125.txt`, Room `18565365…` ou celui laissé par B2k)
Chemin de la souris sans Maj :
- `CircleCamera` (`CustomEvent_1`, sortie `DeltaSeconds` = lacet souris) → 96 (après B2i : faux pendant le sexe) →
`IfThenElse_26` (`BuilderOn` OU `SexOn` OU `SpaceOn`) → `IfThenElse_19` (`MoveObject`) **faux** →
`K2Node_CallFunction_149` = `SceneCamera.K2_SetActorRotation(148)` ;
- 148 = `MakeRotator(Pitch ← 147.Pitch, Yaw ← CommutativeAssociativeBinaryOperator_26 = 147.Yaw + DeltaSeconds)` ;
- 147 = `BreakRotator(146 = SceneCamera.GetActorRotation)` ;
- **`149.then` vide**.
Getters existants :
- `VariableGet_102.SceneCamera` (self Room ; sorties 146, 149, 229, 228) ;
- `VariableGet_86.SexOn` (self ← 103.GI ; après B2i : 19.B, 29, 28 et NOT 453) ;
- `VariableGet_106.SexPersons` (self ← 105.GI ; sortie → `MacroInstance_13.Array`).
## Règle
Pendant le sexe seulement (`SexOn` vrai), après la rotation de 149 :
- Pivot P = `GetActorArrayAverageLocation(GI.SexPersons)`, la moyenne des personnes du sexe ;
- `SceneCamera.SetActorLocation(P + RotateAngleAxis(SceneCamera.GetActorLocation − P, DeltaSeconds, (0, 0, 1)))`.
La position tourne autour de P du même angle que le lacet : la caméra garde son cadrage sur le couple. Hors sexe
(constructeur, ancienne vue C3), le comportement est inchangé.
## Écritures (préfixe `/Game/BPs/Room.Room:EventGraph.`)
1. `load_asset` `/Game/BPs/Room`. `get_node_infos` sur 149, 148, 147, 146, 26, 19, 102, 86, 106 et `CustomEvent_1`.
Tout écart avec la section « État » : arrêt. Relever les PinID.
2. Types (`find_node_types`, puis confirmation par `get_node_infos` après création) :
- Branche : `Utilitaires|ContrôleDeFlux|Branche` ;
- `GameplayStatics::GetActorArrayAverageLocation` ;
- `Actor::K2_GetActorLocation` ;
- `KismetMathLibrary::Subtract_VectorVector` ;
- `KismetMathLibrary::RotateAngleAxis` (déjà utilisé : 497) ;
- `KismetMathLibrary::Add_VectorVector` ;
- `Actor::K2_SetActorLocation`.
3. `create_node` des 7 nœuds, près de 149.
4. Liens :
- L1 : `149.then` → Branche.execute ;
- L2 : `86.SexOn` → Branche.Condition ;
- L3 : `106.SexPersons` → `GetActorArrayAverageLocation.Actors`. Si le type est refusé (tableau de `Person`
contre tableau d'`Actor`) : arrêt et compte rendu. Repli à décider : `SexPersons[0]`, avec un `IsValidIndex`.
- L4 : `102.SceneCamera` → `GetActorLocation.self` ;
- L5 : `GetActorLocation.ReturnValue` → `Subtract.A` ; L6 : `Average.ReturnValue` → `Subtract.B` ;
- L7 : `Subtract.ReturnValue` → `RotateAngleAxis.InVect` ; L8 : `CustomEvent_1.DeltaSeconds` →
`RotateAngleAxis.AngleDeg` ; `set_pin_value` `RotateAngleAxis.Axis` = `0,0,1` ;
- L9 : `Average.ReturnValue` → `Add.A` ; L10 : `RotateAngleAxis.ReturnValue` → `Add.B` ;
- L11 : `Branche.then` → `SetActorLocation.execute` ; L12 : `102.SceneCamera` → `SetActorLocation.self` ;
L13 : `Add.ReturnValue` → `SetActorLocation.NewLocation` ;
- `SetActorLocation` : `bSweep` et `bTeleport` faux ; Branche.else vide.
5. Relecture :
- 149 then → Branche ;
- 102 : sorties 146, 149, 229, 228, `GetActorLocation` et `SetActorLocation` ;
- 86 : + Branche ; 106 : + Average ;
- `CustomEvent_1.DeltaSeconds` : + `RotateAngleAxis` ;
- aucun autre lien modifié (19, 26, 29, 96 et la boucle `SexPersons` 13 et 153 inchangés).
6. `is_dirty` = vrai ; compilation stricte ; `save_assets` de Room seul ; MD5.
## Garde `Accessed None`
- `SceneCamera` est déjà lu sans garde par 146 et 149 sur ce même chemin : comportement inchangé.
- `SexPersons` vide pendant `SexOn` : `GetActorArrayAverageLocation` rend (0, 0, 0), sans `Accessed None`. La caméra
tournerait alors autour de l'origine. Cas non observé, à surveiller à l'essai.
## Limite connue (non traitée ici, à décider)
Si la scène part de C2, la vue reste sur `CamRoom` jusqu'au premier C (`CAM-COMMUN4-DIAG.md` § 2). L'orbite ne se
voit qu'après un premier passage Scene → POV → Scene, quand la vue est `SceneCamera`. Pour l'avoir dès le début, il
faudrait poser `SceneCamera` en vue à l'entrée du sexe : branche `SexOn` dans la voie C2 de `UpdateRoomCam`, avec
environ 4 nœuds. Ce serait une fiche B2o, à décider par l'utilisateur.
## VAL
- V5 : dump Room ; seules différences : 7 nœuds et les liens ci-dessus ; EventGraph = nœuds avant + 7.
- V6 : `CompileAllBlueprints` = référence.
- V7 : voir `CAM-COMMUN-6-TESTS.md`.
## Retour arrière
`.\Tools\Restore.ps1 -Lot CAM-B2n -Only Content\BPs\Room.uasset` (ou l'instantané commun du passage), éditeur fermé.
## Amendement B2n-a (2026-10-14, arrêt de `lp-mcp-bp` à l'étape 3, décision de l'orchestrateur)
- **E1** : `GameplayStatics::GetActorArrayAverageLocation` est `BlueprintCallable`, pas pur (`GameplayStatics.h:76`).
Il a execute et then. **Option A retenue** : le mettre dans le fil, après la Branche.
- **L11a** : `Branche.then` → `GetActorArrayAverageLocation.execute` (`K2Node_CallFunction_535`, déjà créé) ;
- **L11b** : `535.then` → `SetActorLocation.execute`.
Le reste ne change pas : `SexPersons` n'est lu que si `SexOn` est vrai.
- **E2** : la soustraction et l'addition de vecteurs se font par les opérateurs génériques `Utilitaires|Opérateurs|
Soustraire` et `Ajouter`, typés vecteur au branchement. C'est la même fonction (`Subtract_VectorVector`,
`Add_VectorVector`), dans une autre classe de nœud.
- Nœuds déjà créés et gardés : Branche `K2Node_IfThenElse_101`, moyenne `K2Node_CallFunction_535`.
- L3 (`SexPersons` vers `Actors`) reste la condition d'arrêt prévue : si le type est refusé, arrêt sans repli.
- V5 : EventGraph = nœuds avant B2n + 7, avec un lien d'exécution de plus (L11a et L11b au lieu de L11).