这篇条目有关 Source引擎。如需详情,点击这里。

Zh/$sequence: Difference between revisions

From Valve Developer Community
< Zh
Jump to navigation Jump to search
m (title changes)
(deepseek translation)
Line 1: Line 1:
{{LanguageBar}}
{{LanguageBar}}
{{translate}}
{{translate}}
{{toc-right}}
{{tabsBar|main=gs|base=$sequence}}
{{this is a|QC命令|name=$sequence}} 该命令用于定义[[skeletal animation|骨骼动画]]。可单独使用,也可结合一个或多个<code>[[$animation]]</code>来利用Source引擎更高级的骨骼动画功能。


{{toc-right}} 
{{note|''所有''包含多边形的模型必须至少有一个<code>$sequence</code>。如果不需要实际动作,最简单的方法是复用参考SMD文件。仅使用[[$includemodel]]的模型不需要任何<code>$sequence</code>。}}
{{tabsBar|main=gs|base=$sequence}} 
:{{todo|如果[[$includemodel]]中没有定义任何$sequence会发生什么?}}
{{this is a|QC command|name=$sequence}} 它定义了一个{{L|Skeletal animation|骨骼动画}}。可以单独使用,也可以与一个或多个<code>[[$animation]]</code>结合使用,以利用Source引擎更高级的骨骼动画功能。 


{{note|''所有''包含任何多边形的模型都必须至少有一个<code>$sequence</code>。如果您实际上不需要任何动作,最简单的方法是重用参考的SMD文件。仅使用{{L|$includemodel}}的模型不需要任何<code>$sequences</code>。}} 
== 用法 ==
:{{todo|如果在{{L|$includemodel}}中不存在任何$sequences,会发生什么?}}


== 用法 == 
<code>$sequence</code>有两种模式:一种直接引用单个[[skeletal animation|骨骼动画]](SMD或DMX文件);另一种需要通过中间<code>[[$animation]]</code>定义。
{{note|仅当目标游戏包含[[Dmxconvert|Dmx转换工具]]时才能使用DMX格式的骨骼动画。}}


<code>$sequence</code> 有两种模式。一种直接访问单个{{L|Skeletal animation|骨骼动画}}(SMD或DMX),另一种需要中间的<code>[[$animation]]</code>。
{{note|<code>$sequence</code>只能识别QC文件中'''上方'''定义的<code>$animation</code>。}}
{{note|DMX骨骼动画仅在模型编译所针对的游戏包含{{L|Dmxconvert}}工具时可用。}}


{{note|<code>$sequence</code>只能引用QC文件中出现在其'''上方'''的<code>$animation</code>。}}
  $sequence <名称> <骨骼动画[[Studiomdl Data|SMD]]/[[DMX]]文件路径> <简单选项> { ''// 左花括号'''必须'''与命令在同一行''
 
// 若内部无内容可省略花括号
  $sequence <name> <skeletal animation {{L|Studiomdl Data|SMD}}/{{L|DMX}}> <简单选项> {
<高级选项>
// 起始大括号'''必须'''与指令位于同一行
<[[Animation Events|动画事件]]>
// 如果内容为空,大括号可以省略
<简单选项>
<高级选项>
<{{L|Animation Events|事件}}>
<简单选项>
  }
  }


  $sequence <name> <简单选项> { // 起始大括号'''必须'''与指令位于同一行
  $sequence <名称> <简单选项> { ''// 左花括号'''必须'''与命令在同一行''
<[[$animation]] 名称>
<[[$animation]]名称列表>
<高级选项>
<高级选项>
<{{L|Animation Events|事件}}>
<[[Animation Events|动画事件]]>
<简单选项>
<简单选项>
  }
  }


=== 示例 ===
=== 示例 ===


<syntaxhighlight lang=php highlight=4>
<syntaxhighlight lang=php highlight=4>
$modelname "weapons/shell.mdl"
$modelname "weapons/shell.mdl"
$cdmaterials "models/weapons/"
$cdmaterials "models/weapons/"
$body shell "shell-ref"
$body shell "shell-ref"
$sequence idle "shell-idle"
$sequence idle "shell-idle"
</syntaxhighlight>
</syntaxhighlight>


<syntaxhighlight lang=php>
<syntaxhighlight lang=php>
$animation a_strokechin "strokechin" subtract idle 0
$animation a_strokechin "strokechin" subtract idle 0


$sequence strokechin {
$sequence strokechin {
a_strokechin
a_strokechin
delta
delta
}
}
</syntaxhighlight>
</syntaxhighlight>


<syntaxhighlight lang=php>
<syntaxhighlight lang=php>
$sequence run_holding_all {
$sequence run_holding_all {
a_runS a_runSE a_runE a_runNE a_runN_SMG a_runNW a_runW a_runSW a_runS
a_runS a_runSE a_runE a_runNE a_runN_SMG a_runNW a_runW a_runSW a_runS


blendwidth 9
blendwidth 9
blend move_yaw -180 180
blend move_yaw -180 180
addlayer layer_run_holding
addlayer layer_run_holding
ACT_RUN_RIFLE 1
ACT_RUN_RIFLE 1
node "running"
node "running"
}
}
</syntaxhighlight>
</syntaxhighlight>


== 选项 ==
== 选项 ==


=== 简单 ===
=== 基础选项 ===


; <code><[[string]]|name></code>
; <code><[[string]]|名称></code>
: 动画的名称。将在 HLMV、Hammer 等工具中显示。
: 动画名称。将显示在HLMV、Hammer等工具中。


; <code><[[string]]|骨骼动画文件></code>
; <code><[[string]]|骨骼动画文件路径></code>
: $sequence 源文件的路径。''包含此选项表示你使用的是命令的简单版本。''
: <code>$sequence</code>的源文件路径。''包含此参数表示使用该命令的简单模式。''


