UDK使用骨架控制器教程

修改
鏉ユ簮: 上帝宝贝 浏览 7681 日期 2011-08-27 0

这节课我们学习UDK使用骨架控制器,这是很有意思的一节课,对制作3D模型非常有帮助。以后这样的课程也会很多的,希望多多关注!

  • 使用骨架控制器
    • 概况
    • 示例
    • SkelControl Types(骨架控制器类型)
      • 通用属性
      • SkelControlSingleBone(骨架控制单骨骼)
      • SkelControlLookAt(骨架控制查看)
      • SkelControlSpline(骨架控制样条曲线)
      • SkelControlLimb(骨架控制肢体)
      • SkelControlFootPlacement(骨架控制脚的放置)
      • SkelControlWheel(骨架控制车轮)
    • 链接与共享

概况

通过骨架控制器,可以在骨架网格里,编程实现一根骨骼或一组骨骼的修改。这些控制器都包含在同一个动画混合工具AnimTreeEditor中。但AnimNodes (动画节点)与SkelControls(骨架控制器)并不能互相连接,它们属于各自独立的系统,只是出于便捷性考虑,放置在了同一个工作空间。当然,也可以这样理解,动画流入动画树(AnimTree)中的根节点盒子,然后再通过骨架控制器以某种方式修改每一根骨骼。

示例

假设要添加一个控制器,使得人物的头部注视着某个特定目标:

  1. 右键点击蓝色的动画树,选择“Add SkelControl Chain”(添加骨架控制器链接)。
  2. 在弹出的组合框中可以选择要控制的骨骼。需要注意的是,每个骨骼只能有一个控制器。
  3. 选择头骨之后,在动画树节点(AnimTree)中会出现一个标记为“Head”(头)的绿色连接器。
  4. 在背景上右键点击,创建一个新的SkelControlLookAt(骨架控制查看)。
  5. 将SkelControlLookAt(骨架控制查看)与Head(头部)连接器相连。
  6. 选择SkelControlLookAt(骨架控制查看),可以看到一个蓝色的角上带有小箭头的菱形图案。这个菱形图案就是注视的目标,可以通过箭头移动它。
  7. 还可以修改SkelControlLookAt(骨架控制查看)的一些设置。例如,LookAtAxis可以让头朝向合适的方向。

下面是一个来自动画树的示例:

SkelControl上的滑块代表力量。当值拖到0时,头部将完全随着动画而动。当值拖满时,头部将会一动不动地注视目标。橙色按钮表示SkelControl的BlendInTime(混入时间)和BlendOutTime(混出时间),它可以切换控件的激活状态。

SkelControl Types(骨架控制器类型)

下面将简单地介绍几种骨架控制器。

通用属性

以下是所有骨架控制器的通用参数:

ControlName(控制器名称) 这是为了在编码和修改时,便捷地找到某个控制器而给它起的名称。如果控制器没有命名,那么在游戏中就不能修改它。
BlendInTime(混入时间) 当控制器激活时,它决定着控制器混合直到力量达到最大值的时间。
BlendOutTime(混出时间) 与BlendInTime(混入时间)相仿,它决定着控制器混合直到力量为0的时间。
bPropogateSetActive(是否激活传播性) 如果值为True(真),则当SkelControl(骨架控制)激活时,链中的后一项也被激活。有关控制器链接的更多介绍,请参见本文档稍后的“链接与共享”部分。
BoneScale(骨骼缩放) 可以控制骨骼的缩放。需要注意的是,该缩放将会应用在该骨骼及其以下所有骨骼中。

[next]

骨架控制器中提供了众多的坐标系(或参考系)选项。下面是这些选项含义的简要说明:

BCS_WorldSpace(BCS_三维空间) 指定在世界坐标系中的一个位置。
BCS_ActorSpace(BCS_Actor空间) 指定相对于Actor原点的位置。
BCS_ComponentSpace(BCS_组成元素空间) 置顶相对于SkeletalMeshComponent(带有骨架的网格物体组成)为原点的位置。
BCS_ParentBoneSpace(BCS_父骨骼空间) 指定以所控制的骨骼的父骨骼为参考系。
BCS_BoneSpace(BCS_骨骼空间) 指定相对于我们所控制的骨骼
BCS_OtherBoneSpace(BCS_其它骨骼空间)

指定相对于多级结构中的其他骨骼(必须通过控制器中的BoneName(骨骼名称)选项指定具体的骨骼)。

SkelControlSingleBone(骨架控制单骨骼)

通过这个简单的控制器,可以修改一根骨骼的旋转与位移。就像旋转天线一样方便。以下是它的一些关键属性。

bApplyTranslation 表示是否需要位移。如果取值为false(假),那么所有的位移设置都被忽略。
bAddTranslation 如果取值为true(真),那么指定的位移将添加到动画效果中。如果取值为false(假),那么指定的位移将替代已有的动画位移。
BoneTranslation 应用到骨骼位移。
BoneTranslationSpace 应用位移的坐标空间(请参见前文BoneControlSpace)
TranslationSpaceBoneName 当BoneTranslationSpace(骨骼位移空间)项的值为BCS_OtherBoneSpace时,TranslationSpaceBoneName项的值就是要设定的骨骼名称。
bApplyRotation 同bApplyTranslation一样,只有当bApplyRotation取值为true(真)时,旋转变化才会生效。
bAddRotation 如果取值为true(真),旋转将添加到动画效果中。如果取值为false(假),它将替换已有的旋转。
BoneRotation 实际应用到骨骼上的旋转。
BoneRotationSpace 应用于骨骼旋转的参考系。
RotationSpaceBoneName 当BoneRotationSpace项的值为BCS_OtherBoneSpace时,RotationSpaceBoneName(旋转空间骨骼名称)的值就是要设定的骨骼名称。

SkelControlLookAt(骨架控制查看)

[next]

通过这个控制器,可以调整一根骨骼的的旋转,使得它总指向某个特定目标。例如,可以使人物的头部总是注视着一个特定的目标。在下面的抓图中,头部正注视着蓝色的菱形图案。绿色的锥形表示头部可以移动的最大范围。

TargetLocation 坐标系中骨骼所指向的位置。
TargetLocationSpace 定义TargetLocation的坐标系。
TargetSpaceBoneName 当TargetLocationSpace 的值为BCS_OtherBoneSpace时,TargetSpaceBoneName项的值就是要设定的骨骼名称。
LookAtAxis 受控制的骨骼要指向目标的坐标轴。
bInvertLookAtAxis 告知LookAtAxis应该指向远离目标的方向,而不是指向它。
bDefineUpAxis 当它的值为false(假)时,控制器将计算出指向目标的LookAtAxis所需的最小旋转。围绕LookAtAxis的转动仍然依从于动画。当它的值为true(真)时,将会定义骨骼的竖直轴,这样骨骼运动的方向将完全由控制器来定义。
UpAxis 当bDefineUpAxis的值为true(真)时,这就是骨骼在世界坐标系中指向上方的轴。
bInvertUpAxis UpAxis是否应该指向下方而不是上方。
bEnableLimit 是否要限制骨骼可以旋转以跟踪目标的最大角度后。
bShowLimit 是否在3D视图中画出绿色的限制圆锥体。
MaxAngle MaxAngle决定了骨骼旋转时允许偏离参考位置的最大角度。计算的单位是度。
DeadZoneAngle 当目标位于当前旋转的“不灵敏区”时,骨骼将不动,直至目标离开该区域,它才旋转。

可以尝试将TargetLocationSpace项设置为BCS_OtherBoneSpace,制作出人物注视自己手的效果。

SkelControlSpline(骨架控制样条曲线)

