Creating Faceposer gestures: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (added language bar.)
(formatting, clarification)
Line 1: Line 1:
{{lang|{{PAGENAME}}|title=Creating Faceposer Gestures}}
{{languageBar}}
Faceposer can use any sequence in a model as a gesture, but timing tags (Apex, Accent, Loop, End), thumbnail frames, classification as a posture, etc. must be specified through a sequence's own keyvalues. This page is for creating new gestures or postures designed to be used in Faceposer. If you want to know how to place an existing gesture into a choreography scene, see [[Choreography_creation/Creating_Events/Skeletal_animation|Creating skeletal animation events]].
{{faceposer|4|nt=0}} can use any sequence in a model as a gesture, but timing tags (Apex, Accent, Loop and End), thumbnail frames, classification as a posture, etc. must be specified through a sequence's own [[$sequence#Miscellaneous|keyvalues]]. This page is for creating new gestures or postures designed to be used in {{faceposer|1|nt=0}}. If you want to know how to place an existing gesture into a choreography scene, see [[Choreography_creation/Creating_Events/Skeletal_animation|Creating skeletal animation events]].
{{note|These are for a ''sequence's'' keyvalues, not the model's {{ent|$keyvalues|alt=$KeyValues}}.}}
{{note|These are for a ''[[$sequence|sequence]]'s'' keyvalues, not the model's {{ent|$keyvalues|alt=$KeyValues}}.}}


== Example ==
== Example ==
An example of a gesture with Faceposer options. This was found in <code>models/male_gestures.mdl</code>. The rest of the sequence has been removed for easier reading.
An example of a gesture with Faceposer options. This was found in <code>models/male_gestures.mdl</code>. The rest of the sequence has been removed for easier reading.
<pre>
<source lang=c>
  $sequence "b_head_back" {
  $sequence "b_head_back" {
...
...
Line 26: Line 26:
}
}
  }
  }
</pre>
</source>


== Options ==
== Options ==
;<code>type <choices></code>
;<code>type <choices></code>
: ''What Faceposer should classify this animation as.''
: What {{faceposer|2|nt=0}} should classify this animation as.
:; <code>gesture</code>
:; <code>gesture</code>
:: Classifies the animation as a gesture, putting it in the "Gestures" category and behaving like a gesture during playback.
:: Classifies the animation as a gesture, putting it in the "Gestures" category and behaving like a gesture during playback.
:; <code>posture</code>
:; <code>posture</code>
:: Classifies the animation as a posture, putting it in the "Postures" category and behaving like a posture during playback.
:: Classifies the animation as a posture, putting it in the "Postures" category and behaving like a posture during playback.


