[Havok学习笔记(7)] 样例US_Soldier_Project.hkp学习

来源:互联网 发布:skype6.6mac官方下载 编辑:程序博客网 时间:2024/05/22 20:27

       

      这一demo包含了两个行为,我们主要分析其中一个行为。


     


     一般状态下的几个控制变量,AimX,Y控制头部的扭动,LeftStickX.Y是左手柄,控制人物走动方向,RightStickX,Y是右手柄,控制视角方向。


      这一行为的状态机如下:

       

       

        其中LocomotionLayers是各种动作的组合,Ragdoll是跪下的动作,是一个修改器。


        我们先来观察Ragdoll的属性。




        它的播放模式为用户控制,长度占据了整个播放时长,用户控制点在0处,它对应的动画是一个人普通的站立姿态。

  • 该属性可以指定一个点,到该点后时间不会前进。 该属性适用于从一段动画中获取一个特定姿态(之后进行混合)。 另外还可用变量驱动该属性;然后,该变量即可控制动画的播放。 点的取值范围为 0 到 1。 首先,使用“裁切起点”和“裁切终点”对动画进行裁切。 [0, 1] 范围将被映射到这一间隔内。
        根据如上定义,用户在0处时,时间就不再前进了,在这里相当于截取了一开始的姿态。

       从Locomotion到Ragdoll的转换编辑器:
       包含了一个Die事件,转变效果是默认的,间隔为0.500.

        

   
       现在我们观察LocomotionLayer:

        

       它主要包含了两个动作,一个是左边的蹲下动作,可恢复站起;另一个是行走动作,可以从静止到行走,也可以从行走到静止,中间有一个idle to move的转换状态。
        对于Kneel而言,它包含了一个自转换的节点,它是一个脚本。

       

      将函数onKneelAimGenerate()绑定在generate回调上:
        

        

function onKneelAimGenerate()--local rightHandIkTarget = hkVector4.new()--新建一个y轴方向上的向量local yAxis = hkVector4.new(0.0, 1.0, 0.0)--创建一个四元数local backOffset = hkQuaternion.new()--绕y轴旋转13度(化为弧度制)backOffset:setAxisAngle(yAxis, 13.0 * DEG_TO_RAD)--获取骨骼空间local backLocalSpace = hkbGetBoneLocalSpace(hkbGetBoneIndex("BackA_M"))--获取骨骼的旋转矩阵local rotation = backLocalSpace:getRotation()--进行旋转rotation:mul(backOffset)backLocalSpace:setRotation(rotation)--重设骨骼空间hkbSetBoneLocalSpace(hkbGetBoneIndex("BackA_M"),backLocalSpace)--local m4RightHandOffset = hkVector4.new()--m4RightHandOffset:setRotatedDir(m4RightHandTransform:getRotation(), hkVector4.new(-1.0, 0.0, 0.0))--rightHandIkTarget:setAddMul4(m4RightHandTransform:getTranslation(), m4RightHandOffset, 0.30)--rightHandIkTarget:setTransformedPos(hkbGetWorldFromModel(), rightHandIkTarget)end

      这个函数所做的操作就是不断地绕y轴旋转骨骼。


      

      所做的设置为FLAG_IGNORE_FROM_WORLD_FROM_MODEL

      文档:【如果勾选,输出的从模型到世界转换将不被混合,而由 To 生成器(您转换至的节点)产生。 另一个(From 生成器)被忽略。】

       在自转换中,也就是不进行混合。


        对于idle节点而言,它的逻辑是这样的:静止状态下,默认状态为呼吸,可以进入检查武器、四周环顾、巡逻状态等状态,它们都是执行了一次又回到呼吸状态。

        


        对于呼吸状态而言,它是一个定位骨生成器。

        文档:【定位骨生成器为被定位生成器中的选中骨骼设置世界空间位置,以匹配基准生成器的世界空间位置。 该生成器的使用案例之一是将角色双脚定在世界空间的空闲位置,即使双脚因其他与空闲混合的全身动画而略有移动,也依然被定在原地。】

        因为之前没有接触过这个编辑器,所以在此做一些简单介绍:

        Reference Frame Generator: 基准帧生成器  -  获取骨骼的世界空间位置

        Pinned Generator : 被定位的生成器 - 设置骨骼的空间位置

        Bone Indices : 骨骼索引 - 获取世界空间转换,应用到骨骼

        Fraction : 分量 - 基准姿态应用到被定位生成器的程度


       这个骨骼的基准帧就是ragdoll中的对应的片段动画。

       它的定位生成器的内容对应了一个混合编辑器:

        

        【该编辑器可以将任意数量的节点混合到一起。 在普通混合中,每个节点都应用一个权重,决定了该节点对整体姿态的影响力。 每个混合权重都能通过固定值、变量或角色属性来指定。 如果使用变量,您的游戏代码会动态控制混合权重。 您也可为角色的根运动和骨架中的每块骨骼指定固定权重,进行更精细的控制。】

         该项中勾选了Parametric Blend(参数混合):

        【参数混合允许使用一个参数值对任意数量的片段进行平滑混合。 输入参数根据每个子项所分配的参数值决定要混合哪些片段。】

         我们设置这个值为Aim Y变量,它可以由代码来控制。

         我们设置Look Up参数值为90,Look Forward参数值为0,Look Down参数值为-90,默认值为0,这时对应的状态时向前看。举例而言,如果取值为45,那么运动状态介于Look Forward和Look Up之间。

        【如果两个子节点的分配参数值相同,则它们在混合节点列表中的排序决定了混合的表现。】


        对于Inspect Weapon而言,它对应着一个脚本:

        


        它注册了两个函数,一个是初始时onInspectWeaponActivate(),另一个是结束时onInspectWeaponDeactivate()。

function onInspectWeaponActivate()    --设置手IK为falsem_handIkWasEnabled = hkbGetVariable("HandIkEnabled")hkbSetVariable("HandIkEnabled", false)end

function onInspectWeaponDeactivate()hkbSetVariable("HandIkEnabled", m_handIkWasEnabled)--还原原本状态end


原创粉丝点击