; <code>frame <[[int]]|起始帧> <[[int]]|结束帧></code>
; <code>frame <[[int]]|起始帧> <[[int]]|结束帧></code>
; <code>frames <[[int]]|起始帧> <[[int]]|结束帧></code>
; <code>frames <[[int]]|起始帧> <[[int]]|结束帧></code>
: 指定从源动画中提取的一段帧数。对于只需播放特定动画的一部分帧来说很有用。
: 指定从源动画中提取的帧范围。适用于裁剪特定动画中未使用的帧。
:: 例如,如果源动画包含 80 帧(范围为 0-79),但此动画仅需播放最后 30 帧,那么 <code>frames 50 79</code> 将只加载这些帧。
:: 例如:若源动画包含80帧(0-79),但该动画只需播放最后30帧,则使用<code>frames 50 79</code>仅加载这些帧。
: 也可以用来提取单一的动画帧,只需将起始和结束帧相同即可。
: 当起始帧与结束帧相同时可提取单帧动画。
: <code>frames</code> <code>frame</code> 可以互换使用。
: <code>frames</code><code>frame</code>可互换使用。
: {{warning|所有在序列中使用的帧数(例如 [[Animation Events|动画事件]])都是相对于 <code>起始帧</code> 的。}}
: {{warning|序列中其他位置使用的帧号(如[[Animation Events|动画事件]])均相对于<code>起始帧</code>}}
: {{bug|在 [[blend sequence|混合序列]] 中,这个选项只影响第一个指定的动画。}}
: {{bug|在[[blend sequence|混合序列]]中,此选项仅影响第一个指定的动画。}}
: {{fix|你可以将此选项从 $sequence 中分离,将每个动画拆分为单独的 [[$animation]],然后在每个动画中使用 <code>frame/frames</code> 参数来指定它们的帧范围。}}
: {{fix|可将每个动画分离到独立的[[$animation]]中,并在其上方使用<code>frame/frames</code>参数指定帧范围。}}


; <code>numframes <[[int]]|frames></code>
; <code>numframes <[[int]]|总帧数></code>
: 强制动画拥有指定数量的帧,可能通过裁剪动画或重复最后一帧来填充所需的帧数。
: 强制设置动画总帧数,通过裁剪或重复最后一帧实现。
: 如果与 <code>frame/frames</code> 一起使用,它将尊重起始帧。当指定的帧数太少时,会裁剪动画。但当指定的帧数太多时,会重复最后一帧以达到帧数限制。
: <code>frame/frames</code>联用时,将保留起始帧。若总帧数小于实际帧数则截断,大于则重复最后一帧。
:: 例如,<code>frames 10 12 numframes 12</code> 将提取帧 10 到 12,但第 12 帧会重复,达到指定的 12 总帧数,就像动画的真实结束。
:: 例如:<code>frames 10 12 numframes 12</code>将提取10-12帧,但第12帧会被重复以满足总帧数要求。
{{note|在源引擎中,动画的起始帧为 0,而 <code>numframes</code> 从 1 开始,因为它指定的是“帧数”。若要使动画在第 30 帧结束,你需要将 <code>numframes</code> 设置为 31,因为这将捕捉 31 总帧(范围为 0-30)。}}
{{note|Source引擎动画从第0帧开始,但<code>numframes</code>从1计数。设置<code>numframes</code>为30将包含0-29帧,若需包含到第30帧需设为31。}}


; <code>origin <[[float]]|x> <[[float]]|y> <[[float]]|z></code>
; <code>origin <[[float]]|x> <[[float]]|y> <[[float]]|z></code>
: 调整动画在其自身局部空间中的位置。
: 在局部空间内调整动画位置。


; <code>angles <[[float]]|x> <[[float]]|y> <[[float]]|z></code>
; <code>angles <[[float]]|x> <[[float]]|y> <[[float]]|z></code>
: 调整动画在其自身局部空间中的旋转。
: 在局部空间内调整动画旋转。


; <code>rotate <[[float]]|angle></code>
; <code>rotate <[[float]]|角度></code>
: 类似于 <code>angles</code>,但只沿 Z 轴旋转。
: 仅沿Z轴旋转,等同于<code>angles</code>的Z轴分量。


; <code>scale <[[float]]|scale></code>
; <code>scale <[[float]]|缩放比例></code>
: 乘以该序列中骨骼的大小,接受负值。
: 缩放此序列中的骨骼尺寸。允许负值。


; <code>reverse</code> {{CSGO|add}}{{also|{{gmod}}}}
; <code>reverse</code> {{CSGO|add}}{{also|{{gmod}}}}
: 反转动画。
: 反转动画播放方向。


; <code>loop</code>
; <code>loop</code>
: 标记序列为循环播放动画,动画将持续播放,并导致 StudioMDL 在首尾帧上进行一些清理。
: 标记为循环动画,StudioMDL会对首尾帧进行优化。
: 在当前播放时,如果请求重新播放,该序列将无法中断自身。
: 启用后,动画在播放过程中无法被自身中断。


; <code>hidden</code>
; <code>hidden</code>
: 禁止在用户界面中列出该 $sequence。对于仅作为其他动画层的序列很有用。
: 在用户界面中隐藏该$sequence。适用于仅作为其他动画图层的序列。


; <code>noanimation</code>
; <code>noanimation</code>
: 强制序列拥有零权重动画。有效忽略 <code>frame/frames</code>,但会尊重 <code>numframes</code>。
: 强制序列使用零权重动画。忽略<code>frame/frames</code>但保留<code>numframes</code>。
: 等同于使用 [[$weightlist]] 删除所有骨骼的权重。用于创建仅由叠加或混合层组成的特殊复合序列。
: 等效于使用移除所有骨骼权重的[[$weightlist]]。适用于创建仅含叠加层的复合序列。


