动画、运动网络与 IK
范围:animation/、ik/,连接任务 motion 层与角色骨骼。总入口:Summary。
1. 游戏语义如何进入动画框架#
游戏层没有在这里重新实现整个动画引擎。CGtaAnimManager : fwAnimManager、Move 类与 fwAnimDirector、motion tree、clip sets 和 RAGE move network 配合,增加 GTA 的行为槽位、事件标签、角色特殊处理和资源选择。
这里的 movement/animation “network” 指动画图或运动网络,不是在线通信网络。CMovePed::SetMotionTaskNetwork 中的 network player 是运动图播放对象;只有额外进入网络同步接口时才涉及联机复制。
2. 从任务到姿态#
此图表达数据关系,不表示所有角色每帧都使用全部节点。AI/动画 LOD、任务状态、资源就绪和 ragdoll 会改变具体路径。
CMovePed 提供 Update、PostUpdate、FinishUpdate、PostFinishUpdate,说明图求值、结果收敛和最终处理具有阶段。角色 intelligence 的 ProcessPreRender2 又明确位于骨骼更新后、IK 前,给行为层提供最后调整机会。
3. 槽位、混合与局部覆盖#
CMovePed 分别管理 motion task network、task network 和 secondary task 相关状态。设置接口接收 blend duration、flags 和 filter;查询接口区分是否完全混入或混出。这允许基础移动上叠加瞄准、交互和其他动作,而不是每次切动作都完全替换整个人物姿态。
图中可包含普通 on-foot、low LOD、游泳、上下车、掩体、梯子、降落伞、武器装填及从 NaturalMotion 混回等不同网络 ID。实际网络定义和 clip 内容需要资源配合;仅从 C++ ID 列表不能还原完整动画图、过渡曲线或所有素材。
清除一个槽位时的 blend-out 仍可能持续一段时间,因此“任务已退出”和“视觉动作已结束”不是同一时刻。新任务若不考虑旧槽位和骨骼过滤,可能产生姿态竞争;维护时应检查任务退出、资源释放和混合完成之间的协议。
4. 动画事件是玩法同步点#
CClipEventTags 定义 Fire、Object、BlendOut、IK、ArmsIK、LegsIK、LookIK、CameraShake、PadShake 等 property。它们让动画时间上的标签触发或控制玩法和表现,避免所有行为仅使用外部固定计时器。
优势是动作与效果对齐:开火、道具交接、足部调整和反馈可以跟随 clip。代价是 clip 速率、跳转、循环、混合与跳帧都会影响事件时机;变更动画资源时应检查事件标签,而不只检查骨骼是否正确。
事件定义和消费者分离,也使同一基础动画具备不同情境控制。不能从某个 Fire tag 的存在推断它一定直接完成武器伤害结算,实际仍需看标签处理与当前任务条件。
5. IK 管理与求解器所有权#
CBaseIkManager 汇集多种 solver,提供 GetSolver、HasSolver、GetOrAddSolver 和添加/删除管理。声明注明 manager 负责 solver 的创建与销毁。类型扩展除了增加枚举/元数据,还需要在 AddSolver 创建分支中接入。
头文件列出手臂、腿、body look、body react、recoil、车内躯干等请求类型。不同 solver 解决不同接触和注视约束,不能假设一套双骨 IK 足以覆盖全部姿态调整。PreIkUpdate、PostIkUpdate 提供求解前后接口,solver 排序与 dirty 状态用于管理更新。
IK 目标经常依赖世界坐标、车辆、武器或地面;而骨骼输入处于模型局部空间。定位错位时应核查坐标变换、目标实体存活和更新阶段,再看求解数学。角色换模型或离开车辆也必须重新评估 solver 的有效目标。
6. 物理动画、表情和资源#
MovePed 内有 ragdoll frame filter,网络列表包含 blend from NM;NaturalMotion 具体行为还跨 task/Physics 和引擎集成。动画与物理可以在不同阶段接管角色,而恢复控制需要混合和状态衔接,不应简单认为“关闭 ragdoll 就恢复前一帧动画”。
FacialData、GestureManager、AnimScene、ClipDictionaryStoreInterface 和 PMDictionaryStore 展示表情、手势、协同场景和资源存储的分工。多人同步场景、过场和普通任务可能共用底层动画能力,但各自拥有不同时间与资源生命周期。
成本主要来自可活动网络、骨骼数量、混合、IK、表情和资源切换;角色动画分时更新会进一步改变时步。当前没有 runtime profile,不能从类数量估算实际开销。
7. 源码依据与阅读路线#
| 源码 | 重点 |
|---|---|
| AnimManager.h | 游戏动画管理器与框架边界 |
| Move.h | 网络 ID、RAGE motion/move 接入 |
| MovePed.h | 多阶段更新、槽位、blend/filter、ragdoll filter |
| EventTags.h | clip 时间标签与游戏语义 |
| IkManager.h | solver 管理、所有权、前后更新 |
| IkRequest.h | IK 请求接口 |
建议沿“具体任务 → 设置的 network 与参数 → clip/event tag → MovePed 阶段 → IK → 附件/渲染”追踪。关联:AI、物理、过场。