Staging en camera's

Gevorderd Laatst bijgewerkt 10 jul 2026

Op deze pagina

Zonder enige staging zet Questwright simpelweg elke spreker met het gezicht naar zijn gesprekspartner en kadreert het de scène automatisch; veel quests hebben nooit meer nodig. Staging is er voor blocking met meerdere NPC’s, gespawnde figuranten, verplaatsingen tijdens de dialoog en handmatig geplaatste camera’s.

Het staging-canvas

De rechterzone van de Studio is een canvas met bovenaanzicht van de scène rond haar anker (een geplaatste dialoogmarker, of de transform van de questgever zelf als je er geen plaatst). Sleep marks om personages te positioneren, draai ze, voeg waypoints toe en plaats camera’s. Zet de cursor in een dialoogregel en het canvas markeert wie er op dat moment waar staat: de bezetting wordt regel voor regel door de hele scène heen bijgehouden.

Het staging-canvas: marks van deelnemers, een waypoint en een camera met zijn frustum

Alles wat je op het canvas bewerkt, wordt weggeschreven naar het staging:-blok van het questbestand. Net als bij de rest van de Studio is met de hand schrijven gelijkwaardig:

staging:
  anchor: DialogueMarker_Barn   # a placed BP_QW_DialogueMarker; omit → the giver's transform
  settle_timeout: 4.0           # seconds a walk may take before falling back to teleport
  marks:
    - { id: giver, actor: Bran,   pos: [-100, -30], face: hero, keep: true }
    - { id: hero,  actor: Player, pos: [-100,  60], face: giver }
    - { id: m1,    actor: Mira,   pos: [ 140,  30], face: anchor, appear: arrive }
    - { id: m2,    actor: Mira,   pos: [  40, -80], face: anchor }   # waypoint

De belangrijkste velden van een mark:

VeldFunctie
idStabiele id; line.stage.to en camera’s verwijzen met de id naar marks
actorSpeaker key; laat weg voor een puur waypoint
pos[x, y] in cm, ten opzichte van het anker; de hoogte wordt tijdens runtime op de grond vastgezet
face / yawAutomatisch draaien naar het anker / een spreker / een mark, of een handmatige hoek
appearplaced (staat er al bij het begin van de scène) of arrive (spawnt buiten beeld en loopt binnen; zijn eerste regel wacht op aankomst)
keepOf een gespawnde deelnemer blijft staan nadat de dialoog eindigt (standaard: despawnen)

Deelnemers die al in het level staan (en de Player) worden verplaatst; alle anderen worden gespawnd vanuit de cast en automatisch opgeruimd.

Verplaatsen tijdens de dialoog

Hang een stage:-overgang aan een willekeurige regel; de regel wacht tot de verplaatsing klaar is (met een teleport als terugval na settle_timeout):

- { by: Mira, id: step, text: "Let me see the tracks.",
    stage: [ { who: Mira, to: m2, approach: walk } ] }

Eén mark houdt één deelnemer tegelijk vast: de validator markeert twee mensen op dezelfde mark op hetzelfde moment als een fout, en het canvas toont het conflict.

Automatische camera’s

Standaard kadreert de compiler elke scène met een shotgrammatica: een establishing wide op de eerste regel, close-ups na meerdere opeenvolgende regels van dezelfde spreker en over-the-shoulder framing op basis van de geadresseerde in to: van elke regel. Per regel overschrijf je dat met shot: (wide, ots, cu, reaction), en het beleid per quest is instelbaar:

camera:
  cu_run_threshold: 2     # close-up after N consecutive lines from one speaker (default 3)
  establishing: true      # establishing wide on the first line (default true)
  choice_shot: wide       # shot while the player is choosing (default wide)

Eigen cameramarks

Voor volledige regie zet je camera’s op het canvas; elke camera krijgt een live frustumvoorbeeld, zodat je precies ziet wat hij kadreert:

Eigen cameramarks op het staging-canvas met hun live frustumvoorbeelden tussen de deelnemers en waypoints

staging:
  cameras:
    - { id: cam_quick,  class: dynamic,         pos: [200, 0],    height: 200, look_at: anchor }
    - { id: cam_window, class: BP_MyCam_Voyeur, pos: [-320, 90],  height: 150, look_at: giver, fov: 28 }
    - { id: cam_dutch,  class: BP_MyCam_Dutch,  pos: [140, 200],  height: 120, yaw: -135, pitch: -8 }

# on a line:            shot: cam_window
# while choices unfold: camera: { choice_shot: cam_high }

Hoe het in elkaar past:

  • De mark is een instantie: een stabiele id, een positie ten opzichte van het anker en een richting. Regels verwijzen via shot: naar de id van de mark, nooit naar een klasse of naar coördinaten.
  • De herbruikbare optiek (lens / DOF / filmback) zit in een cameraklasse, oftewel in elke Blueprint-subklasse van QuestwrightDialogueSceneCamera. Het ingebouwde class: dynamic heeft helemaal geen Blueprint nodig (standaardoptiek; combineer met fov: voor een snelle eigen hoek).
  • look_at richt op het anker, een spreker of een mark en wordt op het moment van de cut opgelost, zodat een camera zijn onderwerp in beeld houdt, ook na verplaatsingen tijdens de dialoog.
  • De automatische grammatica kiest nooit eigen marks; die gelden alleen als expliciete overschrijving per regel (of via choice_shot).
  • Laadt een cameraklasse tijdens runtime niet, dan valt de regel terug op een wide shot met een waarschuwing; de scène breekt nooit.

Ontwerpnotities

Camera’s snijden direct (SetViewTargetWithBlend met blend nul) en personages bewegen met de eigen AI-locomotie van de engine. Er is geen Sequencer en er zijn geen gebakken cinematics, en daarom blijven scènes werken wanneer je level, personages of animaties veranderen. Alle verwijzingen gaan naar stabiele id’s (marks, regels, quests), nooit naar coördinaten of naar de binnenkant van klassen.