; <code>fps <[[float]]|帧每秒></code>
; <code>fps <[[float]]|帧率></code>
: 覆盖动画的帧率。如果未指定,默认值为 <code>30</code>。
: 覆盖动画帧率。默认30。
: {{note|这些是 ''动画帧'' - 不是屏幕帧!}}
: {{note|此为'''动画'''帧率,非屏幕刷新率!}}
: {{bug|在 {{gldsrc}} 中,使用负帧率不会导致动画倒放,而是导致动画崩溃。<br>在 {{src}} 中,[[StudioMDL_(Source)|模型编译器]]会直接退出,帧率小于 0。}}
: {{bug|在{{gldsrc}}中使用负帧率会导致动画异常;{{src}}[[StudioMDL_(Source)|模型编译器]]会在帧率小于0时报错终止。}}


; <code><[[string]]|motion extract axis></code>
; <code><[[string]]|动作提取轴向></code>
: 如果模型实际需要向前移动,但在游戏中却必须“原地行走”,则创建运动动画会变得更容易。此命令解决了这个问题,通过从动画中移除根骨骼的平移。
: 解决角色"原地行走"动画需求,通过剥离根骨骼位移实现。
:: 你可以在同一行前添加 <code>walkframe <[[int]]|motion extraction endframe></code> 来限制特定部分动画的运动提取。
:: 可在轴向前添加<code>walkframe <[[int]]|动作提取结束帧></code>来限制提取范围。
:: {{note|提取总是从动画的开始或最后指定的 <code>walkframe</code> 开始,到指定帧结束。若要创建延迟,请使用 <code>walkframe</code>,但不指定轴。}}
:: {{note|提取始终从动画起始或上一个<code>walkframe</code>开始,到指定帧结束。使用无轴向的<code>walkframe</code>可创建延迟。}}
:: {{tip|你可以添加多个 <code>walkframe</code> 以获得更准确的结果。}}
:: {{tip|可通过多个<code>walkframe</code>提升精度。}}
 
<syntaxhighlight lang=php highlight=7,8,9>
<syntaxhighlight lang=php highlight=7,8,9>
$sequence sword_attack {
$sequence sword_attack {
"knight_anims/sword_attack"
    "knight_anims/sword_attack"
ACT_SPECIAL_ATTACK1 1
    ACT_SPECIAL_ATTACK1 1
fadein 0.2
    fadein 0.2
fadeout 0.2
    fadeout 0.2
fps 30
    fps 30
walkframe 10 LX LY LZR //从起始到第10帧提取动作
    walkframe 10 LX LY LZR // 从起始到第 10 帧提取运动 
walkframe 30 LX LY LZR //从第10到30帧提取动作
    walkframe 30 LX LY LZR // 从第 10 到第 30 帧提取运动 
LX LY LZR //从第30帧到结尾提取动作
    LX LY LZR // 从第 30 帧直到动画结束提取运动 
}
}
</syntaxhighlight>
</syntaxhighlight> : 接受的轴包括:
:可用轴向:
:* X、Y、Z、XR、YR、ZR - R 代表“旋转”。
:* X, Y, Z, XR, YR, ZR(R表示旋转)
:: {{warning|这些轴似乎完全忽略了 <code>walkframe</code>。}}
::{{warning|这些轴向可能完全忽略<code>walkframe</code>。}}
:* LX、LY、LZ、LXR、LYR、LZR - 根骨骼沿轴移动,直到动画完成一半,然后返回原位。 {{tip|你可以提取任意组合的轴运动,只需在其中间加空格。}}
:* LX, LY, LZ, LXR, LYR, LZR:根骨骼沿轴向移动至动画中途后返回原位。{{tip|可组合使用多个轴向。}}
:* LM - 指定运动提取应被视为线性。
:* LM:线性动作提取
:* LQ - 指定运动提取应被视为二次。
:* LQ:二次曲线动作提取
该命令也可用于 [[$animation]]。
: 此命令也可用于[[$animation]]。


; <code>activity <[[string]]|name> <[[float]]|weight></code>
; <code>activity <[[string]]|活动名称> <[[float]]|权重></code>
: 将序列链接到一个 [[activity]]。
: 将序列关联到[[activity|游戏活动]]。
:: {{tip|如果活动名称以 "ACT_" 开头,则可以省略活动关键字。当看到 ACT_ 时,默认即为活动。}}
: {{tip|"ACT_"开头的活动名称可省略<code>activity</code>关键字。}}
: 如果多个 <code>$sequence</code> 使用相同的 [[activity]],则 <code>weight</code> 指定在调用该活动时选择此序列的可能性。任何特定的 <code>$sequence</code> 播放的几率等于其权重除以所有权重的总和。
: 权重决定该序列在活动触发时被选中的概率(权重/总权重)。
:: 例如,如果一个名为 <code>swing_a</code> 的 <code>$sequence</code> 拥有权重 2,而另一个名为 <code>swing_b</code> 的 <code>$sequence</code> 拥有权重 1,那么 <code>swing_a</code> 被选择的几率为 2/3,而不是 <code>swing_b</code>。
:: 例如:权重为2的<code>swing_a</code>和权重为1的<code>swing_b</code>,前者有2/3概率被选中。
:: {{note|如果活动中只有一个序列,则其权重无关紧要。}}
:: {{note|若活动仅关联一个序列,权重无效。}}


; <code>autoplay</code>
; <code>autoplay</code>
: 使序列在任何情况下都可以持续播放,即使模型在执行其他动画时。适用于混合呼吸动画和其他自动化运动。如果模型拥有多个 <code>autoplay</code> 的 $sequences,它们会按在 QC 文件中出现的顺序叠加。
: 使该序列始终在顶层播放,无视其他动画。适用于呼吸等混合动画。{{warning|勿用于可能正常播放的动画,否则会导致重复播放。}}
:: {{warning|不要用于可能正常播放的动画,否则会导致重复播放并导致动作叠加。}}
 
