Expressions, gestures, moods and poses
A line of dialogue is more than its words. A bot can shrug as it speaks, look surprised, turn hostile for the rest of the conversation, or sit down. You author that in ChatMapper, next to the line it belongs to, and it plays when the scenario runs in your space.
There are two ways to write a performance, and they mean the same thing:
- Fields on the node set what happens as the line starts.
- Tags inside the dialogue text place something at a point in the line.
Use fields for the ordinary case. Use a tag when it matters where in the sentence something happens, or when someone other than the speaker should react.
What a character can do
Section titled “What a character can do”| Kind | Lasts | Example | In a LearnBrite space |
|---|---|---|---|
| Gesture | A moment | wave, nod, shrug | Plays a body animation. |
| Expression | A moment | surprised, angry, warm | Plays on the face only. |
| Mood | Until changed | confident, reserved, angry | Changes how the bot idles, talks and gestures from then on. |
| Pose | Until changed | sit_chair, lean_wall | Changes the bot’s body position. Needs a recent runtime; see Limits. |
Gestures and expressions are beats: they happen and are over. Mood and pose are states: set one and it stays until a later line changes it. Each time a conversation starts, every character in it returns to its own baseline, if it has one.
Before you start
Section titled “Before you start”You need a project in LearnBrite mode. The full list of gestures and poses only appears in that mode, because it is the space’s own catalogue.
Step 1 — Add the performance fields
Section titled “Step 1 — Add the performance fields”In the sidebar, open Details → Custom field templates and click Add performance fields (expression, gesture, mood, pose).
This adds the fields to dialogue nodes and actors. If nodes or actors you created earlier do not show them, expand Dialog nodes in the same section and click Add missing fields to all existing dialog nodes, then do the same under Actors.
You only do this once per project.
Step 2 — Direct a line
Section titled “Step 2 — Direct a line”Select a node. On the Content tab of the Inspector, open Advanced at the bottom. You now have:
| Field | What it does |
|---|---|
| Expression | The speaker’s facial expression for this line. |
| Expression_intensity | How strongly, from 0 to 1. Leave blank for the default. |
| Gesture | A body gesture as the line starts. |
| Mood | The speaker’s mood from this line on. Blank leaves it unchanged. |
| Pose | The speaker’s pose from this line on. Blank leaves it unchanged. |
Each is a dropdown. Leave a field blank and nothing happens for it. All of them apply to the node’s Actor.
Choosing a gesture
Section titled “Choosing a gesture”The Gesture list is grouped:
- Works on every player — fifteen common gestures such as
wave,nod,shake head,shrug,point,laugh,applause,thumbs up. Prefer these: a scenario written with them also performs outside LearnBrite. - LearnBrite gestures — the rest of what your space can play, from
bowandcheertorotfl. - LearnBrite animations — individual clips, grouped by what they are. Pick from here when you want one specific animation, such as a particular dance.
Choosing a mood
Section titled “Choosing a mood”| Mood | Plays as the space’s |
|---|---|
neutral | The default manner |
confident | Confident |
reserved, sad | Reserved |
energetic | Urban |
bored | Waiting |
angry | Grumpy |
happy | Happy |
Step 3 — Give a character a baseline
Section titled “Step 3 — Give a character a baseline”Open Actors in the sidebar and open an actor. Mood and Pose there set how that character starts every conversation it takes part in. A node’s own Mood or Pose overrides the baseline from that line on.
Placing something inside a line
Section titled “Placing something inside a line”Type a tag into Dialogue Text where it should happen:
I never [gesture:shrug]agreed to that.The tag names what kind of thing it is, then which one:
[gesture:wave][expression:surprised][mood:angry][pose:sit_chair]Tags never appear on screen and are never spoken. They are removed from the text the learner sees and from the text sent to a voice.
Where a line is split into sentences with |, a tag belongs to the sentence
it sits in:
I never agreed to that.|[expression:angry]You know I didn't.Making the other character react
Section titled “Making the other character react”By default a tag is performed by the speaker. Add a target to give it to someone else:
[gesture:nod,target:conversant]Take your time.[gesture:wave,target:"Dr Lee"]Hello, everyone.conversant is the node’s Conversant. A name is any actor in the project;
put it in quotes if it contains a space. This is how a listener reacts while
another character is talking, which is often what makes a scene believable.
Tags you already use still work
Section titled “Tags you already use still work”[gesture:…] has always been a LearnBrite tag. Existing projects that use
it, including with settings such as duration or mask, publish exactly as
before:
[gesture:wave,duration:3000]Checking your work
Section titled “Checking your work”Validate reports performance problems as warnings. They never block a publish.
| Warning | What it means |
|---|---|
| …is not in the performance vocabulary | The name is misspelled or does not exist. |
| …is not in the LearnBrite catalogue; it is published as written | ChatMapper does not recognise the gesture, but sends it to the space unchanged in case the space does. |
| …does nothing on LearnBrite | The space has no way to show it. A few expressions, such as contempt, have no face animation there. |
| performance cue in Menu Text never fires | Tags only work in Dialogue Text. Move it to the line that is spoken. |
| …needs two actors: add a target | hug, handshake and hi5 involve a second character. |
The simulator and the standalone players show your text without the tags. They do not animate anything; to see the performance, publish and open the space.
What happens when you publish
Section titled “What happens when you publish”Your project is not changed. On publish, ChatMapper translates each field
and tag into the action the space understands, using the animation name the
space actually has. That is why nod works even though the space calls that
animation something else.
A node with performance fields but no dialogue text, such as a player choice, still performs: the fields run when the node plays.
Limits today
Section titled “Limits today”- Everything fires as the line appears. A tag in the middle of a
sentence does not yet wait for that word to be spoken. Split the sentence
with
|if the timing matters. - Poses need a recent runtime. On an older space a pose is ignored. It does no harm.
- Three moods may look the same as neutral on current avatars: Waiting, Grumpy and Happy.
- Two-character gestures play between the learner’s avatar and the target bot.
- First person and VR participants may not see a bot’s body or face clearly. Do not let a gesture carry information the words do not.
Good practice
Section titled “Good practice”- Fewer, well-placed beats read better than constant movement.
- A listener reacts to what is said, not to how the speaker feels. Calm delivery of bad news should get a concerned listener.
- Change mood where the story changes, usually after a learner’s choice, so the consequence is visible.
- Gestures do not mean the same thing everywhere. A thumbs up or a beckoning hand is not neutral in every culture.
- Camera shots and gaze — frame the performance.
- Inline markup — the full tag reference, for developers.