游戏引擎中的物理应用

这篇具有很好参考价值的文章主要介绍了游戏引擎中的物理应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 角色控制器

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)文章来源地址https://www.toymoban.com/news/detail-850993.html

到了这里,关于游戏引擎中的物理应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(102)
  • 游戏编程中的AI与物理模拟——用Unreal Engine创建惊艳的游戏世界

    作者:禅与计算机程序设计艺术 作为游戏开发者,我们经常需要在游戏中加入一些视觉、听觉或者触觉等交互性元素,并且给用户提供更具个性化的游戏体验。游戏制作人员也喜欢利用人工智能(AI)来辅助游戏制作过程,例如制作游戏中的怪物和敌人具有潜在的危险性,能

    2024年02月07日
    浏览(36)
  • 深度学习在物理层信号处理中的应用研究

    随着移动流量呈现的爆发式增长、高可靠性和低时延的通信场景给当前网络带来了更大的复杂性和计算挑战。据IBM报道,移动数据量到2020年将超过40万亿Gbits,比2009年增加44倍,连接总设备量将达到500亿。为了满足这一需求,需要新的通信理论和创新技术来满足5G系统的需求。

    2024年01月25日
    浏览(34)
  • 网络爬虫技术在搜索引擎中的应用

    网络爬虫技术在搜索引擎中扮演着非常重要的角色,主要应用在以下几个方面: 网页抓取:搜索引擎需要从互联网上抓取大量的网页,以建立自己的索引库。网络爬虫技术可以帮助搜索引擎快速、高效地抓取网页。 网页解析:搜索引擎需要从抓取的网页中提取出有用的信息

    2024年02月08日
    浏览(49)
  • 几何引擎 & 约束求解器 & 3D仿真物理引擎 & 图形引擎

    四大技术图谱就像四座护法金刚,形成了深不可测的技术鸿沟。这对于任何一个工业软件企业,十年发展的沉淀,那还只是开始。这条路,太漫长了。 Software Vendor Domain 3D-kernel 4MCAD IntelliCAD 4M S.A., Greece CAD, AEC Open CASCADE Technology Adams MSC Software, USA CAE Parasolid ADEM ADEM, Russia-Israel

    2024年02月08日
    浏览(27)
  • 大语言模型在搜索引擎中的应用前景

    在过去的几年里,大语言模型(Large Language Model, LLM)技术取得了令人瞩目的进展。从GPT-3到最近的ChatGPT,这些基于深度学习的大型语言模型展现出了惊人的文本生成能力,能够理解和生成人类语言,在各种应用场景中发挥着日益重要的作用。 搜索引擎作为信息获取的主要入口,一直

    2024年04月15日
    浏览(26)
  • Msray搜索引擎采集工具在网络安全中的应用

    搜索引擎采集:通过用户提供的列表,从主流搜索引擎中采集相关信息,包括域名、网址、IP地址、IP所属区域、标题、描述和访问状态。这些信息能够帮助您了解竞争对手的网站特点和定价策略,从而制定更精准的营销策略。 爬虫任务:根据用户提供的网址信息列表

    2024年02月03日
    浏览(40)
  • Unity基础课程之物理引擎6-关于物理材质的使用和理解

     每个物体都有着不同的摩擦力。光滑的冰面摩擦力很小,而地毯表面的摩擦力则很大。另外每种材料也有着不同的弹性,橡皮表面的弹性大,硬质地面的弹性小。在Unity中这些现象都符合日常的理念。虽然从原理上讲,物体的摩擦力和弹性有着更复杂的内涵,例如普通的钢板

    2024年02月07日
    浏览(35)
  • Cannon.js -- 3d物理引擎

    本篇将介绍 Cannon.js -- 3d物理引擎 的基础使用,并用 Cannon.js 与 three.js 写一个简单的demo Q:什么是Cannon.js? A:Cannon.js是一个3d物理引擎,它能实现常见的碰撞检测,各种体形,接触,摩擦和约束功能。 Q:为什么要使用Cannon.js? A: 1. 比许多移植的物理引擎轻量级、更小的文

    2023年04月09日
    浏览(31)
  • 【UE4】物理引擎(蓝图)

    物理引擎通过为刚性物体赋予真实的物理属性的方式来计算 运动、旋转和碰撞反映。 游戏引擎中的物理引擎的主要目的是为了解决物体在空间的状态信息。 常规的物理引擎遵循物理定律,按照给定的算法,进行模拟物理运动。所以在没有多元因素影响的情况下,物理引擎的

    2023年04月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包