; <code>addlayer <[[string]]|other $sequence name></code>
: 在当前序列的基础上播放另一个序列。动画会同时开始和结束,因此如果它们的总运行时间(帧率 * 帧数)不一致,将会按比例影响添加层的帧率(如果适用)。另一个 $sequence 不必位于当前序列之上。
: 通常用于添加经过 <code>delta</code> 处理的层,例如 [[Blend sequence|瞄准矩阵]],或是仅影响特定骨骼的特殊 [[$weightlist|加权]] 层。
: 如果另一个 <code>$sequence</code> 在运行时会被 [[$includemodel|导入]],可以 [[$declaresequence|提前声明]]。


; <code>blendlayer <[[string]]|other $sequence name> <[[int]]|startframe> <[[int]]|peakframe> <[[int]]|tailframe> <[[int]]|endframe> [options...]</code>
; <code>addlayer <[[string]]|其他$sequence名称></code>
: 类似于 <code>addlayer</code>,但新序列仅在指定的帧范围内播放,并接受多个选项。
: 在当前序列上叠加播放其他序列。两者同步起止,时长差异会影响叠加层的帧率。被叠加序列无需定义在当前序列上方。
: 动画在 <code>startframe</code> 处以 0% 强度开始,在 <code>peakframe</code> 达到 100% 强度,在 <code>tailframe</code> 开始减弱,并在 <code>endframe</code> 完全消失。
: 通常用于添加[[Blend sequence|瞄准矩阵]]等<code>delta</code>层或[[$weightlist|特定骨骼权重]]层。


; <code>blendlayer <[[string]]|其他$sequence名称> <[[int]]|起始帧> <[[int]]|峰值帧> <[[int]]|衰减帧> <[[int]]|结束帧> [选项...]</code>
: 类似<code>addlayer</code>,但仅在指定帧范围播放,并支持多种选项。
: 强度从<code>起始帧</code>0%渐变至<code>峰值帧</code>100%,从<code>衰减帧</code>开始淡出,到<code>结束帧</code>完全消失。
: 选项:
: 选项:
:; <code>spline</code>
:; <code>spline</code>
:: 淡入淡出时使用样条曲线,而不是线性渐变。
:: 使用样条曲线渐变
 
:; <code>xfade</code>
:; <code>xfade</code>
:: 层只会淡入,不会淡出。
:: 仅淡入不淡出
 
:; <code>poseparameter <[[string]]|参数名称></code>
:; <code>poseparameter <[[string]]|name></code>
:: 使用[[$poseparameter|姿势参数]]控制渐变。示例:
:: 允许使用 [[$poseparameter|姿态参数]] 来控制层的淡入淡出,而不是使用父 <code>$sequence</code> 的帧。当启用此选项时,帧范围被用来确定姿态参数的值如何使层淡入或淡出。
::: <code>blendlayer aimmatrix -1 0 0 1 poseparameter move_x</code>
 
示例:<code>blendlayer aimmatrix -1 0 0 1 poseparameter move_x</code>
 
<pre>
<pre>
param value: -2.000 -1.500 -1.000 -00.80 -00.60 -00.40 -00.200 000.00 00.200 00.400 00.600 00.800 1.0000 1.5000 2.0000
参数值: -2.000 -1.500 -1.000 -00.80 -00.60 -00.40 -00.200 000.00 00.200 00.400 00.600 00.800 1.0000 1.5000 2.0000
layer weight: 0.000% 0.000% 0.000% 20.00% 40.00% 60.00% 80.00% 100.0% 80.00% 60.00% 40.00% 20.00% 0.000% 0.000% 0.000%
层权重: 0.000% 0.000% 0.000% 20.00% 40.00% 60.00% 80.00% 100.0% 80.00% 60.00% 40.00% 20.00% 0.000% 0.000% 0.000%
</pre> : 当使用 <code>spline</code> 选项时,这些值会发生变化,但开始和结束时间保持一致。
</pre>
 
:; <code>noblend</code>
:; <code>noblend</code>
:: 禁止层淡入淡出,层在激活时始终保持 100% 强度。此选项还会使层忽略序列过渡。
:: 保持100%强度,忽略序列过渡。
:: {{note|如果需要固定强度但不希望忽略序列过渡,则可以将峰值帧和尾帧分别设置为起始帧和结束帧。这会使命令等同于 <code>addlayer</code>,但限制在特定的帧范围内。}}
 
:; <code>local</code>
:; <code>local</code>
:: 将层标记为局部上下文序列。在主序列的关键帧应用到骨骼之前,与主序列混合此层。主要用于序列过渡,避免层与主序列分开淡化。
:: 将层标记为本地上下文序列,在主序列关键帧应用前混合。
 
: {{warning|除非叠加序列启用<code>realtime</code>,其帧率会适配主序列时长。}}
: {{warning|除非混合序列具有 <code>realtime</code> 选项,否则混合序列的帧率会相对于父序列调整,以确保从 <code>startframe</code> 开始并在 <code>endframe</code> 结束。例如,如果父序列和混合序列均以每秒 30 帧播放且持续 30 帧,但混合序列仅在第 5 帧至第 20 帧播放(总共 15 帧,仅为原长度的一半),则混合序列将以每秒 60 帧('''两倍'''原始帧率!)播放,以便从第 5 帧开始并在第 20 帧结束。}}
 
: 当使用 <code>spline</code> 选项时,这些值会发生变化,但开始和结束时间保持一致。 


; <code>worldspace</code>
; <code>worldspace</code>
: 将骨骼位置计算为世界坐标,而不是相对于父动画的位置(当作为层使用时)。
: 作为图层时,以世界空间计算骨骼位置。{{note|使用<code>weightlist</code>时根骨骼权重不可为0。}}
: {{note|当使用 <code>weightlist</code> 时,根骨骼的权重必须不为 0。}}
: {{todo|实际效果?}}
: {{todo|尚不确定它是否实际有作用。}}


; <code>worldspaceblend</code>
; <code>worldspaceblend</code>
: {{todo|文档尚未完成。}}
: {{todo|待文档化}}


