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

$ikchain

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)中文 (zh)Translate (Translate)
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 tries to comply with the alternate languages guide.
得益于IK系统,猎人的三只脚都能准确接触地面。

$ikchain是一个QC 命令(en),可在所有的 起源 起源 游戏中使用。 Source引擎的逆向运动学(en)系统允许角色的脚准确地连接到不平整的地面表面。

IK通过固定的距离计算中间关节的位置,该距离是从顶部关节和末端关节的位置得出的。一个典型的例子是脚踝-膝盖-髋部的IK链,其中脚踝(末端关节)相对于地面定位,髋部(顶部关节)保持固定,膝盖(中间关节)移动到一个位置,使小腿和大腿骨保持原来的长度。根据使用的具体ikrule,当末端关节移动到需要的位置时,假定顶部关节的位置是固定的,IK系统将中间关节放置在一个位置,使得关节之间的距离(即骨骼长度)保持恒定。

Tip.png提示:关节骨骼连接到其父骨骼的地方。所有骨骼(根骨骼除外)必须只有一个关节,因此"骨骼名称"也用于指定其关节。
Tip.png提示:使用HLMV可以在“渲染”选项卡中的“启用IK”选项中预览IK。
Icon-Bug.png错误:HLMV不会显示带有blendlayer的序列中的IK规则。  [todo tested in?]

语法

$ikchain (name) (end_bone) [(axis) (value)] [height (units)] [pad (units)] [floor (units)] [knee (X) (Y) (Z)] [center (X) (Y) (Z)]
  • name:为此IK链定义"ikchainname"。
  • end_bone:通过指定链中最远的骨骼来定义受此IK链影响的三个骨骼。通过骨骼层次结构自动找到接下来的两个骨骼。IK链只能有三个骨骼。
  • axis可以是X、Y、Z、XR、YR、ZR、LX、LY、LZ、LXR、LYR、LZR、LM或LQ之一,value是一个浮点数
    待完善: 其功能是什么?
  • height
    待完善: ?
  • pad
    待完善: ?
  • floor
    待完善: ?
  • knee:实际上不一定是膝盖,可能是髋部、脚踝、脚趾等。
    待完善: 确认:此向量指定关节的方向
  • center
    待完善: 确认:中心向量
  • QC示例:
$ikchain rhand ValveBiped.Bip01_R_Hand knee  0.707 0.707 0.000
$ikchain lhand ValveBiped.Bip01_L_Hand Z 0
$ikchain rfoot ValveBiped.Bip01_R_Foot height 10 floor 5
$ikchain lfoot ValveBiped.Bip01_L_Foot pad 5 center 0 1 0

$ikchain规则

iklock

iklock (ikchainname) (lock_position) (maintain local rotation)

iklock跟踪序列应用之前特定链的位置/方向,然后在应用之后进行局部IK规则将其移动回原来的位置/方向。这用于在应用骨盆或身体运动到模型时保持指定IK链的位置不变,例如保持手或脚的位置。

  • ikchainname:该规则将应用的$ikchain名称。
  • lock_position:锁定权重是从0.0到1.0的浮点值。
  • maintain local rotation:旋转锁的权重是从0.0到1.0的浮点值。
Note.png注意:旋转的值与位置的值是反向的。要同时锁定它们,将锁定权重设置为"1 0";要同时释放它们,将权重设置为"0 1"(这种情况下不要使用iklock,但你明白了)。

ikrule

ikrule (ikchainname) [type] [options...]
  • ikchainname:该规则将应用的$ikchain名称。
  • type:有效类型请参见“ikrule类型”。
  • options:有效选项请参见“ikrule选项”。

ikrule类型

footstep <slot #>
添加一个IK规则,其中一个后续身体部位(例如脚)需要相对于地面移动。
touch <bone name>
添加一个IK规则,其中某个骨骼需要相对于身体的另一部分移动。这在手需要接触模型的某些部分(例如脸、髋部、另一只手等)时很有用,而该身体部位可能由于额外的动画层、骨骼控制器或其他IK规则而不在原始动画位置。
Tip.png提示:指定一个空的骨骼名称""以使链条相对于模型的原点移动,而不是一个动画骨骼。
release
释放低于增量的动画的IK规则。这对重新加载使用自身IK规则的动画很有用。
unlatch
待完善: 未完成
attachment <attachment name>
将IK目标设置为指定的外部附件。客户端代码会在链的位置附近搜索带有此附件的实体并粘附于其上。
Note.png注意:代码在64单位内寻找实体,然后要求附件在radius选项中给定的单位范围内。
Tip.png提示:半衰期2 用于将NPC的手移动到func_tank炮台模型上的把手。

ikrule选项

range <start> <peak> <tail> <end>
设置ikrule的淡入、保持和淡出帧编号。在任何参数中可以使用一个"."以保留默认值。
height <units>
用于脚步规则,指定从所需地面高度开始搜索的高度。默认值为ikchain的高度。
floor <units>
用于脚步规则,指定地面的实际高度。默认值为ikchain的地面高度。
radius <units>
用于脚步规则,指定地面接触检查的大小。默认值为ikchain的半径。
pad <units>
等同于radius,但单位除以2。radius = pad / 2;
contact <frame>
用于脚步规则,指定用于检查地面位置的帧。
usesource
使用原始动画源确定IK目标。如果当前序列是与源动画不同的复合动画,并希望恢复其原始形式,则很有用。
usesequence
运行所有序列规则,包括blendlayer和addlayer规则以确定IK目标。
fakeorigin <x> <y> <z>
为IK规则设置与任何先前指定骨骼分离的虚拟原点。
fakerotation <pitch> <yaw> <roll>
为IK规则设置与任何先前指定骨骼分离的虚拟旋转。

示例

$sequence foo {
  ikrule lfoot footstep 0 range  4 10 19 25
  ikrule rfoot footstep 1 range 18 26 3 10
  iklock rfoot 1 0 iklock lfoot 1 0
}

在你的mod中启用IK

除非你的mod使用HL2_CLIENT_DLLHL2_DLL编译,否则IK代码将被排除在外:

  • CPlayerMove::StartCommand(服务器端)
  • CInput::CreateMove(客户端)

你可以移除周围的#ifdef语句来启用它(或者作为HL2编译,但可能会有不可预见的后果)。

多人游戏中的IK

Ken Birdwell(IK系统的作者)曾说:

它目前仅对HL2启用,而且仅用于NPC。我们没有在多人游戏中实现。

目前的编写方式是服务器不处理IK,仅客户端处理。当IK失败时客户端需要通知服务器,这样服务器才能准确检测子弹的碰撞以使模型掉落到AABB以下的地步让脚触地。具体见CBaseAnimating::SetIKGroundContactInfo()和相关代码。

对于玩家,你可能可以在服务器上完全处理,但需要为每帧的额外动画开销做好准备。
— Ken Birdwell Valve, hlcoders邮件列表