[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] 范围将被映射到这一间隔内。
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
- [Havok学习笔记(7)] 样例US_Soldier_Project.hkp学习
- [Havok学习笔记(1)] Havok概述
- [Havok学习笔记(2)] HAT样例AnimatedAttachments
- [Havok学习笔记(3)] LOCOMOTION TUTORIAL
- [Havok学习笔记(4)] INTERACTIVITY TUTORIAL
- [Havok学习笔记(5)] CAMERA TUTORIAL
- [Havok学习笔记(6)] QUALITY TUTORIAL
- Havok Physics物理引擎的学习入门
- Havok使用笔记
- Havok
- 学习笔记(7)
- J2ME学习笔记(7)
- 网络工程师学习笔记(7)
- Hibernate 学习笔记(7)
- MFC学习笔记(7)
- 每日学习笔记(7)
- SQLite学习笔记(7)
- java学习笔记(7)
- 最近用vc重写了xampp控制面板
- iOS 开发+(void)load与+(void)initialize区别
- 利用Jetty部署Java web项目
- contenteditable
- synchronized 对象锁和 ReentrantLock非公平锁tryLock() 的比较
- [Havok学习笔记(7)] 样例US_Soldier_Project.hkp学习
- 通过修改指示器的间距来改变TabLayout指示器的宽度
- C#学习笔记1
- 走向云计算之Hadoop实际应用网站日志分析
- 银联双向认证原理
- Java报错之Connection is read-only.
- 微信二维码支付接口
- spring+quartz实现定时任务遇到问题总结(bean无法注入)
- s 点击a标签 获取a的自定义属性方法_javascript技巧