游戏引擎中的物理应用

一、 角色控制器

Character Controller和普通的动态对象(Dynamic Actor )是不同的,主要的三个特点是:

  • 它拥有可控制的刚体间的交互
  • 假设它是有无穷的摩擦力(可以站停在位置上),没有弹性
  • 加速和刹车几乎立即改变方向并传送

所以其实角色控制器其实是反物理的。

1.1 构建一个控制器

首先,这是一个具有以下两个特点的运动学对象(Kinematic Actor):

  • 不受物理规则影响
  • 对其他object可以产生力(交互)

形状上,一般使用胶囊体,且一般有内外两层,内层是实际的碰撞体,外层主要是防止对象与其他物体过近(从而避免高速运动下直接发生重叠的情况以及其他对象过近时相机视角出错的问题)

1.2 角色控制器的特点和小细节:

  • Auto Slide 撞墙后自动沿着墙滑步
  • Auto Stepping 爬楼梯要高度合适(跳太高反而会导致上顶很难设计)
  • Max climb slopes 设置一个角度阈值,高于它时角色控制器应该无法冲上去
  • Force Sliding Down 在比较陡峭(小于上述阈值,因为上述是基于原本就有冲量的基础)的斜坡应该要设置自动下滑
  • Controller Volume Updata 简单讲就是游戏中角色随状态会改变它的体积(比如站蹲趴、变形等),所以会需要实时更新计算它的size,而在处理过程中,应该在更新之前进行重叠测试,防止因为物理系统处理的比较快等原因导致在实际上还不能改变到目标尺寸的时候就进行了更新
  • Controller Push Objects 角色可以对其他动态物体施加力互动,往往以当时角色控制器的冲量进行计算
  • Standing on Moving Platform 在这种情况下,一般在逻辑上把角色控制器和平台物体绑定在一起(除非要进行更高标准精细计算的情况),来防止平台移走角色下落的情况以及因为帧率问题导致的角色处在上下移动平台上时不断弹动的情况。

总的来说,角色控制器本身并不是多复杂的对象,但其拥有很多小细节和设计来模拟各种不同情况下的真实处理。
而作为引擎设计者,应在设计角色控制器时留有较多的处理空间给开发者进行不同的细节设计。

二、 布娃娃系统 Ragdoll

在这里插入图片描述
首先,为什么需要布娃娃系统?以一个简单的例子说明:当一个角色被刺杀后需要播放对应设计好的死亡动画,由于实际游戏中情况复杂,如果不引入布娃娃系统的话会导致比如在悬崖边死亡一半身体在外面的情况。而引入布娃娃系统就可以使其顺势掉落下去,合理很多。

具体来说,布娃娃系统就是利用了人物的joint和骨骼,一般设置的较粗略,最多也就十几个joint,然后设计彼此之间的限制和关系,从而形成合理的转变动作。
在这里插入图片描述
由于布娃娃系统的joint较少,并不覆盖所有原生骨骼joint,所以如何用布娃娃系统的joint去驱动整套骨骼呢?
将joint分为三类:

  • Active joints — 这些joint上布娃娃系统和原本骨骼重叠,所以只需要直接用原骨骼系统去进行变化即可
  • Leaf joints — 在布娃娃系统joint尽头未被覆盖的joint,使其保持动画设定的变化即可,跟着布娃娃系统尽头的joint变化延伸
  • Intermediate joints — 在两个布娃娃系统joint之间的原生骨骼节点,一般使用插值均匀分到这些joint上进行限制性变化
    在这里插入图片描述

另外,在实际游戏中,整个过程并不完全是由布娃娃系统进行,比如上述刺杀过程,一般是先进行对应的动画,当进行到一定情况时(比如快倒下时)交给物理系统进行判断布娃娃的处理。

而在更多情况下,动画和物理的区分并不像上述一样清晰,而是直接互相融合,比如抱着一个小女孩跑步的过程,一方面小女孩自身拥有一定的晃动动画,另一方面随着整体位置的移动,动画带来的角色物理信息会一起输入到物理系统去更新最终呈现出来的融合效果,使得避免动画单纯重复(只动画)和小女孩乱晃(只物理/布娃娃)。

