Create Ragdoll System In Goldsrc

本文介绍了如何在Goldsrc引擎中创建布娃娃系统,由于引擎不支持内置物理系统,作者利用引擎调用客户端ModelRender的特性,通过hook关键函数实现骨骼控制,从而达到布娃娃效果。内容包括前提条件、理论基础、设计思路、详细设计和相关API的介绍。
摘要由CSDN通过智能技术生成

简介

goldsrc引擎的模型动画系统只有骨骼关键帧动画系统,不能对地形做出逼真的倒地动作。要实现布娃娃系统,需要物理引擎的支持。goldsrc没有内置一般意义上的物理系统(Bullet、PhysX or Havok…),且goldsrc引擎是不开源的,我们并不能在引擎做手脚,怎么办呢?好在引擎会通过调用客户端的ModelRender来进行一些自定义的渲染,使得我们可以在这里实现对模型骨骼的控制。这样实现的布娃娃也可以搬到cs1.6,我们需要hook一些关键的函数自己实现一遍即可。引擎不提供相关API,也不原生支持这些操作(设计这个游戏的那个年代根本没想到要支持这些),我们需要一些hack 手段。

附加说明

这不是成套的项目代码,你需要适配你自己的模型。现在的打算是做一个纯客户端的布娃娃。

前提

  1. Half Life 1 SDK
  2. Bullet Engine

理论

前提是你需要有一个具有骨骼动画模型的实体(通常是玩家,之后可以拓展一个布娃娃实体),在特定条件(玩家死亡,布娃娃实体初始化 等)激活布娃娃EnablePhysics(entityId)。物理引擎的布娃娃对象保存着关键骨骼的transform,每绘制一个实体,都使用实体唯一标识作为参数调用物理引擎的SetupBones函数,如果这个实体需要物理引擎接管骨骼的控制,则将关键骨骼的物理世界变换乘以一个offset(稍后解释)得到关键骨骼的游戏世界变换,写入StudioBonesTransform。然后遍历非关键骨骼,ConcatWithParent Transform,得到非关键骨骼的游戏世界变换,写入StudioBonesTransform。这样就完成了骨骼Transform的设置,最后引擎把模型渲染出来。
当玩家死亡时,EnablePhysics函数将截取玩家模型最后一帧的StudioBonesTansform来设置物理世界Rigid Bodys 的初始变换,因为玩家在生前应该是拿着枪正在战斗,或者正在跳跃,死后应该从这种状态慢慢由物理引擎控制转变为倒地状态。

设计

  • 当某个玩家模型precache的时候,调用precachePhysics预缓存CollisionShape(s);当玩家实体被实例化时,调用InitRagdoll创建rigid bodies和constraints但不添加到物理世界。InitRagdoll还记录了每个rigid body相对关键骨骼的相对变换。记录初始状态是很重要的,因为当我们想设置物理世界rigid body,需要参考模型最后一帧的关键骨骼的transform来设置,当中需要处理relative transform。
  • 当模型处于T-pose时,设置模型的CollisionShapes和Constraints要容易得多,因为当前还没开发GUI编辑器。
  • StartRagdoll将在玩家死亡的时候调用,copyModelToRagdoll函数将用模型变换设置rigidbody的变换
  • StudioRenderer将在setupBones函数结尾调用UpdatePhysicsBone(entityId)。在此函数内判断IsRagdolling来确定是否需要接管骨骼控制。
  • StopRagdoll将在玩家复活时将ragdoll对象移出物理世界,并且IsRagdoll=false;等待下一次玩家死亡。
  • 当玩家更换模型或者离开游戏时则移出物理世界并销毁ragdoll对象。
  • FIXME:需要注意的是goldsrc裁剪渲染元素的规则,如果引擎觉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值