样条曲线控制器并不会修改骨骼本身,而是将一个骨骼放到一条骨骼链中,并将它们调整为一条spline(样条曲线)。在下面的示例中,将使用SkelControlSingleBone(骨架控制单骨骼),使得香肠的末端向上翘起。然后,用SkelControlSpline(骨架控制样条曲线)来修改其上的四块骨骼。这样就在香肠的两端创建了一条spline(样条曲线)。需要注意的是,该控制器并没有保持骨骼的长度。

SplineLength 在骨骼树中向上遍历要匹配样条曲线的骨骼数量。
SplineBoneAxis 沿spline(样条曲线)方向的骨骼轴。
bInvertSplineBoneAxis 决定SplineBoneAxis是否需要反转。
EndSplineTension 控制曲线终点(接近控制的骨骼)的曲率。
StartSplineTension 控制曲线起点(接近控制的骨骼)的曲率。
BoneRotMode 控制曲线上骨骼的旋转方式。详细信息请参见下文。

[next]

BoneRotMode参数决定了控制器控制曲线上骨骼的旋转方式:

SCR_NoChange 不修改骨骼的旋转,骨骼只是发生位移来匹配曲线。
SCR_AlongSpline 旋转骨骼以使得SplineBoneAxis指向Spline的方向。
SCR_Interpolate 骨骼的旋转由其相邻的两个骨骼的旋转混合计算得出。

在控制背部最上方的骨骼旋转,以使得脊柱上的其他骨骼平滑旋转时,该控制器的SCR_Interpolate相当有用。

SkelControlLimb(骨架控制肢体)

该控制器应用了虚幻引擎3的反向运动学求解器。它首先在三维坐标系中选取一个目标位置,然后试着让所控制的骨骼上面的两个骨骼到达目标位置。如果目标达不到,则把骨骼移动到在尽可能近的位置。除了为肢体的末端指定目标位置,还可以为关节指定目标,使其向目标弯曲。下面3D视图中粉色的菱形图案就是指定的目标。

需要注意的是,如果在手臂的多级结构中有纯旋转骨骼(即小臂在多级结构上是位于大臂纯旋转骨骼的子节点),肢体控制器将起不到应有的效果。如下图所示,创建的骨架中,手臂应创建为两个骨骼而不是四个。

左边的这些骨骼是3D包中最常见的,然而对于实时的骨架控制器来说,效率太低了。在这个手臂链中,如果要让它计算反向运动,你会得到一条4根骨骼的反响运动链,而实际上像右边所展示的两个骨骼就够了。那些纯旋转骨骼,在这两种情况下,仍然都是手臂的子节点。所不同的是,在左边从上臂到手依次经历了四个骨骼,而在右边只经历了两个骨骼。