; <code>snap</code>
; <code>snap</code>
: 在过渡到此动画时移除所有过渡混合。适用于由模型状态的突然剧烈变化引发的反应动画,例如生物的抽搐或武器开火。
: 过渡到该动画时取消所有混合。适用于突然状态变化(如受击动作)。
: {{note|在快速重复的动画(例如步枪的开火动画)中,这可能显得生硬且有问题,因为它会直接跳回第一帧,没有任何渐变效果。因此,使用 <code>fadein 0.05</code> 可能是更好的选择。}}
: {{note|快速重复动画(如步枪开火)使用此选项可能导致卡顿,建议改用<code>fadein 0.05</code>}}


; <code>realtime</code>
; <code>realtime</code>
: 通常,当播放一个序列时,它会从第 0 帧开始,可以受到通过 <code>blendlayer</code> 添加的任何父序列的帧率调整的影响。此选项会改变这种行为,使动画与地图时钟同步。适用于不应以与父 $sequence 相同速率播放的层,例如呼吸动画。
: 同步动画时钟与地图时间。适用于呼吸等独立速率图层。{{warning|'''所有'''使用此选项的模型将全局同步!建议仅用于视图模型等唯一实体。}}
: {{warning|<b><i>所有播放此动画的模型</i> 都会同步到地图时钟!</b> 应谨慎使用此选项,理想情况下仅用于在游戏中只出现一次的模型,例如视角模型。}}


; <code>fadein <[[float]]|seconds></code>
; <code>fadein <[[float]]|秒数></code>
: 覆盖此动画淡入所需的时间。默认值为 0.2 秒。
: 设置淡入时长。默认0.2秒。
: {{note|使用 <code>fadein 0</code> 可达到与 <code>snap</code> 相同的效果,但 [[HLMV]] 在启用自动混合时不会将其识别为快切,因此 <code>snap</code> 是必要的。}}
: {{note|<code>fadein 0</code>等效<code>snap</code>,但HLMV不会识别为snap。}}


; <code>fadeout <[[float]]|seconds></code>
; <code>fadeout <[[float]]|秒数></code>
: 覆盖此动画淡出所需的时间。默认值为 0.2 秒。
: 设置淡出时长。默认0.2秒。


; <code>weightlist <[[string]]|weightlist name></code>
; <code>weightlist <[[string]]|权重列表名称></code>
: 为该序列选择一个 [[$weightlist|权重列表]]
: 应用[[$weightlist|权重列表]]。若存在[[$defaultweightlist|默认权重列表]]将被覆盖。
: 如果使用了 [[$defaultweightlist|默认权重列表]],此命令会用指定的权重列表覆盖默认权重列表。


; <code>worldrelative</code> {{csgo|since}}
; <code>worldrelative</code> {{csgo|since}}
: {{todo|文档尚未完成。}}
: {{todo|待文档化}}
 
; <code>localhierarchy <[[string]]|bone name> <[[string]]|new parent name> [range <[[int]]|startframe> <[[int]]|peakframe> <[[int]]|tailframe> <[[int]]|endframe>]</code>
: 更改此动画中特定骨骼的父级。使用空字符串 "" 可以移除骨骼的父级。
: 此功能主要用于确保骨骼在混合时能够正确对齐。例如,如果武器通常由右手持有,但在此动画中由左手持有,混合时会以右手为参考导致抖动。此选项可以将其改为以左手为参考,从而消除抖动。
: <code>range</code> 是可选的,需指定四个帧号,用于定义在指定帧范围内如何逐渐应用新的层级。
: {{note|此更改不会影响动画的过渡部分,因此可能需要使用 <code>snap</code>。}}


; <code>compress <[[int]]|frameskip></code>
; <code>localhierarchy <[[string]]|骨骼名称> <[[string]]|新父骨骼名称> [range <[[int]]|起始帧> <[[int]]|峰值帧> <[[int]]|衰减帧> <[[int]]|结束帧>]</code>
: 从输入动画的第 0 帧开始,仅保存每隔 <code>frameskip</code> 帧的数据。<code>frameskip</code> 的值为 1 或更小则不会产生任何效果。
: 临时修改骨骼层级关系。""表示移除父骨骼。
: 用于优化混合抖动(如武器换手动画)。需配合<code>snap</code>使用。


; <code>posecycle <[[string]]|pose parameter></code>
; <code>compress <[[int]]|跳帧数></code>
: 使指定的 [[$poseparameter|姿势参数]] 控制动画帧,而不是在 [[blend sequence|混合序列]] 中播放的具体动画。
: 仅存储指定间隔的动画帧(从0开始)。值≤1无效。
: 可用于更轻松地创建详细的(但完全线性的)混合序列。尽管在 SDK 中不常用,但这种方法设置更快,并且没有混合 [[$animation|动画]] 数量的限制。
: 姿势参数的最小值和最大值决定了动画的起点和终点。以下是一个范围为 -180 到 180 的参数,用于一个总帧数为 9(范围 0-8)的动画的示例:


; <code>posecycle <[[string]]|姿势参数></code>
: 使用[[$poseparameter|姿势参数]]控制动画帧。适用于创建线性混合序列。
: 示例(参数范围-180~180,动画9帧):
<pre>
<pre>
参数值:   -180.0 -135.0   -90.0   -45.0     0.0   45.0   90.0   135.0   180.0
参数值: -180.0 -135.0 -90.0 -45.0   0.0   45.0   90.0 135.0 180.0
动画帧:      0      1       2       3       4       5       6       7       8
动画帧:     0     1     2     3     4     5     6     7     8
</pre> : {{warning|如果未使用 <code>$poseparameter</code> 预声明姿势参数,[[StudioMDL_(Source)|StudioMDL]] 仍会生成一个姿势参数,就像 <code>blend</code> 一样,但生成的范围将无效。}}
</pre>
: {{warning|未用<code>$poseparameter</code>预声明参数将导致范围错误。}}


=== 高级 ===
=== 高级选项 ===


除了所有简单选项外,还包括以下高级选项:
除基础选项外:


