Blend sequence

From Valve Developer Community
< Zh
Revision as of 21:20, 28 December 2024 by MoRanYue (talk | contribs) (chatgpt translation)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
English (en)中文 (zh)Translate (Translate)
一个混合序列改变NPC瞄准的偏航角。另一个混合序列将用于控制俯仰角。
HLMV的“Sequence”标签可以控制混合。此角色正在向后跑,同时稍微向上瞄准。

一个混合序列是一个$sequence,它可以根据一个或两个滑动的“混合比例”值,在$animation之间平滑地移动。这允许动画状态可以通过代码轻松控制。

行走和瞄准方向几乎总是由混合序列决定的。

创建混合序列

混合序列中动画的理想数量取决于动作需要的精确度,以及沿混合比例的变化程度。Valve使用九个动画用于他们的行走混合(见下方示例)。对于生成静止姿势而非动画的混合,可以仅使用每个极端位置的一个动画,但添加一个用于零位置的中央动画可能更易于操作。

准备好动画后,只需将它们以所需顺序列在序列的keyvalue块中。它们将均匀分布在混合比例上。

blend <string name> <float min> <float max>
定义一个混合控制器。如果定义了blendwidth,第一个控制器向上/向下移动混合,第二个(如果存在)向左/向右移动混合。
每个序列最多可以有8个独特的混合控制器。
Note.png注意:这实际上会创建一个$poseparameter,具有指定的名称和范围。
blendwidth <int width>
指定混合包含的动画列数。行数会自动确定。
blendcenter <string sequence>
定义在混合中心使用的序列。(0 0) 此序列可以是混合中的任何序列。
blendref <string sequence>
定义用于对齐混合的序列。此序列可以是混合中的任何序列。
blendcomp <string|name>
待完善: 文档待补充
calcblend <string name> <string attachment> <XR YR ZR>
允许编译器基于预定义附件点的旋转来确定混合范围。生成的角度范围将基于附件点的方向,而不是其父骨骼。

混合示例

以下示例创建了一个适用于CBasePlayerAnimState的九向行走混合。Valve早期的游戏使用八向混合;检查您的游戏现有模型是否具有move_x/move_y(九向)或move_yaw(八向)以确定您需要创建哪种混合。有关八向示例,请参见SDK示例中的HL2模型。

// 在此命令上方定义所有九个walk_* $animations(使用walkframe!)

$sequence walk {
	walk_SW   walk_S   walk_SE
	walk_W    walk_C   walk_E
	walk_NW   walk_N   walk_NE // 换行仅为便于阅读

	blendwidth 3
 	blend move_x -1 1
 	blend move_y -1 1

	addlayer look // 在行走方向之上混合瞄准方向
}

Calcblend示例

以下示例创建了一个九向瞄准混合delta序列,使用calcblend。

// 使用subtract在此命令上方定义所有九个look_* $animations

$sequence look {
	lookDR	lookD   lookDL 
	lookR    "anims\referencepose.smd"   lookL
	lookUR   lookU   lookUL
	
	blendwidth 3
 	calcblend head_yaw "anim_attachment_head" YR  
 	calcblend head_pitch "anim_attachment_head" ZR
	delta
	
}

混合滑块范围的输出值现在应基于定义的附件的相对旋转。

为混合序列制作动画

组成混合序列的单个动画没有特别之处。然而:

  • 每个动画的长度相同,并以相同的帧率播放是很重要的
  • 如果动画用于移动,使用walkframe
  • 在建模软件中,确保任何根骨骼的关键帧都设置为线性插值(即直线),以避免循环时的速度“晃动”
  • 为确保速度与动画完全匹配,请考虑动画的总帧数。例如,一个18帧的跑步循环移动200单位,其速度将为333.33

另见