Creating Faceposer gestures: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(Was making a gesture for Faceposer and noticed there was no documentation for it)
 
(Undo revision 486670 by Equalizer5118 (talk))
Tag: Undo
 
(5 intermediate revisions by 4 users not shown)
Line 1: Line 1:
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]].
{{languageBar}}
 
{{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 [[$keyvalues|$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 27: 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 gesture, 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.}}
;<code>tags { <stuff> }</code>
: Timing tags and which frame they are located at. All tags should be subkeys.
:; <code>apex <[[int]]|frame></code>
:; <code>accent/extreme <[[int]]|frame></code> : Not used by postures.
:; <code>loop <[[int]]|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 :


{{note|There is evidence that time tag names are not tied to anything at all, meaning you could name them anything you want. This has not been tested at all and needs to be confirmed.}}
;<code>tags { [stuff] }</code>
: ''Timing tags and which frame they are located at. All tags should be subkeys.''
:; <code>apex <frame></code>
:; <code>accent <frame></code>
:; <code>loop <frame></code>
:; <code>end <frame></code>


;<code>entrytag <tag></code>
;<code>tags { <stuff> }</code>
: ''Which of the tags specified in <code>tags</code> should be the "entry tag".''
: 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>exittag <tag></code>
;<code>startloop <[[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 start. {{confirm}}


;<code>startloop <tag></code>
;<code>endloop <[[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 the loop end. {{confirm}}


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




;<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]]

Latest revision as of 18:02, 3 August 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]