这节课我们学习UDK使用骨架控制器,这是很有意思的一节课,对制作3D模型非常有帮助。以后这样的课程也会很多的,希望多多关注!
- 使用骨架控制器
- 概况
- 示例
- SkelControl Types(骨架控制器类型)
- 通用属性
- SkelControlSingleBone(骨架控制单骨骼)
- SkelControlLookAt(骨架控制查看)
- SkelControlSpline(骨架控制样条曲线)
- SkelControlLimb(骨架控制肢体)
- SkelControlFootPlacement(骨架控制脚的放置)
- SkelControlWheel(骨架控制车轮)
- 链接与共享
概况
通过骨架控制器,可以在骨架网格里,编程实现一根骨骼或一组骨骼的修改。这些控制器都包含在同一个动画混合工具AnimTreeEditor中。但AnimNodes (动画节点)与SkelControls(骨架控制器)并不能互相连接,它们属于各自独立的系统,只是出于便捷性考虑,放置在了同一个工作空间。当然,也可以这样理解,动画流入动画树(AnimTree)中的根节点盒子,然后再通过骨架控制器以某种方式修改每一根骨骼。
示例
假设要添加一个控制器,使得人物的头部注视着某个特定目标:
- 右键点击蓝色的动画树,选择“Add SkelControl Chain”(添加骨架控制器链接)。
- 在弹出的组合框中可以选择要控制的骨骼。需要注意的是,每个骨骼只能有一个控制器。
- 选择头骨之后,在动画树节点(AnimTree)中会出现一个标记为“Head”(头)的绿色连接器。
- 在背景上右键点击,创建一个新的SkelControlLookAt(骨架控制查看)。
- 将SkelControlLookAt(骨架控制查看)与Head(头部)连接器相连。
- 选择SkelControlLookAt(骨架控制查看),可以看到一个蓝色的角上带有小箭头的菱形图案。这个菱形图案就是注视的目标,可以通过箭头移动它。
- 还可以修改SkelControlLookAt(骨架控制查看)的一些设置。例如,LookAtAxis可以让头朝向合适的方向。
下面是一个来自动画树的示例:
SkelControl上的滑块代表力量。当值拖到0时,头部将完全随着动画而动。当值拖满时,头部将会一动不动地注视目标。橙色按钮表示SkelControl的BlendInTime(混入时间)和BlendOutTime(混出时间),它可以切换控件的激活状态。
SkelControl Types(骨架控制器类型)
下面将简单地介绍几种骨架控制器。
通用属性
以下是所有骨架控制器的通用参数:
| ControlName(控制器名称) | 这是为了在编码和修改时,便捷地找到某个控制器而给它起的名称。如果控制器没有命名,那么在游戏中就不能修改它。 |
| BlendInTime(混入时间) | 当控制器激活时,它决定着控制器混合直到力量达到最大值的时间。 |
| BlendOutTime(混出时间) | 与BlendInTime(混入时间)相仿,它决定着控制器混合直到力量为0的时间。 |
| bPropogateSetActive(是否激活传播性) | 如果值为True(真),则当SkelControl(骨架控制)激活时,链中的后一项也被激活。有关控制器链接的更多介绍,请参见本文档稍后的“链接与共享”部分。 |
| BoneScale(骨骼缩放) | 可以控制骨骼的缩放。需要注意的是,该缩放将会应用在该骨骼及其以下所有骨骼中。 |
骨架控制器中提供了众多的坐标系(或参考系)选项。下面是这些选项含义的简要说明:
| 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 | 控制曲线上骨骼的旋转方式。详细信息请参见下文。 |
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(假)时,控制器将不修改骨骼末端的旋转。 |
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 | 反转车轮转向方向 |
链接与共享
骨架控制器可以链接在一起,并可以按照它们链接的顺序付诸应用。如果在SkelControlLookAt之后加上一个带有旋转的SkelControlSingleBone,则骨骼就会首先注视目标,然后旋转这么多角度。
骨架控制器可以被多个骨骼共享。如果需要多个骨骼指向同一目标,则可以只使用一个SkelControlLookAt(骨架控制查看)控制器,而使其它的骨骼与它相连即可。
以上就是这节课的全部内容,下节课我们继续学习。
评论