游戏引擎中的物理应用

news2024/11/20 13:38:22

一、 角色控制器

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.coloradmin.cn/o/1566794.html

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

相关文章

图论(Graph theory)

抽象数据结构类型 Graphic操作接口 操作接口功能描述操作接口功能描述e()获取图的总边数n()顶点的总数exits(v,u)判断v,u两个顶点是否存在边insert(v) 在顶点集 V 中插入新顶点 v remove(v,u)删除从v 到u的 关联边 remove(v) 将顶点 v 从顶点集中删除 type(v,u)边所属的类型(…

蓝桥杯物联网竞赛_STM32L071_15_ADC/脉冲模块

ADC模块用的是RP1不用多说了,主要是脉冲模块,这个模块没考过 这个脉冲模块放出脉冲,主要能用TIM捕获到这个脉冲的高电平持续时间即可 CubMx配置: 脉冲模块的引脚与PB0相连,所以用PB0读取上升沿记的数和下降沿记的数&am…

【第十一届大唐杯全国大学生新一代信息通信技术大赛】赛题分析

赛道一 一等奖 7% 二等奖 15% 三等奖 25% 赛道二 参考文档: 《第十一届大唐杯全国大学生新一代信息通信技术大赛(产教融合5G创新应用设计)专项赛说明.pdf》 一等奖:7% 二等奖:10% 三等奖:20% 赛项一&am…

【SQL】1873. 计算特殊奖金(CASE WHEN;IF())

题目描述 leetcode题目:1873. 计算特殊奖金 Code 写法一: CASE WHEN select employee_id, (case when employee_id % 2 0 or name like M% then salary 0 else salary end) as bonus from Employees order by employee_id写法二 :IF() …

大数据毕业设计hadoop+spark旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 计算机毕业设计 机器学习 深度学习 知识图谱

基于hive数据仓库的贵州旅游景点数据分析系统的设计与实现 摘 要 随着旅游业的快速发展和数字化转型,旅游数据的收集和分析变得越来越重要。贵州省作为一个拥有丰富旅游资源的地区,旅游数据的分析对于促进旅游业的发展和提升旅游体验具有重要意义。基…

Docker 部署开源远程桌面工具 RustDesk

RustDesk是一款远程控制,远程协助的开源软件。完美替代TeamViewer ,ToDesk,向日葵等平台。关键支持自建服务器,更安全私密远程控制电脑!官网地址:https://rustdesk.com/ 环境准备 1、阿里云服务器一 台&a…

Jenkins磁盘空间自动清理

背景介绍 Jenkins作为一款广泛应用于自动化构建、测试与部署的强大工具,在长时间运作后,其服务器上积累了大量的构建历史、工作空间、日志文件以及其他临时数据。每次构建都会生成一系列的工作产物,随着时间的推移,这些数据逐渐占…

RabbitMQ3.x之六_RabbitMQ使用场景

RabbitMQ3.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ?1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ? RabbitMQ 是一个可靠且成熟的…

微服务连接不上rabbitmq解决

1.把端口port: 15672改成port:5672 2:virtual-host: my_vhost一定对应上

云计算存在的安全隐患

目录 一、概述 二、ENISA云安全漏洞分析 三、云计算相关系统漏洞 3.1 概述 3.2 漏洞分析 3.2.1 Hypervisor漏洞 3.2.1.1 CVE-2018-16882 3.2.1.2 CVE-2017-17563 3.2.1.3 CVE-2010-1225 3.2.2 虚拟机漏洞 3.2.2.1 CVE-2019-14835 3.2.2.2 CVE-2019-5514 3.2.2.3 CV…

OpenHarmony实战开发-多设备自适应能力

介绍 本示例是《一次开发,多端部署》的配套示例代码,展示了页面开发的一多能力,包括自适应布局、响应式布局、典型布局场景以及资源文件使用。 说明: 自适应布局能力仅可以保证在外部容器大小在一定范围内变化时,容…

国外媒体推广软文宣发:促进海外宣发新风尚,迈向国际舞台

大舍传媒http://www.dashemeijie.com 序言 伴随全球经济一体化发展趋向,越来越多的中国企业希望在国际舞台上表现自己的总体水平。而国外媒体软文发稿作为一种全新的海外宣传方式,正逐渐成为促进海外宣发新风尚的主要常用工具。接下来我们就探讨国外媒…

Acrel-1000DP光伏监控系统在尚雷仕(湖北)健康科技有限公司5.98MW分布式光伏10KV并网系统的应用

摘 要:分布式光伏发电特指在用户场地附近建设,运行方式多为自发自用,余电上网,部分项目采用全额上网模式。分布式光伏全额上网的优点是可以充分利用分布式光伏发电系统的发电量,提高分布式光伏发电系统的利用率。发展分…

构建企业级微服务平台:实现可扩展性、弹性和高效性

在软件开发的快速发展领域中,企业不断努力构建健壮、可扩展和高效的系统。随着微服务架构的出现,再加上云原生技术的应用,创建敏捷且具有弹性的平台的可能性是无限的。在本指南中,我们将深入探讨使用强大的工具和技术组合&#xf…

苹果商店审核指南:确保Flutter应用顺利通过审核的关键步骤

引言 Flutter是一款由Google推出的跨平台移动应用开发框架,其强大的性能和流畅的用户体验使其备受开发者青睐。然而,开发一款应用只是第一步,将其成功上架到苹果商店才是实现商业目标的关键一步。本文将详细介绍如何使用Flutter将应用程序上…

​如何使用ArcGIS Pro进行洪水淹没分析

洪水淹没分析是一种常见的水文地理信息系统应用,用于模拟和预测洪水事件中可能受到淹没影响的地区,这里为大家介绍一下ArcGIS Pro进行洪水淹没分析的方法,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&…

2012年认证杯SPSSPRO杯数学建模A题(第二阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现: 第二阶段问题   现在我们假设一个具体的环境。假设有一个凸多边形的区域,蜘蛛准备在这个区域(或其一部分)上结一张网。   问题一: 在区域的边界上安置有若干…

06-编辑器

gedit编辑器 gedit是Ubuntu系统自带的编辑器,可以用来轻度编辑和记录一些内容。 在终端中我们通过以下命令打开: gedit 要打开或者新建的文件名虽然Ubuntu的图形界面也能通过gedit打开文件,但是用终端打开gedit可以动用更高的权限&#xff…

localPosiTion和WorldPosition的mask应用。

localPosiTion和WorldPosition的mask应用。 2021-07-22 17:39 1. local Position应用 2. WorldPosition应用 shader的连接:localposition:localposition>mask(B)>ADD>1-x>multiply>opacity …

Spring Boot中前端通过请求接口下载后端存放的Excel模板

导出工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger;…