简介

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裁剪渲染元素的规则,如果引擎觉得实体不在视野内则会消失!

详细设计

APIs

RagdollAPI

  • PrecacheRagdoll(string modelName)

Usage:实体预缓存资源时调用,如果存在此资源,则向字典添加 资源名-对象 ,如果不存在此资源,则向字典添加 资源名-null。如果此资源被多次预缓存,第二次预缓存发现字典已存在改键,则直接返回。
Impl:

  • CreateRagdollController(int entityId,string modelName)

If you want your entity’s model has ragdoll amimation, you would use this API to create a ragdoll controller for your specified entity. You can also call the function when an entity model changed.
此函数使用RagdollBuilder创建布娃娃对象,如果为此实体创建了null对象,则之后对该实体的相关布娃娃操作API 都直接返回。直到下次更换到支持布娃娃的模型。

  • ChangeOwner(int oldEntity,int newEntity)
  • StartRagdoll(int entityId)
  • StopRagdoll(int entityId)
  • ClearRagdoll()
  • DisposeRagdoll((int entityId))
  • ImpulseBone(int entityId,int boneId,Vector3 force)
  • HeadShootRagdoll(int entityId,Vector3 force)
  • SetupBonesPhysically(int entityId)

SceneAPI

  • LoadScene(string mapName)//world spawn
  • DisposeScene()//dispose current scene

资料

StudioRenderer之在模型的根骨骼应用变基变换,之后的骨骼因为都是相对于父骨骼的变换,所以不需要再额外乘以基变换。
[0−10100001](模型世界到游戏世界的变基矩阵)\left[ \begin{matrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{matrix} \right] \tag{模型世界到游戏世界的变基矩阵} ⎣⎡​010​−100​001​⎦⎤​(模型世界到游戏世界的变基矩阵)

references

link
BulletSharpUnity3d
BulletUnity3D

Create Ragdoll System In Goldsrc相关推荐

  1. Godot Engine:布娃娃系统(Ragdoll System)及物理骨骼(PhysicalBone)的工作流程

    文章目录 运行效果 0. 模型准备 1. 配置物理骨骼 2. 编写脚本 3. 测试运行 运行效果 0. 模型准备 在Blender完成建模及蒙皮,以glTF格式导出模型(Doll.glTF) 1. 配 ...

  2. Unity创建布娃娃ragdoll源码以及布娃娃的坑

    项目要做死亡自然一点就用布娃娃系统,其实可以用其他插件 选用了自带的布娃娃,出现一个问题每个角色的骨骼结构和命名一样,不想每次来个新模型都要打开工具把每个部位拖到布娃娃创建界面里面,创建布娃娃 顺便谈 ...

  3. Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresour

    报错 Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subres ...

  4. android smart home,Android smart home system based on ATmega16

    摘要: The increasing number of construction of houses in Indonesia would lead to an increase in the nu ...

  5. oracle手动 建库_Oracle Create the Database for 11g(手动创建数据库)

    Oracle Create the Database for 11g(手动创建数据库,附整个过程自动运行脚本) 这里说的创建数据库并非是dbca调用OUI图形来进行的,而是手动建库方式. 介绍一下操作 ...

  6. System Extract 步骤

    纲要: 把Composition下的SWC分配到System Description 描述的CAN网络的的ECU上. System Extract 目录 1. Create System Extrac ...

  7. 【转载】Ragdoll布娃娃组件

    原文地址:Ragdoll布娃娃组件 作者:RayYang 因为自己瞎弄着玩的时候,弄了一个出来,好像没见过有人说过关于布娃娃组件的,分享给大家,希望大家喜欢! 首先我们先要有一个3DMax做的人物模型 ...

  8. Unity 布娃娃插件Ragdoll Mecanim Mixer入门使用介绍以及一些坑

    1.入门使用主要两个脚本 RagdollConstructor 主要配置角色Ragdoll 的数据和每个关节的碰撞体 RamecanMixer 对布娃娃系统物理效果的控制 相对比unity自带的布娃娃 ...

  9. oracle如何使用system,【千里之行始于足下】谈Oracle的system表空间

    编辑手记:SYSTEM表空间是Oracle数据库最重要的表空间,在创建数据库时被最先创建,其中包含了数据库的元数据,对于数据库来说生死攸关.对于很多初学者,全面了解system表空间就格外重要. 系统 ...

最新文章

  1. 作为一名程序员,数学到底对你有多重要?
  2. 3d相册 html 代码_HTML5 3D立体图片相册
  3. 定界符在php中,php定界符如何使用
  4. 【POJ - 3494】Largest Submatrix of All 1’s(加一点思维后化成 单调栈)
  5. Confluence 6 修改警告的阈值和表现
  6. C语言实现简单计算器(可以处理小括号)
  7. 《ArcGIS Runtime SDK for .NET开发笔记》--在线编辑
  8. Web Hacking 101 中文版 六、HTTP 参数污染
  9. MYSQL第一章 创建表 修改表名 删除字段 添加字段 修改地段名
  10. ncl 多个单一时间文件合并成一个nc文件_iOS逆向--MachoO文件
  11. 解读百度AutoDL:打破SOTA纪录的神经架构搜索是如何炼成的
  12. 【Flask】通过Flask_login实现用户登录
  13. 使用 kubeadm快速部署Kubernetes-v1.18
  14. 华为鸿蒙os2.0游戏,华为鸿蒙os2.0系统下载-华为鸿蒙系统官方下载入口2.0下载 - 一游网手机游戏...
  15. 8个经典智能穿戴设备优选电路方案合辑
  16. 用计算机算术表白,数学表白密码
  17. php 考试座位编排系统,考试座位编排vba
  18. visual studio 版本的区别
  19. 线性回归、岭回归、逻辑回归、聚类
  20. 村长选举c语言程序,大村长-第一章 选举-爱阅小说网

热门文章

  1. 深度学习笔记~卷积网络中特征图的可视化
  2. 听音乐看节目是计算机的什么,2014家用电脑既能听音乐又能看影视节目 .doc
  3. Exchanger数据交换
  4. et99 php,ET99加密狗模拟之读取数据
  5. 彩色的Hello World到彩色的Donuts甜甜圈-蓝桥ROS云课-C++案例
  6. 看图了解linux命令
  7. 自动发送短信(Android)
  8. 薅羊毛第二十二次更新
  9. 2021-2027全球与中国手工玻璃制品市场现状及未来发展趋势
  10. 数据共享交换平台解决方案2022