{{note|Time tag names are not tied to anything at all, meaning you could name them anything you want. The tags listed are just those found in Valve's gestures.}}
{{note|Time tag names are not tied to anything at all, meaning you could name them anything you want. The tags listed are just those found in Valve's gestures.}}
;<code>tags { [stuff] }</code>
;<code>tags { <stuff> }</code>
: ''Timing tags and which frame they are located at. All tags should be subkeys.''
: Timing tags and which frame they are located at. All tags should be subkeys.
:; <code>apex <frame></code>
:; <code>apex <[[int]]|frame></code>
:; <code>accent <frame></code>
:; <code>accent/extreme <[[int]]|frame></code> : Not used by postures.
:; <code>loop <frame></code>
:; <code>loop <[[int]]|frame></code>
:; <code>end <frame></code>
:; <code>end <[[int]]|frame></code>
 
;<code>entrytag <[[string]]|tag></code>
: Which of the tags specified in <code>tags</code> should be the "entry tag". Mostly always set to <code>apex</code>
 
;<code>[exittag <[[string]]|tag>]</code>
: Which of the tags specified in <code>tags</code> should be the "exit tag".
 
;<code>endmatch <[[string]]|tag></code>
: Only for postures.
 
 
Loops are handled differently :
 
 
;<code>tags { <stuff> }</code>
: Timing tags and which frame they are located at. All tags should be subkeys.
:; <code>in <[[int]]|frame></code>
:; <code>loop <[[int]]|frame></code>
:; <code>end <[[int]]|frame></code>
:; <code>out <[[int]]|frame></code>


;<code>entrytag <tag></code>
;<code>startloop <[[string]]|tag></code>
: ''Which of the tags specified in <code>tags</code> should be the "entry tag".''
: Which of the tags specified in <code>tags</code> should the loop start. {{confirm}}


;<code>exittag <tag></code>
;<code>endloop <[[string]]|tag></code>
: ''Which of the tags specified in <code>tags</code> should be the "exit tag".''
: Which of the tags specified in <code>tags</code> should the loop end. {{confirm}}


;<code>startloop <tag></code>
;<code>exittag <[[string]]|tag></code>
: ''Which of the tags specified in <code>tags</code> should the loop start.'' {{confirm}}
: Which of the tags specified in <code>tags</code> should be the "exit tag".


;<code>endloop <tag></code>
: ''Which of the tags specified in <code>tags</code> should the loop end.'' {{confirm}}


;<code>thumbnail_frame <frame></code>
;<code>thumbnail_frame <[[int]]|frame></code>
: ''Which frame of the animation should appear in Faceposer's animation browser.''
: Which frame of the animation should appear in {{faceposer|2|nt=0}}'s animation browser. It is best to set it to the <code>accent</code> or <code>loop</code> frame.


;<code>eye_height <float></code>
;<code>eye_height <[[float]]|height></code>
: {{todo}}
: {{todo}}


[[Category:QC Keyvalues]]
[[Category:QC Keyvalues]]

Revision as of 08:38, 24 May 2025

English (en)Translate (Translate)

HLFaceposer Faceposer can use any sequence in a model as a gesture, but timing tags (Apex, Accent, Loop and End), thumbnail frames, classification as a posture, etc. must be specified through a sequence's own keyvalues. This page is for creating new gestures or postures designed to be used in Faceposer. If you want to know how to place an existing gesture into a choreography scene, see Creating skeletal animation events.

Note.pngNote:These are for a sequence's keyvalues, not the model's $KeyValues.

Example

An example of a gesture with Faceposer options. This was found in models/male_gestures.mdl. The rest of the sequence has been removed for easier reading.

 $sequence "b_head_back" {
	...
 
	keyvalues
	{
		faceposer 
		{
			"type" "gesture"
			"tags" 
			{
				"apex" "10"
				"extreme" "42"
				"loop" "43"
				"end" "44"
			}
			"entrytag" "apex"
			"thumbnail_frame" "42"
		}
	}
 }

Options

type <choices>
What HLFaceposer Faceposer should classify this animation as.
gesture
Classifies the animation as a gesture, putting it in the "Gestures" category and behaving like a gesture during playback.
posture
Classifies the animation as a posture, putting it in the "Postures" category and behaving like a posture during playback.


Note.pngNote:Time tag names are not tied to anything at all, meaning you could name them anything you want. The tags listed are just those found in Valve's gestures.
tags { <stuff> }
Timing tags and which frame they are located at. All tags should be subkeys.
apex <int|frame>
accent/extreme <int|frame>
Not used by postures.
loop <int|frame>
end <int|frame>
entrytag <string|tag>
Which of the tags specified in tags should be the "entry tag". Mostly always set to apex
[exittag <string|tag>]
Which of the tags specified in tags should be the "exit tag".
endmatch <string|tag>
Only for postures.


Loops are handled differently :


tags { <stuff> }
Timing tags and which frame they are located at. All tags should be subkeys.
in <int|frame>
loop <int|frame>
end <int|frame>
out <int|frame>
startloop <string|tag>
Which of the tags specified in tags should the loop start. [confirm]
endloop <string|tag>
Which of the tags specified in tags should the loop end. [confirm]
exittag <string|tag>
Which of the tags specified in tags should be the "exit tag".


thumbnail_frame <int|frame>
Which frame of the animation should appear in HLFaceposer Faceposer's animation browser. It is best to set it to the accent or loop frame.
eye_height <float|height>
[Todo]