165 lines
12 KiB
Markdown
165 lines
12 KiB
Markdown
# CAM-B2p-G-SPEC : C3 dans le cycle C du sexe, recadrage sur le couple, caméra qui suit le couple (2026-10-14)
|
||
|
||
Demande de l'utilisateur (COMMUN-11, relayée par Big Boss) : « Je perds la vue du couple en mode scene. Il faudrait
|
||
ajouter aussi C3 au show pour récupérer le focus ou recentrer la vue sur le MC ou le couple ». Cela remplace la
|
||
règle « deux modes seulement ». SPEC en lecture seule ; **aucune IMPL avant le GO**.
|
||
|
||
## 1. DIAG (journal COMMUN-11, 11:15 à 11:24 UTC, lu sans le modifier)
|
||
- Bornes (F2, 11:15:53) : `X [-3131897, -3131172] Y [-14967563, -14966863] … source murs Wall*, murs 4, plafond
|
||
trouve 1` (283) ; sol `Box` ±3200 cm. **F1 marche** : quatre murs reconnus, intérieur de 7,25 × 7 m.
|
||
- **La caméra de scène ne suit jamais le couple.** Pendant la scène, le couple est déplacé :
|
||
- glisser : de (-3131756, -14967071) à (-3131637, -14967030), puis à (-3131483, -14967023) ;
|
||
- flèches : à 11:23:18-20, vers (-3131552, -14966953) ;
|
||
- hauteur : Z de 100 à 127 (molette, `deplace hors prise … +9` à 11:23:16), soit la racine à 141 cm au-dessus du
|
||
sol (« hauteur sur la surface 203 cm » à la prise).
|
||
|
||
`SceneCamera` reste pourtant où le jeu l'a posée (le cadrage de `pickPreset`, au début de la scène). Elle ne bouge
|
||
que par l'orbite (B2n, ZQSD) et le tangage (souris Y, `RotateCamera`), sans jamais se réorienter vers le couple.
|
||
Le couple finit hors du cadre. Cause **établie** par l'absence de toute écriture de position de caméra liée au
|
||
couple dans le code (B2n, P3 et Room 125 tournent ou avancent la caméra, sans cible) ; **estimée** pour le cadrage
|
||
exact à l'écran.
|
||
- **Les clics sans prise (11:23:47 à 11:24:02, `G=1 prise=0`) en sont la conséquence.** La sélection demande que le
|
||
curseur soit à moins de 120 px du segment bassin-tête **projeté à l'écran**. Couple hors du cadre ou derrière la
|
||
caméra : la projection échoue, et il n'y a pas de prise. C'est voulu.
|
||
- Un mur entre la caméra et le couple n'est pas exclu, mais le journal ne le montre pas (il n'y a pas de témoin
|
||
d'occlusion en mode Scene).
|
||
- Remarque pour Big Boss : aucune ligne `Show couple : place reprise` dans ce journal, alors que plusieurs poses ont
|
||
déplacé le meneur (11:22:15, 11:22:21). **À vérifier : G3 (CAM `03D85D28` + STE) est-il dans le build
|
||
COMMUN-11 ?**
|
||
|
||
## 2. Conception proposée
|
||
### G-a, recadrage (C++, `LPCameraModeSubsystem`)
|
||
`RecenterSceneCamera()` place `SceneCamera` sur le couple :
|
||
- cible = pivot du couple, plus 60 cm au-dessus de la racine du maillage (le milieu du corps) ;
|
||
- distance par défaut 300 cm, hauteur +120 cm. L'azimut de la caméra actuelle autour du couple est gardé, pour
|
||
limiter le saut ;
|
||
- caméra bornée dans l'intérieur réel (F1), à 20 cm des murs et sous le plafond. Un tracé Visibility de la cible
|
||
vers la caméra (couple ignoré) la ramène devant le premier obstacle, comme un bras de caméra ;
|
||
- rotation : regard sur la cible ;
|
||
- une ligne au journal : `Sexe : vue recadree sur le couple (raison)`.
|
||
|
||
### G-b, recadrage à l'entrée en mode Scene (C++)
|
||
À chaque passage de la vue vers `SceneCamera` pendant le sexe (entrée en scène, retour depuis le dernier POV), on
|
||
appelle `RecenterSceneCamera()` une fois.
|
||
|
||
### G-c, la caméra de scène suit le couple (C++)
|
||
- En mode Scene, quand le pivot du couple bouge hors d'un glisser (flèches, molette, borne E1, jeu), `SceneCamera`
|
||
se déplace du même vecteur, à la même image. Le cadrage est gardé.
|
||
- Pendant un glisser, la caméra reste figée (B2p-D) ; au relâcher, elle ne saute pas.
|
||
- Borne de distance douce : au-delà de 900 cm du couple, la caméra est ramenée à 900 cm sur l'axe actuel.
|
||
|
||
### G-d, C3 dans le cycle C du sexe : nouveau cycle **Scene → C3 → POV 1 → … → POV n → Scene**
|
||
La touche C est gérée par le PC (Blueprint) : `IfThenElse_44` (`SexCameraIndex` inférieur au nombre de personnes →
|
||
POV suivant ; sinon → Scene). Deux façons de faire :
|
||
- **Option 1 (recommandée) : PC, par MCP, petit ajout.**
|
||
- Une variable `SexC3` (bool) dans le PC.
|
||
- Dans la voie sexe de la touche C (`IfThenElse_23.then`), avant `44` : Branche (`POVOn` faux ET `SexC3` faux) :
|
||
- vrai : `SexC3` = vrai, fin (la vue ne change pas) ;
|
||
- sinon, si `SexC3` est vrai : `SexC3` = faux, puis `44` (POV 1, comme aujourd'hui).
|
||
- La voie « Scene » (else de 44) remet `SexC3` à faux.
|
||
- Le C++ suit `PC.SexC3` par réflexion :
|
||
- au front montant, `RecenterSceneCamera()` ;
|
||
- tant qu'il est vrai, l'indicateur affiche « Camera: C3 Couple ».
|
||
|
||
En C3, l'orbite, ZQSD, la molette et le glisser marchent comme en Scene (même caméra).
|
||
- Volume : environ 6 nœuds et 1 variable dans le PC (MCP, GO du PC nécessaire), plus environ 20 lignes de C++.
|
||
- **Option 2 (C++ seul, sans asset) : intercepter C.** On ne la recommande pas. Le C++ voit l'appui sur C en mode
|
||
Scene, laisse le PC passer en POV 1, puis le défait une image plus tard (vue, `POVOn`, `SexCameraIndex`). Mais la
|
||
voie POV du PC change aussi des visibilités (cheveux, panneau `Wall`, tête), et il faudrait les défaire. C'est
|
||
fragile, avec une image de POV visible.
|
||
|
||
### G-e, Room
|
||
**Room n'est pas touché.** La vue Scene est déjà `SceneCamera` (B2p-R) ; le reste est en C++. Seul le PC est touché
|
||
dans l'option 1.
|
||
|
||
## 3. Estimation
|
||
- C++ (G-a, G-b, G-c, suivi de `SexC3`, indicateur) : environ 150 lignes, 1 h 30 d'écriture, 25 min de VAL statique,
|
||
sans jeton.
|
||
- PC (option 1) : instantané, environ 30 appels MCP (lp-mcp-bp), VAL V5 et V6 par un agent distinct. Environ 40 min
|
||
d'éditeur sous UE-GO. Le PC doit être dans le GO.
|
||
- Essais :
|
||
- CAM-76 : C en scène, ordre Scene → C3 → POV 1 → POV 2 → Scene ;
|
||
- CAM-77 : C3 recadre sur le couple, même après un glisser ou des flèches ;
|
||
- CAM-78 : entrée en Scene recadrée ;
|
||
- CAM-79 : flèches et molette, la caméra suit le couple ;
|
||
- CAM-80 : caméra jamais hors de la pièce ni derrière un mur au recadrage.
|
||
|
||
## 4. Risques
|
||
- G-c : un déplacement du couple par le jeu (changement d'animation, recalage) déplace aussi la caméra. C'est le but,
|
||
mais le cadrage de `pickPreset` n'est plus gardé.
|
||
- Option 1 : la variable `SexC3` reste vraie si la scène se termine en C3. La voie de fin de scène doit la remettre à
|
||
faux. Le C++ la remet aussi à faux quand `SexOn` passe à faux (réflexion, variable du PC).
|
||
- Le recadrage peut tomber derrière un meuble haut : le tracé ramène la caméra devant l'obstacle (vue plus proche).
|
||
|
||
## 5. Compléments COMMUN-11 (R4) : G-e (lit), G-f (dessus des meubles), G-g (panneau des positions)
|
||
### 5.1 DIAG (journal COMMUN-11, lu sans le modifier)
|
||
- **La hauteur de pose est fausse depuis le début de la scène.** Toutes les prises disent `hauteur sur la surface
|
||
189 cm` (couple au sol, Z = 87), puis 203 et 206 cm (établi : lignes `couple pris` de 11:17 à 11:31).
|
||
- Au sol, la racine du maillage est à 87 − 88 = −1, soit **101 cm au-dessus du sol** (−102) : le couple flotte.
|
||
- B2p-D garde cet écart pris à la prise (`GrabHeight`) et le reporte sur chaque nouvelle surface. Un couple qui
|
||
flotte au départ flotte donc partout, et il « se pose » 2 m au-dessus d'un meuble (Z = 150 à 11:31).
|
||
- **Le tracé vertical (canal Visibility) ne voit pas le lit** (estimé, fort). Au-dessus du lit, il traverse jusqu'au
|
||
sol : depuis E2, la surface vaut au moins le dessus du sol. La hauteur prise sur le lit vaut alors l'écart au sol.
|
||
STE, lui, met les meubles en Block sur le canal **Pawn** pendant la scène (`Show couple : Pawn chambre Block=14`).
|
||
Le tracé de CAM doit utiliser ce canal-là.
|
||
- **`NODE_AddStaticMeshComponent-0_60`** est un meuble où une PNJ est assise (`Occupied by Jasmine`, dessus à
|
||
−52,3). Son maillage n'est pas nommé dans le journal : ce peut être un lit au nom inattendu, ou un siège voisin.
|
||
Le témoin de refus écrira désormais le nom du maillage. La règle des lits reste celle de STE (`IsBedMesh`).
|
||
- **« pour lit je dois passer latéralement »** : avec une hauteur fausse (lit non vu, écart de 189 cm), la boîte de
|
||
test de G1 est placée trop haut ou trop bas par rapport au cadre et à la tête de lit. Elle recouvre un meuble
|
||
voisin ou le bout du lit, et le pas est refusé. Une hauteur juste règle l'essentiel ; G1 garde le refus des
|
||
meubles qui dépassent la surface.
|
||
|
||
### 5.2 G-e : pose sur le lit (C++)
|
||
- Tracé vertical sur le **canal Pawn** (même réglage que STE pendant la scène), avec la règle « surface ≥ dessus du
|
||
sol » de E2.
|
||
- **Hauteur = surface + écart racine-acteur + 3 cm** : la racine du maillage est posée sur la surface, comme dans les
|
||
poses du jeu (COMMUN-6 : `root=-46` pour un lit à −49). Elle ne dépend plus de l'écart pris à la prise. Un couple
|
||
qui flottait retombe sur la surface au premier glisser.
|
||
- La ligne `couple pris` donne l'écart racine-surface réel, et le nom du composant de surface.
|
||
|
||
### 5.3 G-f : surfaces admises (C++)
|
||
- Au glisser, la surface sous la place visée doit être le **sol de la pièce** (`Room.Box`, ou aucun impact au-dessus
|
||
du sol) ou un **lit** (règle `IsBedMesh` de STE : nom contenant « bed », `fnt_ext011`, `fnt_new045`, `fnt_new235`).
|
||
- Toute autre surface (commode, bureau, armoire) : le couple ne va pas là ; il reste à la dernière place admise. Une
|
||
ligne est écrite par changement : `Sexe : surface refusee <composant> (<maillage>)`.
|
||
- Les lignes `place refusee` (G1) donnent aussi le nom du maillage.
|
||
|
||
### 5.4 G-g : panneau des positions au clavier et au clic molette (PC + C++)
|
||
DIAG (dump du PC) :
|
||
- un **clic court** (bouton tenu moins de 0,2 s, `HoldTime`) du gauche ou du droit, pendant le sexe, passe par
|
||
`IfThenElse_42` → `110` → `123` (`SexOn`) → `CallFunction_35` **`LeftMouseSexOn`**, ou par `IfThenElse_43` →
|
||
`111` → `19` → `15` (`SexOn`) → `IfThenElse_10` ;
|
||
- `LeftMouseSexOn` (`CustomEvent_11`) → `IfThenElse_10` (`Cursor.BelowCursor` visible) : vrai → `ExitSexActions`
|
||
(cache le panneau), faux → `GI.SexInterface.TextBlock_1` visible (montre le panneau). C'est la bascule du panneau
|
||
des actions et positions ;
|
||
- la **barre espace** est l'action `Pause` : `InputAction_3` (estimé : seule action qui bascule `GI.GamePaused`) →
|
||
`63` (`BuilderOn`) → `40` → `277` `PlayClick` → `GamePaused = NOT GamePaused`. Pendant le sexe, Espace met donc le
|
||
jeu en pause ;
|
||
- **le clic molette** sert à l'orbite (action `RotateCamera` : molette ou Alt ; `MoveCamera` estimé).
|
||
|
||
Correctif proposé :
|
||
- **PC (MCP, sous UE-GO)** :
|
||
- (1) couper la bascule par les clics pendant le sexe : `break_pins` `123.then` → `35` et `15.then` → `10` (2
|
||
coupures). Hors sexe, les branches `else` ne changent pas ;
|
||
- (2) Espace pendant le sexe : dans la voie `Pause`, une Branche (`GI.SexOn`) entre `40.then` et `277`. Vrai → un
|
||
nouvel appel `LeftMouseSexOn` (bascule du panneau, sans pause) ; faux → `277` (pause, inchangée). Cela fait
|
||
2 nœuds et 4 liens.
|
||
- **C++** : clic molette court pendant le sexe (appui puis relâcher en moins de 0,2 s, souris immobile à 5 px près)
|
||
→ `PC.LeftMouseSexOn` par `ProcessEvent` (événement sans paramètre). Une glissée à la molette reste l'orbite. Une
|
||
ligne `Sexe : panneau bascule (clic molette)`.
|
||
- **Retour à la sortie** : tout est conditionné par `SexOn`. Hors sexe, les clics gauche et droit (`else` de 123 et
|
||
de 15) et Espace (pause) sont inchangés, et le C++ n'agit pas.
|
||
- À confirmer à l'essai : `InputAction_3` est bien `Pause` (Espace). L'éditeur MCP le montrera au passage (nom de
|
||
l'action du nœud).
|
||
|
||
### 5.5 Estimation revue
|
||
- C++ en plus (G-e, G-f, noms de maillage dans les refus, clic molette) : environ 70 lignes, 45 min, 20 min de VAL
|
||
statique.
|
||
- PC en plus (G-g : 2 coupures, 2 nœuds, 4 liens), dans le même passage MCP que `SexC3` (G-d) : environ 50 appels au
|
||
total, environ 55 min d'éditeur, puis VAL V5 et V6.
|
||
- Essais :
|
||
- CAM-81 : glisser sur le lit, de face et d'en haut, posé sur le matelas ;
|
||
- CAM-82 : glisser sur une commode, refusé ;
|
||
- CAM-83 : clics gauche et droit sans bascule du panneau ; Espace et clic molette basculent ;
|
||
- CAM-84 : hors sexe, Espace met en pause et les clics font comme avant.
|