EffectorLocation 希望的受控制的骨骼位置。
EffectorLocationSpace 定义EffectorLocation所用的坐标系。
EffectorSpaceBoneName 当EffectorLocationSpace的值为BCS_OtherBoneSpace时,EffectorSpaceBoneName的值就是要设定的骨骼名称。
JointTargetLocation 坐标系中关节将要弯曲移往的位置。
JointTargetLocationSpace 定义JointTargetLocation所用的坐标系。
JointTargetSpaceBoneName 当JointTargetLocationSpace(的值为BCS_OtherBoneSpace时,JointTargetSpaceBoneName的值就是要设定的骨骼名称。
BoneAxis 肢体中各骨骼指向骨骼方向的轴。
JointAxis 应该与关节的旋转轴对齐的骨骼轴。对肘部来说,这应该是肘关节弯曲时的旋转轴。
bInvertBoneAxis 决定BoneAxis矢量的方向是否反转。
bInvertJointAxis 决定JointAxis矢量的方向是否反转。
bMaintainEffectorRelRot 当该项取值为true(真)时,在效应器骨骼与它的父骨骼末端之间修改相对旋转。当该项取值为false(假)时,控制器将不修改骨骼末端的旋转。

[next]

SkelControlFootPlacement(骨架控制脚的放置)

这是一种特殊的SkelControlLimb(骨架控制肢体),它专门用来设计如何在地面上正确放置人物的双脚。你应该将该控制器与人物脚上的骨骼相关联。每一帧,从臀部骨骼到脚部骨骼都会进行直线碰撞检测。如果没有发生碰撞,那么腿就不发生改变。反之,控制器的EffectorLocation参数将设为碰撞点的位置。这样腿将发生弯曲,并将脚放到地面上。EffectorLocation是自动生成的,因此不能在控制器中进行修改。不过,可以通过修改JointTargetLocation让腿朝着适当的方向弯曲。

FootOffset 偏移应用于生成的EffectorLocation(效应器位置),它能使EffectorLocation(效应器位置)沿碰撞检测用的直线向后退。这样就可以调整地面上脚的高度,因为脚的骨骼一般并不在脚底。
FootUpAxis 当bOrientFootToGround的取值为true(真)时,它表示脚骨骼与脚接触的平面的法线方向相一致的轴。
FootRotOffset 当bOrientFootToGround(由脚向地)的取值为true(真)时,额外应用于脚的旋转。当脚的骨骼没有指向上方的轴时,可能会需要这个属性。
bInvertFootUpAxis 是否要反转FootUpAxis的方向。
bOrientFootToGround 是否要需要旋转脚骨骼,使它与直线碰撞检测捕获到的撞击表面法线方向一致。
MaxUpAdjustment 控制器所能将脚向上移动的最大量。
MaxDownAdjustment 控制器所能将脚向下移动的最大量。

在AnimTreeEditor中,可以在测试脚的位置时使用地板网格的预览。如果要观看地板网格,可以按下工具栏上的“Show Floor”(显示地板)按钮。按住Control键及下列控制按钮,可以移动和旋转地板:

鼠标左键 将地板沿X轴和Y轴变换
鼠标右键 围绕Z轴旋转地板
同时按下鼠标左右键 将地板沿Z轴变换

SkelControlWheel(骨架控制车轮)

这个特别的控制器专门用来处理UE3的车辆系统。车辆可以用骨架网格中的骨骼来做轮子。在轮子可以移动和转向之前,需要为每个轮子创建一个SkelControlWheel(骨架控制车轮)。为每个控制器命名,将其作为车辆设置过程中的控制器的标识。车辆系统将在每一帧更新控制器,使它能符合模拟过程中的各种动作,例如垂直移动、滚动或转向。

WheelDisplacement 仅作为预览车轮的垂直运动使用。设置这个值会使车轮升高。
WheelMaxRenderDisplacement 这是车轮垂直移动的最大距离。它能够确保车轮不会插入底盘几何体。
WheelRoll 同WheelDisplacement一样,这仅仅是预览车轮的滚动。正值表示车轮向前滚动。
WheelRollAxis 车轮骨骼的轴,车轮将围绕它滚动。车轮骨骼的轴,车轮将围绕它滚动。
WheelSteering 用来预览车轮的转向运动。正值表示右转。
WheelSteeringAxis 车轮骨骼的轴,车轮将围绕它作转向旋转。
bInvertWheelRoll 反转车轮滚动方向
bInvertWheelSteering 反转车轮转向方向

[next]

链接与共享

骨架控制器可以链接在一起,并可以按照它们链接的顺序付诸应用。如果在SkelControlLookAt之后加上一个带有旋转的SkelControlSingleBone,则骨骼就会首先注视目标,然后旋转这么多角度。

骨架控制器可以被多个骨骼共享。如果需要多个骨骼指向同一目标,则可以只使用一个SkelControlLookAt(骨架控制查看)控制器,而使其它的骨骼与它相连即可。

以上就是这节课的全部内容,下节课我们继续学习。

评论

{{ username ? username.charAt(0).toUpperCase() : '?' }}
Ctrl+Enter 发布
{{ (c.username || c.author_name || '?').charAt(0).toUpperCase() }}
{{ c.username || c.author_name }} {{ Utils.formatDate(c.created_at) }}