; <code>delta</code>
; <code>delta</code>
: 告诉 Source 引擎,引用于此序列的 <code>[[$animation]]</code> 已经经过 <code>subtract</code> 操作。此 $sequence 将叠加在当前正在播放的序列之上,而不是覆盖它们。
: 表示引用的[[$animation]]已进行<code>subtract</code>处理。该序列将在当前动画上层叠加播放。{{warning|未正确使用<code>subtract</code>将导致异常!}}
: {{warning|如果使用此选项时,<code>$animation</code> 未经过 <code>subtract</code> 操作,则会导致严重的问题!}}


; <code>predelta</code>
; <code>predelta</code>
: 类似于“presubtract”命令,但作用相反。该选项指示动画合成系统在添加当前骨骼设置时,以一个不同的参考帧为基础,而不是基于典型的交叉淡入权重方案覆盖每个骨骼的动画。
: 配合"presubtract"使用,改变骨骼动画合成基准。


; <code>blend <[[string]]|name> <[[float]]|min value> <[[float]]|max value></code>
; <code>blend <[[string]]|名称> <[[float]]|最小值> <[[float]]|最大值></code>
; <code>blendwidth <[[int]]|width></code>
; <code>blendwidth <[[int]]|宽度></code>
; <code>blendref <[[string]]|name></code>
; <code>blendref <[[string]]|名称></code>
; <code>blendcomp <[[string]]|name></code>
; <code>blendcomp <[[string]]|名称></code>
; <code>blendcenter <[[string]]|name></code>
; <code>blendcenter <[[string]]|名称></code>
; <code>calcblend <[[string]] name> <[[string]] attachment> <XR YR ZR></code>
; <code>calcblend <[[string]] 名称> <[[string]] 附着点> <XR YR ZR></code>
: 请参阅 [[Blend sequence]]。
: 详见[[Blend sequence|混合序列]]。


; <code>ikrule</code>
; <code>ikrule</code>
: 请参阅 [[$ikchain]]。
: [[$ikchain|反向运动学链]]。


; <code>iklock</code>
; <code>iklock</code>
: 冻结 [[$ikchain]] 中指定的骨骼。
: 锁定[[$ikchain|反向运动学链]]中的指定骨骼。
: 请参阅 [[$ikchain]]。


; <code>activitymodifier</code> <[[string]]|modifier> {{since|{{as}}|}} {{also|{{src13mp}}}}
; <code>activitymodifier</code> <[[string]]|修饰符> {{since|{{as}}|}} {{also|{{src13mp}}}}
: {{todo|文档未完成}}
: {{todo|待文档化}}


=== 杂项 ===
=== 杂项 ===


; <code>node (name)</code>
;node (名称)
: 标记该序列属于序列转换图表中的某个点。这适用于不改变图状态的动画,例如循环动画。可以有多个序列在图表中同一个节点下,这样它们就不需要过渡动画来彼此切换。
: 标记序列在状态图中的节点位置。循环动画常用此标签。同节点序列间无需过渡动画。
: 也可以将它们放在不同的点,并明确跳过过渡(见 $skiptransition)。没有声明的序列默认位于根节点,而转换图表假设任何序列都可以从根节点或到根节点直接进行无中间过渡的移动。
;transition (来源节点) (目标节点)
 
: 声明该序列为过渡动画(如行走转站立)。
; <code>transition (from) (to)</code>
;rtransition (名称1) (名称2)
: 指定动画从节点图的一个点进入,并在另一个点退出。用于播放过渡序列,例如 walk_to_stand、run_to_crouch 等。
: 可逆过渡动画。曾用于'''[[Half-Life|半衰期]]'''的[[monster_tentacle (GoldSrc)|触手怪]],不建议常规使用。{{inline note|name=原因?}}  
 
;exitphase (相位)
; <code>rtransition (name1) (name2)</code>
: 声明循环动画的过渡起始相位。{{warning|实际未实现}}
: 类似于 transition,但标记该序列可以倒序运行。这通常用于 [[monster_tentacle (GoldSrc)|Tentacle]] 在 '''[[Half-Life]]'''. 中的情况,除非特殊情况,不建议使用此选项。{{inline note|name=为什么?}}
;$skiptransition (名称1) (名称2) [(名称3)...]
 
: 允许指定节点间直接过渡(如行走转奔跑无需经过站立状态)。
; <code>exitphase (phase)</code>
;keyvalues { [内容] }
: 在循环动画之间,例如 "stand_to_run",此命令告诉移动系统从哪里开始下一个序列,假设它是循环的。假定你已经让共享下一节点的所有序列都匹配了阶段(见 startloop)。
: 为序列添加[[$keyvalues|键值块]](用于Faceposer手势设置)。
: {{warning|无效,游戏未实现此功能}}
 
; <code>$skiptransition (name1) (name2) [(name3) ...]</code>
: 添加规则到转换图表,允许在命名节点之间直接移动。这对于避免强制 "walk" 到 "run" 变成 "walk" 到 "stand" 再到 "run" 的转换非常有用。
 
; <code>keyvalues { [stuff] }</code>
: 添加一个特定序列的 keyvalue 块(见 [[$keyvalues]])。用于 [[Creating Faceposer gestures|设置 Faceposer 手势]]


== 事件 ==
== 事件 ==
可在$sequence中定义[[Animation Events|动画事件]]:


$sequence 可以在动画的不同时间点触发特定的 [[Animation Events]],如下所示:
<source lang=c>
$sequence tentacle_grab "tentacle_grab" {
  fps 15
  { event 1000 1 }
  { event 1004 4 "*scientist/scream02.wav" }
  { event 1003 18 "smash" }
  { event 1004 65 "*scientist/c1a4_sci_tent.wav" }
}</source>