三、 衣料模拟

衣料模拟方面,游戏开发发展过程中出现过三个经典方法,前两个为:

基于动画的衣料模拟 — Animation bone
把衣服当身体一样进行动画处理,在衣服上设置joint和骨骼,并进行相应的插值处理。优点在于便宜和可控(移动端),缺点在于不够真实、和环境没有交互以及设计上受限

基于刚体的衣料模拟 — Kinematic bone
像布娃娃系统一样设置一些骨骼joint,利用物理系统去进行计算处理。优点在于便宜和可交互,缺点在于质量不可控、动画师的工作量大、不鲁棒以及需要高质量物理系统参与
而我们的重点在于第三个衣料模拟方法:

3.1 基于mesh的衣料模拟

简单讲就是获得物体的mesh,并对每一个顶点进行计算处理。而由于物理系统计算的昂贵,所以一般不会像渲染时一样对每个顶点计算,而是相对稀疏。(少几倍到十倍)
在这里插入图片描述

具体做法上细节如下(以人物身上的衣料为例(披风)):
在这里插入图片描述

首先,对每一个顶点要设置最大的移动半径。一般来说,对离人物越近的顶点,最大移动半径越小(比如脖子处基本不动),一方面更符合物理实际,另一方面可以减少穿模概率

在游戏开发者角度来说,需要设置衣料的物理属性。以UE4为例,有如下属性:
在这里插入图片描述
结合上渲染系统,可以表现出不同材质和物理情况的衣料。

3.2 基于Mass-Spring系统

而在引擎开发者角度,衣料的实现是基于一个Mass-Spring系统。
我们只能把衣料处理成许多弹簧质点。针对每一个质点,它会收到两个力,一是弹簧弹力,与弹簧系数和位移大小有关;另一个是所谓damping force,是一个衰减力,与damping系数和速度有关。如下图:
在这里插入图片描述
这个衰减力主要是为了处理空气阻力(每一个质点代表的是实际的衣料上的一个小面,所以空气阻力并不小)和能量爆炸问题(随着迭代产生)

根据不同的需求和衣料特点,实际中如何设置弹簧质点各有不同,以最标准的每个顶点之间一个弹簧为例进行详细力的分析。取其中某个顶点为例进行受力分析:
在这里插入图片描述
其中,空气阻力是受速度影响的,简单计算就是速度乘以一个常量系数(虽然实际上应该是速度平方)。
获得加速度之后,可以直接利用Verlet公式进行计算下一帧的位置。
Verlet公式由上一课所提的半隐式欧拉法为基础进行转换得到,只需要利用上一帧位置和当前帧算出的加速度即可,成本低速度快。其另外一个值得注意的优点是避免了速度的计算,从而避免了速度突变导致的位移不稳定。

然而,现在最常用的是处理弹簧算法的方法是:Position Based Dynamics(PBD),其简单思想是用拉格朗日力学替代传统力学那一套,放弃“约束 - 力 - 速度 - 位置”的逻辑而把所有的力学关系描述成一套约束,并直接解出最后的位置,而不关心速度。
PBD在第六章会详细介绍。

衣料的另一个问题是自碰撞问题,同一件衣服之间、不同件衣服之间的碰撞十分复杂,解决方案有四个:

  1. 单纯把衣服变厚即可,这样即使有一定穿模也不影响
  2. 使用很多substep去精细的处理物料间的碰撞
  3. 设置一个最大速度阈值,防止衣料之间穿模的过深,还能弹回来
  4. 第三点的进阶,在衣料内部设置一个反向的力场,当有其他衣料穿进来时对其施加反方向的力将其弹出。

四、 破坏模拟

