$sequence
< Zh
Jump to navigation
Jump to search
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 tries to comply with the alternate languages guide.
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 tries to comply with the alternate languages guide.
$sequence
是一个QC 命令 ,可在所有的 起源 游戏中使用。 它定义了一个骨骼动画 。可以单独使用,也可以与一个或多个$animation
结合使用,以利用Source引擎更高级的骨骼动画功能。
注意:所有包含任何多边形的模型都必须至少有一个
$sequence
。如果您实际上不需要任何动作,最简单的方法是重用参考的SMD文件。仅使用$includemodel 的模型不需要任何$sequences
。- 待完善: 如果在$includemodel 中不存在任何$sequences,会发生什么?
用法
$sequence
有两种模式。一种直接访问单个骨骼动画 (SMD或DMX),另一种需要中间的$animation
。
注意:DMX骨骼动画仅在模型编译所针对的游戏包含Dmxconvert 工具时可用。
注意:
$sequence
只能引用QC文件中出现在其上方的$animation
。$sequence <name> <skeletal animation SMD /DMX > <简单选项> { // 起始大括号必须与指令位于同一行 // 如果内容为空,大括号可以省略 <高级选项> <事件 > <简单选项> }
$sequence <name> <简单选项> { // 起始大括号必须与指令位于同一行 <$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|name>
- 动画的名称。将在 HLMV、Hammer 等工具中显示。
<string|骨骼动画文件>
- $sequence 源文件的路径。包含此选项表示你使用的是命令的简单版本。
frame <int|起始帧> <int|结束帧>
frames <int|起始帧> <int|结束帧>
- 指定从源动画中提取的一段帧数。对于只需播放特定动画的一部分帧来说很有用。
- 例如,如果源动画包含 80 帧(范围为 0-79),但此动画仅需播放最后 30 帧,那么
frames 50 79
将只加载这些帧。
- 例如,如果源动画包含 80 帧(范围为 0-79),但此动画仅需播放最后 30 帧,那么
- 也可以用来提取单一的动画帧,只需将起始和结束帧相同即可。
frames
和frame
可以互换使用。- 警告:所有在序列中使用的帧数(例如 动画事件)都是相对于
起始帧
的。 - 修复:你可以将此选项从 $sequence 中分离,将每个动画拆分为单独的 $animation,然后在每个动画中使用
frame/frames
参数来指定它们的帧范围。
numframes <int|frames>
- 强制动画拥有指定数量的帧,可能通过裁剪动画或重复最后一帧来填充所需的帧数。
- 如果与
frame/frames
一起使用,它将尊重起始帧。当指定的帧数太少时,会裁剪动画。但当指定的帧数太多时,会重复最后一帧以达到帧数限制。- 例如,
frames 10 12 numframes 12
将提取帧 10 到 12,但第 12 帧会重复,达到指定的 12 总帧数,就像动画的真实结束。
- 例如,
注意:在源引擎中,动画的起始帧为 0,而
numframes
从 1 开始,因为它指定的是“帧数”。若要使动画在第 30 帧结束,你需要将 numframes
设置为 31,因为这将捕捉 31 总帧(范围为 0-30)。rotate <float|angle>
- 类似于
angles
,但只沿 Z 轴旋转。
scale <float|scale>
- 乘以该序列中骨骼的大小,接受负值。
loop
- 标记序列为循环播放动画,动画将持续播放,并导致 StudioMDL 在首尾帧上进行一些清理。
- 在当前播放时,如果请求重新播放,该序列将无法中断自身。
hidden
- 禁止在用户界面中列出该 $sequence。对于仅作为其他动画层的序列很有用。
noanimation
- 强制序列拥有零权重动画。有效忽略
frame/frames
,但会尊重numframes
。 - 等同于使用 $weightlist 删除所有骨骼的权重。用于创建仅由叠加或混合层组成的特殊复合序列。
fps <float|帧每秒>
- 覆盖动画的帧率。如果未指定,默认值为
30
。 - 注意:这些是 动画帧 - 不是屏幕帧!
<string|motion extract axis>
- 如果模型实际需要向前移动,但在游戏中却必须“原地行走”,则创建运动动画会变得更容易。此命令解决了这个问题,通过从动画中移除根骨骼的平移。
- 你可以在同一行前添加
walkframe <int|motion extraction endframe>
来限制特定部分动画的运动提取。 - 注意:提取总是从动画的开始或最后指定的
walkframe
开始,到指定帧结束。若要创建延迟,请使用walkframe
,但不指定轴。 - 提示:你可以添加多个
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 代表“旋转”。
- 警告:这些轴似乎完全忽略了
walkframe
。
- LX、LY、LZ、LXR、LYR、LZR - 根骨骼沿轴移动,直到动画完成一半,然后返回原位。 提示:你可以提取任意组合的轴运动,只需在其中间加空格。
- LM - 指定运动提取应被视为线性。
- LQ - 指定运动提取应被视为二次。
该命令也可用于 $animation。
activity <string|name> <float|weight>
- 将序列链接到一个 activity。
- 提示:如果活动名称以 "ACT_" 开头,则可以省略活动关键字。当看到 ACT_ 时,默认即为活动。
- 如果多个
$sequence
使用相同的 activity,则weight
指定在调用该活动时选择此序列的可能性。任何特定的$sequence
播放的几率等于其权重除以所有权重的总和。- 例如,如果一个名为
swing_a
的$sequence
拥有权重 2,而另一个名为swing_b
的$sequence
拥有权重 1,那么swing_a
被选择的几率为 2/3,而不是swing_b
。 - 注意:如果活动中只有一个序列,则其权重无关紧要。
- 例如,如果一个名为
autoplay
- 使序列在任何情况下都可以持续播放,即使模型在执行其他动画时。适用于混合呼吸动画和其他自动化运动。如果模型拥有多个
autoplay
的 $sequences,它们会按在 QC 文件中出现的顺序叠加。- 警告:不要用于可能正常播放的动画,否则会导致重复播放并导致动作叠加。
addlayer <string|other $sequence name>
- 在当前序列的基础上播放另一个序列。动画会同时开始和结束,因此如果它们的总运行时间(帧率 * 帧数)不一致,将会按比例影响添加层的帧率(如果适用)。另一个 $sequence 不必位于当前序列之上。
- 通常用于添加经过
delta
处理的层,例如 瞄准矩阵,或是仅影响特定骨骼的特殊 加权 层。 - 如果另一个
$sequence
在运行时会被 导入,可以 提前声明。
blendlayer <string|other $sequence name> <int|startframe> <int|peakframe> <int|tailframe> <int|endframe> [options...]
- 类似于
addlayer
,但新序列仅在指定的帧范围内播放,并接受多个选项。 - 动画在
startframe
处以 0% 强度开始,在peakframe
达到 100% 强度,在tailframe
开始减弱,并在endframe
完全消失。
- 选项:
spline
- 淡入淡出时使用样条曲线,而不是线性渐变。
xfade
- 层只会淡入,不会淡出。
示例:blendlayer aimmatrix -1 0 0 1 poseparameter move_x
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 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%
: 当使用 spline
选项时,这些值会发生变化,但开始和结束时间保持一致。
noblend
- 禁止层淡入淡出,层在激活时始终保持 100% 强度。此选项还会使层忽略序列过渡。
- 注意:如果需要固定强度但不希望忽略序列过渡,则可以将峰值帧和尾帧分别设置为起始帧和结束帧。这会使命令等同于
addlayer
,但限制在特定的帧范围内。
local
- 将层标记为局部上下文序列。在主序列的关键帧应用到骨骼之前,与主序列混合此层。主要用于序列过渡,避免层与主序列分开淡化。
- 警告:除非混合序列具有
realtime
选项,否则混合序列的帧率会相对于父序列调整,以确保从startframe
开始并在endframe
结束。例如,如果父序列和混合序列均以每秒 30 帧播放且持续 30 帧,但混合序列仅在第 5 帧至第 20 帧播放(总共 15 帧,仅为原长度的一半),则混合序列将以每秒 60 帧(两倍原始帧率!)播放,以便从第 5 帧开始并在第 20 帧结束。
- 当使用
spline
选项时,这些值会发生变化,但开始和结束时间保持一致。
worldspace
- 将骨骼位置计算为世界坐标,而不是相对于父动画的位置(当作为层使用时)。
- 注意:当使用
weightlist
时,根骨骼的权重必须不为 0。 - 待完善: 尚不确定它是否实际有作用。
worldspaceblend
- 待完善: 文档尚未完成。
snap
- 在过渡到此动画时移除所有过渡混合。适用于由模型状态的突然剧烈变化引发的反应动画,例如生物的抽搐或武器开火。
- 注意:在快速重复的动画(例如步枪的开火动画)中,这可能显得生硬且有问题,因为它会直接跳回第一帧,没有任何渐变效果。因此,使用
fadein 0.05
可能是更好的选择。
realtime
- 通常,当播放一个序列时,它会从第 0 帧开始,可以受到通过
blendlayer
添加的任何父序列的帧率调整的影响。此选项会改变这种行为,使动画与地图时钟同步。适用于不应以与父 $sequence 相同速率播放的层,例如呼吸动画。 - 警告:所有播放此动画的模型 都会同步到地图时钟! 应谨慎使用此选项,理想情况下仅用于在游戏中只出现一次的模型,例如视角模型。
fadein <float|seconds>
- 覆盖此动画淡入所需的时间。默认值为 0.2 秒。
- 注意:使用
fadein 0
可达到与snap
相同的效果,但 HLMV 在启用自动混合时不会将其识别为快切,因此snap
是必要的。
fadeout <float|seconds>
- 覆盖此动画淡出所需的时间。默认值为 0.2 秒。
localhierarchy <string|bone name> <string|new parent name> [range <int|startframe> <int|peakframe> <int|tailframe> <int|endframe>]
- 更改此动画中特定骨骼的父级。使用空字符串 "" 可以移除骨骼的父级。
- 此功能主要用于确保骨骼在混合时能够正确对齐。例如,如果武器通常由右手持有,但在此动画中由左手持有,混合时会以右手为参考导致抖动。此选项可以将其改为以左手为参考,从而消除抖动。
range
是可选的,需指定四个帧号,用于定义在指定帧范围内如何逐渐应用新的层级。- 注意:此更改不会影响动画的过渡部分,因此可能需要使用
snap
。
compress <int|frameskip>
- 从输入动画的第 0 帧开始,仅保存每隔
frameskip
帧的数据。frameskip
的值为 1 或更小则不会产生任何效果。
posecycle <string|pose parameter>
- 使指定的 姿势参数 控制动画帧,而不是在 混合序列 中播放的具体动画。
- 可用于更轻松地创建详细的(但完全线性的)混合序列。尽管在 SDK 中不常用,但这种方法设置更快,并且没有混合 动画 数量的限制。
- 姿势参数的最小值和最大值决定了动画的起点和终点。以下是一个范围为 -180 到 180 的参数,用于一个总帧数为 9(范围 0-8)的动画的示例:
参数值: -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
:
警告:如果未使用
$poseparameter
预声明姿势参数,StudioMDL 仍会生成一个姿势参数,就像 blend
一样,但生成的范围将无效。高级
除了所有简单选项外,还包括以下高级选项:
delta
- 告诉 Source 引擎,引用于此序列的
$animation
已经经过subtract
操作。此 $sequence 将叠加在当前正在播放的序列之上,而不是覆盖它们。 - 警告:如果使用此选项时,
$animation
未经过subtract
操作,则会导致严重的问题!
predelta
- 类似于“presubtract”命令,但作用相反。该选项指示动画合成系统在添加当前骨骼设置时,以一个不同的参考帧为基础,而不是基于典型的交叉淡入权重方案覆盖每个骨骼的动画。
blend <string|name> <float|min value> <float|max value>
blendwidth <int|width>
blendref <string|name>
blendcomp <string|name>
blendcenter <string|name>
calcblend <string name> <string attachment> <XR YR ZR>
- 请参阅 Blend sequence。
ikrule
- 请参阅 $ikchain。
activitymodifier
<string|modifier> (存在于自 以来) (也存在于 之中)- 待完善: 文档未完成
杂项
node (name)
- 标记该序列属于序列转换图表中的某个点。这适用于不改变图状态的动画,例如循环动画。可以有多个序列在图表中同一个节点下,这样它们就不需要过渡动画来彼此切换。
- 也可以将它们放在不同的点,并明确跳过过渡(见 $skiptransition)。没有声明的序列默认位于根节点,而转换图表假设任何序列都可以从根节点或到根节点直接进行无中间过渡的移动。
transition (from) (to)
- 指定动画从节点图的一个点进入,并在另一个点退出。用于播放过渡序列,例如 walk_to_stand、run_to_crouch 等。
rtransition (name1) (name2)
- 类似于 transition,但标记该序列可以倒序运行。这通常用于 Tentacle 在 Half-Life. 中的情况,除非特殊情况,不建议使用此选项。[为什么?]
exitphase (phase)
- 在循环动画之间,例如 "stand_to_run",此命令告诉移动系统从哪里开始下一个序列,假设它是循环的。假定你已经让共享下一节点的所有序列都匹配了阶段(见 startloop)。
- 警告:无效,游戏未实现此功能
$skiptransition (name1) (name2) [(name3) ...]
- 添加规则到转换图表,允许在命名节点之间直接移动。这对于避免强制 "walk" 到 "run" 变成 "walk" 到 "stand" 再到 "run" 的转换非常有用。
keyvalues { [stuff] }
- 添加一个特定序列的 keyvalue 块(见 $keyvalues)。用于 设置 Faceposer 手势。
事件
$sequence 可以在动画的不同时间点触发特定的 Animation Events,如下所示:
$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" }
}