<source lang=c> 
{{ACategory|QC Commands|sequence}}
$sequence tentacle_grab "tentacle_grab" {
  fps 15 
  { event 1000 1 } 
  { event 1004 4 "*scientist/scream02.wav" } 
  { event 1003 18 "smash" } 
  { event 1004 65 "*scientist/c1a4_sci_tent.wav" } 
</source>  [[Category:QC Commands|s]]

Revision as of 08:34, 28 January 2025

English (en)中文 (zh)Translate (Translate)
Info content.png
This page is Machine translated
It is not recommended to use machine translation without any corrections.
If the article is not corrected in the long term, it will be removed.
Also, please make sure the article complies with the alternate languages guide.(en)
This notice is put here by LanguageBar template and if you want to remove it after updating the translation you can do so on this page.


Info content.png
This page needs to be translated.
This page either contains information that is only partially or incorrectly translated, or there isn't a translation yet.
If this page cannot be translated for some reason, or is left untranslated for an extended period of time after this notice is posted, the page should be requested to be deleted.
Also, please make sure the article complies with the alternate languages guide.(en)

$sequence是一个QC命令,可在所有的 起源 起源 游戏中使用。 该命令用于定义骨骼动画。可单独使用,也可结合一个或多个$animation来利用Source引擎更高级的骨骼动画功能。

Note.png注意:所有包含多边形的模型必须至少有一个$sequence。如果不需要实际动作,最简单的方法是复用参考SMD文件。仅使用$includemodel的模型不需要任何$sequence
待完善: 如果$includemodel中没有定义任何$sequence会发生什么?

用法

$sequence有两种模式:一种直接引用单个骨骼动画(SMD或DMX文件);另一种需要通过中间$animation定义。

Note.png注意:仅当目标游戏包含Dmx转换工具时才能使用DMX格式的骨骼动画。
Note.png注意:$sequence只能识别QC文件中上方定义的$animation
$sequence <名称> <骨骼动画SMD/DMX文件路径> <简单选项> {		// 左花括号必须与命令在同一行
	// 若内部无内容可省略花括号
	<高级选项>
	<动画事件>
	<简单选项>
}
$sequence <名称> <简单选项> {		// 左花括号必须与命令在同一行
	<$animation名称列表>
	<高级选项>
	<动画事件>
	<简单选项>
}

示例

$modelname		"weapons/shell.mdl"
$cdmaterials		"models/weapons/"
$body		shell	"shell-ref"
$sequence idle	"shell-idle"
$animation a_strokechin "strokechin" subtract idle 0

$sequence strokechin {
	a_strokechin
	delta
}
$sequence run_holding_all {
	a_runS a_runSE a_runE a_runNE a_runN_SMG a_runNW a_runW a_runSW a_runS

	blendwidth 9
	blend move_yaw -180 180
	addlayer layer_run_holding
	ACT_RUN_RIFLE 1
	node "running"
}

选项

基础选项

<string|名称>
动画名称。将显示在HLMV、Hammer等工具中。
<string|骨骼动画文件路径>
$sequence的源文件路径。包含此参数表示使用该命令的简单模式。
frame <int|起始帧> <int|结束帧>
frames <int|起始帧> <int|结束帧>
指定从源动画中提取的帧范围。适用于裁剪特定动画中未使用的帧。
例如:若源动画包含80帧(0-79),但该动画只需播放最后30帧,则使用frames 50 79仅加载这些帧。
当起始帧与结束帧相同时可提取单帧动画。
framesframe可互换使用。
Warning.png警告:序列中其他位置使用的帧号(如动画事件)均相对于起始帧
Icon-Bug.png错误:混合序列中,此选项仅影响第一个指定的动画。  [todo tested in ?]
Note.png修复:可将每个动画分离到独立的$animation中,并在其上方使用frame/frames参数指定帧范围。
numframes <int|总帧数>
强制设置动画总帧数,通过裁剪或重复最后一帧实现。
frame/frames联用时,将保留起始帧。若总帧数小于实际帧数则截断,大于则重复最后一帧。
例如:frames 10 12 numframes 12将提取10-12帧,但第12帧会被重复以满足总帧数要求。
Note.png注意:Source引擎动画从第0帧开始,但numframes从1计数。设置numframes为30将包含0-29帧,若需包含到第30帧需设为31。
origin <float|x> <float|y> <float|z>
在局部空间内调整动画位置。
angles <float|x> <float|y> <float|z>
在局部空间内调整动画旋转。
rotate <float|角度>
仅沿Z轴旋转,等同于angles的Z轴分量。
scale <float|缩放比例>
缩放此序列中的骨骼尺寸。允许负值。
reverse 反恐精英:全球攻势(也存在于 Garry's Mod 之中)
反转动画播放方向。
loop
标记为循环动画,StudioMDL会对首尾帧进行优化。
启用后,动画在播放过程中无法被自身中断。
hidden
在用户界面中隐藏该$sequence。适用于仅作为其他动画图层的序列。
noanimation
强制序列使用零权重动画。忽略frame/frames但保留numframes
等效于使用移除所有骨骼权重的$weightlist。适用于创建仅含叠加层的复合序列。
fps <float|帧率>
覆盖动画帧率。默认30。
Note.png注意:此为动画帧率,非屏幕刷新率!
Icon-Bug.png错误:金源中使用负帧率会导致动画异常;起源模型编译器会在帧率小于0时报错终止。  [todo tested in ?]
<string|动作提取轴向>
解决角色"原地行走"动画需求,通过剥离根骨骼位移实现。
可在轴向前添加walkframe <int|动作提取结束帧>来限制提取范围。
Note.png注意:提取始终从动画起始或上一个walkframe开始,到指定帧结束。使用无轴向的walkframe可创建延迟。
Tip.png提示:可通过多个walkframe提升精度。
$sequence sword_attack {
	"knight_anims/sword_attack"
	ACT_SPECIAL_ATTACK1 1
	fadein 0.2
	fadeout 0.2
	fps 30
	walkframe 10 LX LY LZR //从起始到第10帧提取动作
	walkframe 30 LX LY LZR //从第10到30帧提取动作
	LX LY LZR //从第30帧到结尾提取动作
}
可用轴向:
  • X, Y, Z, XR, YR, ZR(R表示旋转)
Warning.png警告:这些轴向可能完全忽略walkframe
  • LX, LY, LZ, LXR, LYR, LZR:根骨骼沿轴向移动至动画中途后返回原位。
    Tip.png提示:可组合使用多个轴向。
  • LM:线性动作提取
  • LQ:二次曲线动作提取
此命令也可用于$animation
activity <string|活动名称> <float|权重>
将序列关联到游戏活动
Tip.png提示:以"ACT_"开头的活动名称可省略activity关键字。
权重决定该序列在活动触发时被选中的概率(权重/总权重)。
例如:权重为2的swing_a和权重为1的swing_b,前者有2/3概率被选中。
Note.png注意:若活动仅关联一个序列,权重无效。
autoplay
使该序列始终在顶层播放,无视其他动画。适用于呼吸等混合动画。
Warning.png警告:勿用于可能正常播放的动画,否则会导致重复播放。
addlayer <string|其他$sequence名称>
在当前序列上叠加播放其他序列。两者同步起止,时长差异会影响叠加层的帧率。被叠加序列无需定义在当前序列上方。
通常用于添加瞄准矩阵delta层或特定骨骼权重层。
blendlayer <string|其他$sequence名称> <int|起始帧> <int|峰值帧> <int|衰减帧> <int|结束帧> [选项...]
类似addlayer,但仅在指定帧范围播放,并支持多种选项。
强度从起始帧0%渐变至峰值帧100%,从衰减帧开始淡出,到结束帧完全消失。
选项:
spline
使用样条曲线渐变
xfade
仅淡入不淡出
poseparameter <string|参数名称>
使用姿势参数控制渐变。示例:
blendlayer aimmatrix -1 0 0 1 poseparameter move_x
参数值: -2.000 -1.500 -1.000 -00.80 -00.60 -00.40 -00.200 000.00 00.200 00.400 00.600 00.800 1.0000 1.5000 2.0000
层权重: 0.000% 0.000% 0.000% 20.00% 40.00% 60.00% 80.00% 100.0% 80.00% 60.00% 40.00% 20.00% 0.000% 0.000% 0.000%
noblend
保持100%强度,忽略序列过渡。
local
将层标记为本地上下文序列,在主序列关键帧应用前混合。
Warning.png警告:除非叠加序列启用realtime,其帧率会适配主序列时长。
worldspace
作为图层时,以世界空间计算骨骼位置。
Note.png注意:使用weightlist时根骨骼权重不可为0。
待完善: 实际效果?
worldspaceblend
待完善: 待文档化
snap
过渡到该动画时取消所有混合。适用于突然状态变化(如受击动作)。
Note.png注意:快速重复动画(如步枪开火)使用此选项可能导致卡顿,建议改用fadein 0.05
realtime
同步动画时钟与地图时间。适用于呼吸等独立速率图层。
Warning.png警告:所有使用此选项的模型将全局同步!建议仅用于视图模型等唯一实体。
fadein <float|秒数>
设置淡入时长。默认0.2秒。
Note.png注意:fadein 0等效snap,但HLMV不会识别为snap。
fadeout <float|秒数>
设置淡出时长。默认0.2秒。
weightlist <string|权重列表名称>
应用权重列表。若存在默认权重列表将被覆盖。
worldrelative (存在于自 反恐精英:全球攻势 以来)
待完善: 待文档化
localhierarchy <string|骨骼名称> <string|新父骨骼名称> [range <int|起始帧> <int|峰值帧> <int|衰减帧> <int|结束帧>]
临时修改骨骼层级关系。""表示移除父骨骼。
用于优化混合抖动(如武器换手动画)。需配合snap使用。
compress <int|跳帧数>
仅存储指定间隔的动画帧(从0开始)。值≤1无效。
posecycle <string|姿势参数>
使用姿势参数控制动画帧。适用于创建线性混合序列。
示例(参数范围-180~180,动画9帧):
参数值: -180.0 -135.0  -90.0  -45.0    0.0   45.0   90.0  135.0  180.0
动画帧:     0      1      2      3      4      5      6      7      8
Warning.png警告:未用$poseparameter预声明参数将导致范围错误。

高级选项

除基础选项外:

delta
表示引用的$animation已进行subtract处理。该序列将在当前动画上层叠加播放。
Warning.png警告:未正确使用subtract将导致异常!
predelta
配合"presubtract"使用,改变骨骼动画合成基准。
blend <string|名称> <float|最小值> <float|最大值>
blendwidth <int|宽度>
blendref <string|名称>
blendcomp <string|名称>
blendcenter <string|名称>
calcblend <string 名称> <string 附着点> <XR YR ZR>
详见混合序列
ikrule
反向运动学链
iklock
锁定反向运动学链中的指定骨骼。
activitymodifier <string|修饰符> (存在于自 异形丛生 以来) (也存在于 起源2013 多人分支 之中)
待完善: 待文档化

杂项

node (名称)
标记序列在状态图中的节点位置。循环动画常用此标签。同节点序列间无需过渡动画。
transition (来源节点) (目标节点)
声明该序列为过渡动画(如行走转站立)。
rtransition (名称1) (名称2)
可逆过渡动画。曾用于半衰期触手怪,不建议常规使用。[原因?]
exitphase (相位)
声明循环动画的过渡起始相位。
Warning.png警告:实际未实现
$skiptransition (名称1) (名称2) [(名称3)...]
允许指定节点间直接过渡(如行走转奔跑无需经过站立状态)。
keyvalues { [内容] }
为序列添加键值块(用于Faceposer手势设置)。

事件

可在$sequence中定义动画事件

$sequence tentacle_grab "tentacle_grab" {
  fps 15
  { event 1000 1 }
  { event 1004 4 "*scientist/scream02.wav" }
  { event 1003 18 "smash" }
  { event 1004 65 "*scientist/c1a4_sci_tent.wav" }
}