破坏系统的制作大概分为如下步骤:

  1. 设计架构 Chunk Hierarchy。将完整未被破坏的物体自然分割成不同大小的块并生成树状结构进行描述它们的关系。在这里插入图片描述

  2. 建立不同块之间的联系,此时是指同一层的不同块之间的关系。设置它们联系的紧密程度。实时更新。在这里插入图片描述

  3. 对每一个联系设置一个value值,表示当多大的力打到该部分时会打断其间的联系。其实也就是“硬度”。每次打击后更新其值(比如不断变小)。变成0时即断开。在这里插入图片描述

  4. 计算从冲量产生的伤害值 D = I / H 。I是指撞击给的冲量,H是指刚体的材料硬度。在这里插入图片描述

  5. 计算球体撞击的伤害值D。结果分段,在比较小的范围内物体收到相同的完全的伤害,在最大伤害范围外物体不受到伤害,在中间从内到外插值不断减小。在这里插入图片描述

  6. 另外,当撞击发生时,有没有support graph也会影响结果在这里插入图片描述

  7. 步骤1中所述自然分割怎么实现?— Voronoi Cell。简单讲就是在物体上随机撒一些种子,每个种子不断扩大直至撞到其他种子区域,当全部稳定下来后就形成不同的块。3维物体的切割也是类似。只是最后要用一个分割四面体的方法。

  8. 分割3维物体的一个难点是处理切割处的纹理问题,一般有两种方式:1、直接制作对应的三维纹理,切割时直接用(麻烦、贵)2、离线计算好这些纹理,一旦破碎则切换到对应的纹理,(要瞬时处理)。简而言之都很复杂。

  9. 另外,碎的方式也可以设计的不一样,均匀的、随机的、中心往外碎等等。

  10. 再另外,碰撞对应的声效、粒子效果等都会增加真实性。

五、 载具模拟

  • 首先是形状,由一个刚体构成,还有一些弹簧等组件。

  • 其次是动力(静摩擦力)组成,如下图:在这里插入图片描述
    由引擎扭矩经过一系列操作获得轮胎扭矩,再从而获得摩擦力F。

  • 悬挂力(Suspension Force)。轮胎是悬挂在车上的(利用弹簧),所以有一个随着轮胎离车体距离形成的弹簧弹力。在这里插入图片描述

  • 轮胎力。分两个:一是向前的纵向力,由向前的拉力(如上述)和反向的拉力和转动阻力组成;二是横向力(用于转弯),是由滑动摩擦力和角度构成。最终方向由两个力的合力构成。在这里插入图片描述

  • 重心也很影响车的设计和体验。重心本身的计算就是两轮之间重量的中心点;在跳跃、转弯时重心靠前和靠后会发生不一样的接过,一般来说,重心靠后会让车更稳定、转弯时更容易转大弯。

  • Weight Transfer。在实际驾驶中,汽车的重心是会发生变化的,主要是由驱动力产生(加速时靠后,减速时前移等)。在这里插入图片描述

  • Steering angles 驾驶角度。当前面两个轮胎转动一样角度时,靠外的轮胎会发生空转。所以实际驾驶中两个轮胎的转动角度是不一样的,具体是由轮胎到转动圆的圆心的连线(半径)的垂线(其实就是切线)决定。在这里插入图片描述

  • Advanced Wheel Contact。比如在过减速带时,如果简单的进行raycast(当前轮胎被减速带穿模过了就往上抬,否则下降),会出现穿模。实际处理中要用spherecast,将轮胎整体以圆的形式去判断。在这里插入图片描述

六、 高级:PBD与XPBD

6.1 PBD

拉格朗日力学:不同于牛顿力学中提到的物体的运动会受到限制(比如能量守恒),拉格朗日力学的思路正好相反,它由这些限制可以得出物体的运动方式(由能量守恒可以推出牛一定律)。
从而把很多力学问题化成了求解约束的问题。
具体来讲,以圆周运动为例:
在这里插入图片描述
其中X就是位置的向量。通过位置的约束和速度的约束可以反向得到运动的方式。
同理还有弹簧的约束:𝐶𝑠𝑡𝑟𝑒𝑡𝑐ℎ (𝐱1,𝐱2) = ||𝐱1 − 𝐱2|| − 𝑑

总结下来,PBD就是一个迭代的不断优化约束状态的过程(有点类似神经网络…),不需要计算速度等中间量,只需要让每一个量都梯度变化,去优化最终结果即可。一般停止迭代是要么当前约束误差小于阈值、要么迭代次数达到一定量。
PBD也需要在最后结束迭代时加上一个damping项来防止爆炸。

可以参考PBD (Position Based Dynamics)

6.2 XPBD

在PBD基础上加入stiffness参数来调节约束的软硬程度,具体可以参考XPBD (Extended PBD)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《QT实用小工具·十》本地存储空间大小控件

1、概述 源码放在文章末尾 本地存储空间大小控件,反应电脑存储情况: 可自动加载本地存储设备的总容量/已用容量。进度条显示已用容量。支持所有操作系统。增加U盘或者SD卡到达信号。 下面是demo演示: 项目部分代码如下: #if…

vue项目引入微信sdk: npm install weixin-js-sdk --save报错

网上查到要用淘宝的镜像 同事告知旧 域名:https://registry.npm.taobao.org/已经不能再使用 使用 npm config set registry http://registry.npmmirror.com

css心跳动画

图标引入 <img class"icon" src"heart.svg" alt"" srcset""> CSS代码 <style>.icon {animation:bpm 1s linear,pulse 0.75s 1s linear infinite;}keyframes pulse {from,75%,to {transform: scale(1);}25% {transform:…

极简云验证 download.php 文件读取漏洞复现

0x01 产品简介 极简云验证是一款开源的网络验证系统&#xff0c;支持多应用卡密生成&#xff1a;卡密生成 单码卡密 次数卡密 会员卡密 积分卡密、卡密管理 卡密长度 卡密封禁 批量生成 批量导出 自定义卡密前缀等&#xff1b;支持多应用多用户管理&#xff1a;应用备注 应用版…

智能仪器驱动企业数字化转型 迈向智慧未来!

在当今数字化时代&#xff0c;企业正面临着前所未有的挑战和机遇。为了在竞争激烈的市场中立足并实现可持续发展&#xff0c;数字化转型已成为企业的当务之急。智能仪器作为数字化转型的核心驱动力&#xff0c;以其卓越的性能和创新的技术&#xff0c;为企业开启了通向智慧未来…

C_C++数据的在内存中的分布

C/C内存分布 在编程世界中&#xff0c;C和C语言一直以其强大的性能和灵活性著称。然而&#xff0c;这种强大和灵活的背后&#xff0c;离不开对内存分布的深入理解和熟练掌握。本文将详细介绍C/C程序中的内存分布&#xff0c;包括栈、堆和全局变量的存储区域。下面是c/c中&…

基于OrangePi Zero2的智能家居项目(开发阶段)

智能家居项目的软件实现 紧接上文 基于OrangePi Zero2的智能家居项目&#xff08;准备阶段&#xff09;-CSDN博客 目录 一、项目整体设计 1.1项目整体设计 1.2具体划分 二、开发工作的前期准备 1、进行分类&#xff0c;并用Makefile文件进行管理 参考&#xff1a;自己创…

基于单片机的智能报站系统仿真设计

**单片机设计介绍&#xff0c;基于单片机的智能报站系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能报站系统仿真设计概要是关于采用单片机技术实现公交车报站功能的系统设计概述。以下是对该设计的…

Unity 学习日记 13.地形系统

下载源码 UnityPackage 1.地形对象Terrain 目录 1.地形对象Terrain 2.设置地形纹理 3.拔高地形地貌 4. 绘制树和草 5.为地形加入水 6.加入角色并跑步 7.加入水声 右键创建3D地形&#xff1a; 依次对应下面的按钮 || 2.设置地形纹理 下载资源包 下载资源包后&#x…

vue2+element-ui 实现OSS分片上传+取消上传

遇到问题&#xff1a;项目中需要上传500MB以上的视频。一开始使用上传组件el-upload&#xff0c;调用后台接口&#xff0c;但是出现了onprogress显示百分百后接口一直pending&#xff0c;过了很多秒后接口才通&#xff0c;如果遇到大文件的话&#xff0c;接口就会报超时。 解决…

基于卷积神经网络的苹果等级分类系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

功能演示&#xff1a; 苹果等级分类系统&#xff0c;基于vgg16&#xff0c;resnet50卷积神经网络&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的苹果等级分类系统是在pytorch框架下实现的&#xff0c;系统中有两…

redis 集群 (主从复制 哨兵模式 cluster)

目录 一 主从复制 &#xff08;一&#xff09;相关理论 1&#xff0c;主从复制定义 2&#xff0c;主从复制的作用 3&#xff0c;主从复制架构图 4 sync 同步过程 5&#xff0c;主从复制流程 &#xff08;二&#xff09; 实验模拟 1&#xff0c; 实验环境 2, 修…

IDEA连接SqlServer数据库

目录 下载jar包 下载sqljdbc_12.6压缩包 解压 导入IDEA 新建文件夹 复制粘贴进JDBC文件夹并设为library 编写类及方法 代码 下载jar包 以sqljdbc_12.6为例 下载sqljdbc_12.6压缩包 最新地址&#xff1a;sqljdbc 官方最新地址 解压 解压即用 导入IDEA 新建文件夹 复制…

C++的并发世界(六)——互斥解决数据共享冲突

0.数据共享的问题 在多个线程中共享数据时。需要注意线程安全问题。如果多个线程同时访问同一个变量。并且其中至少有一个线程对该变量进行了写操作。那么就会出现数据竞争问题。数据竞争可能会导致程序崩溃,产生来定义的结果,或者得到错误的热果。为了避免数据竞争问题。需要…

docker部署nacos,单例模式(standalone),使用mysql数据库

文章目录 前言安装创建文件夹"假装"安装一下nacos拷贝文件夹删除“假装”安装的nacos容器生成nacos所需的mysql表获取mysql-schema.sql文件创建一个mysql的schema 重新生成新的nacos容器 制作docker-compose.yaml文件查看网站 前言 此处有本人写得简易版本安装&…

【开发、测试】接口规范与测试

接口测试基础 url 是互联网标准资源地址&#xff0c;称为统一资源定位符 组成&#xff1a;协议&#xff0c;服务器地址&#xff0c;端口号 HTTP协议 HTTP&#xff1a;超文本传输协议&#xff0c;基于请求与响应的应用层协议 作用&#xff1a;规定了客户端和服务器之间的信…

可视化大屏的应用(18):网络安全和信息安全领域

可视化大屏在物联网领域具有以下价值&#xff1a; 实时监控和可视化&#xff1a; 可视化大屏可以将物联网设备和传感器的数据以图表、图形和动画等形式实时展示&#xff0c;帮助用户直观地了解物联网系统的运行状态和数据趋势。通过可视化大屏&#xff0c;用户可以快速发现异…

海外版 双语言爆点游戏 双语音指挥游戏 去中心化投注游戏 双声道音效游戏 附带安装教程

海外版双语言爆点游戏/纯vue源码版/去中心化投注游戏 系统为纯VUE源码&#xff0c;附带安装教程 前端只有一个爆点游戏能玩&#xff0c;去中心化无后台 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88991298 更多资源下载&#xff1a;关注我。

为 AI 而生的编程语言「GitHub 热点速览」

Mojo 是一种面向 AI 开发者的新型编程语言。它致力于将 Python 的简洁语法和 C 语言的高性能相结合&#xff0c;以填补研究和生产应用之间的差距。Mojo 自去年 5 月发布后&#xff0c;终于又有动作了。最近&#xff0c;Mojo 的标准库核心模块已在 GitHub 上开源&#xff0c;采用…

防火墙状态检测和会话机制

FW对TCP&#xff0c;UDP和ICMP协议的报文创建会话