Unity物理系统基本概念
前言:物理引擎仅仅是对现实物理的一种近似模拟。无论是从运算精度和时间连续性都不够准确。目的只是为了让游戏具备令人信服的物理表现,增强游戏的表现力和用户的沉浸感。
一、刚体Rigidbody
刚体是让物体产生物理行为的主要组件。一旦挂载了Rigidbody组件,它就纳入了物理引擎的控制之中,可以受到力的影响并做出反应。
已经被挂载刚体的组件,不建议再用脚本直接修改该物体的位置或者直接改变物体的朝向。如果要让物体运动,可以考虑对刚体施加作用力来推动物体,然后让物理引擎计算并产生想要的结果;或者直接修改物体的速度(velocity)和角速度(angular velocity),这样比施加作用力更直接。
一些情况下,只需要物体具有Rigidbody组件,但又不能让它的运动受到物理引擎的控制。例如,让角色完全受脚本直接控制,但同时又不让角色被触发器检测到,这种不直接受物理控制的、但用其他方式进行的刚体运动成为运动学(Kinematic)。这种刚体的运动方式虽然部分脱离了物理系统控制而不再受到力的影响,但在需要碰撞检测等情况下依旧会被物理系统处理。
可以在脚本中随时开启或关闭物体的Is Kinematic选项,但这样以来会带来一些性能开销,不应频繁使用
二、休眠
当一个刚体的移动速度和旋转速度已经低于某个事先定义的阈值,并保持一定事件,那么物理引擎就可以假定它暂时稳定了。这种情况下,直到其再次收到力的影响之前,物理引擎都不再需要反复计算该物体的运动,这是就可以说该物体进入了"休眠"。
这是一种优化性能的方案。
大多数情况下,刚体的休眠和唤醒都是自动进行的,也就是说我们不用关心这个细节。但是,总有一些情况下,物体无法自动唤醒。例如,一个稳定放在地面上且带有Rigidbody组件的物体,在地面被移除后其仍然悬挂在空中。如果遇到类似的情况,可以在脚本中主动调用WakeUp方法
三、碰撞体Collider
碰撞体组件定义的物体的物理形状。碰撞体本身是隐身的,不一定要和物体的外观完全一致
实际制作时,更多的时候会用物体的近似形状,而不是准确形状,这样可以提升游戏的运行效率。
最节约资源的是一系列基本碰撞体,包括:
- 盒子碰撞体(Box Collider)
- 球体碰撞体(Sphere Collider) //⚠️:不会因为物体伸缩变成椭球体
- 胶囊碰撞体(Capsule Collider)
一个物体上可以同时挂载多个碰撞体组件,这样就形成了组合碰撞体
组合碰撞体是一个Unity术语,不是一个组件。指的是一个物体挂载了多个碰撞体组件或该物体具有多个碰撞体的子物体。子物体所挂载的碰撞体组件,也会成为父物体物理外形的一部分。
在模拟外形复杂的物体时,建议多添加几个子物体来表示物理外形,因为用子物体方便单独控制偏移和旋转。但要注意,只在父物体上挂载一个刚体组件,子物体上不要挂载刚体组件。
四、物理材质Physics Materials
必须模拟碰撞体表面材质的特性,这样碰撞体之间发生交互时才能正确模拟实际的物理效果
可以设置摩擦系数、弹性等表面特性
五、触发器Trigger
碰撞体会默认阻挡刚体运动。如果想要检测两个物体是否接触,又不引起物理上的实际碰撞,就需要勾选碰撞体组件的Is Trigger属性,使其变成一个触发器
当一个碰撞体进入了触发器的范围,就会调用脚本的OnTriggerEnter()方法。但要注意,两个物体中至少有一个带有刚体组件(可以是动力学刚体),否则无法触发脚本。
六、碰撞体的分类
对于包含了碰撞体组件的物体来说,物体上是否具有刚体,以及刚体组件上动力学设置的不同,都会使物体的物理碰撞特性发生变化。根据这些特性,对碰撞体进行分类。
1、静态碰撞体Static Trigger
没有挂载刚体的碰撞体。静态碰撞体通常用于制作关卡中固定的部分,例如地形、障碍物等。
2、刚体碰撞体Rigidbody Collider
挂载了普通刚体组件的碰撞体。物理引擎会一直模拟计算刚体碰撞体的物理状态,因此刚体碰撞体会对碰撞以及脚本施加的力做出反应
3、动力学刚体碰撞体Kinematic Rigidbody Collider
挂载了刚体组件且刚体组件设置为动力学刚体的碰撞体。可以在脚本中直接修改动力学刚体碰撞体的位置来移动它,不会对碰撞、力和速度的变化做出反应。
触发器的分类与碰撞体类似,不再说明
七、碰撞事件表
碰撞事件表
| 静态碰撞体 | 刚体碰撞体 | 动力学刚体碰撞体 |
静态碰撞体 |
| ✔️ |
|
刚体碰撞体 | ✔️ | ✔️ | ✔️ |
动力学刚体碰撞体 |
| ✔️ |
|
触发事件表
| 静态碰撞体 | 刚体碰撞体 | 动力学刚体碰撞体 | 静态触发器 | 刚体触发器 | 动力学刚体触发器 |
静态碰撞体 |
|
|
|
| ✔️ | ✔️ |
刚体碰撞体 |
|
|
| ✔️ | ✔️ | ✔️ |
动力学刚体碰撞体 |
|
|
| ✔️ | ✔️ | ✔️ |
静态触发器 |
| ✔️ | ✔️ |
| ✔️ | ✔️ |
刚体触发器 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
动力学刚体触发器 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
小结:
- 有刚体碰撞体才会碰撞
- 只有两个都是静态的才不会触发。
八、层Layer
与标签(Tag)类似,每个物体也可以属于一个"层"。将不同物体安排在不同的层上,并指定哪些层之间不能碰撞,就可以巧妙地完成目的。
可在Unity主菜单的Edit->Project Settings->Physice中找到层碰撞矩阵。层碰撞矩阵左边和上边都是所有层的名称,勾选表示对应两层会发生碰撞。
九、物理关节
关节(Joints)特指一种物理上的连接关系。它总是限制一类运动的自由度,允许另外一类运动的自由度。
Unity提供了很多不同类型的关节。下表列了一些3D场景中的关节
物理关节 | 组件 | 简介 |
固定关节 | Fixed Joint | 用于固定连接两个物体,不可滑动或旋转。例如可以表现黏住、抓住物体 |
铰链关节 | Hinge Joint | 连接的两个物体可以以关节为中心循转,例如屋门 |
弹簧关节 | Spring Joint | 用弹簧连接两个物体,两者太近或太远都会受到弹簧的回复力。可以用弹性(Spring)和阻尼(Damper)调节弹簧的弹性 |
人物关节 | Character Joint | 专门用来制作任性角色的关节连接。一般用于表现游戏中无生命的人形角色随外力运动的效果。由于配置复杂,需要使用Ragdoll工具辅助制作 |
十、射线检测
"射线检测"十在游戏开发实践中不可或缺的一项技术。简单来说,它就是在游戏世界中发射一条虚拟的"射线",并观察该射线是否击中了某个物体,以及具体击中了该物体的哪个位置。虽然名字叫做"射线"(Ray),但实际发射的位置、方向和长度句可以根据实际需求来设置。不仅有直线的射线,还有球形射线、盒子射线等。所以射线检测中的"射线"可以看作有一定范围和oxide广义"射线"。
十一、角色控制器与物理系统
控制角色大体上有两种方法:
- 用脚本直接控制物体的位置和朝向
- 通过刚体施加力和改变速度来控制角色的行为
用刚体实现的优点在于工作量少,大部分处理都可以依赖物理系统完成。但缺点是角色可能被墙角卡住啊,因障碍物挤压被弹飞之类的,产生bug难以避免。
若不使用刚体,自己写脚本,有点事灵活性和可控性高,但缺点是工作量、难度较大。
相关文章:
Unity物理系统基本概念
前言:物理引擎仅仅是对现实物理的一种近似模拟。无论是从运算精度和时间连续性都不够准确。目的只是为了让游戏具备令人信服的物理表现,增强游戏的表现力和用户的沉浸感。 一、刚体Rigidbody 刚体是让物体产生物理行为的主要组件。一旦挂载了Rigidbody组…...

防止表单重复提交的几种方式,演示一个自定义注解方式的实现
防止表单重复提交的几种方式,演示一个自定义注解方式的实现 一、防止表单重复提交的几种方式方式一:Token 机制方式二:去重表(主要是利用 MySQL 的唯一索引机制来实现的)方式三:Redis 的 setnx方式四&#…...

《基于智能手机采集的PPG信号预测血管老化》阅读笔记
目录 一、论文摘要 二、论文十问 Q1: Q1论文试图解决什么问题? Q2: 这是否是一个新的问题? Q3: 这篇文章要验证一个什么科学假设? Q4: 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?…...

【大数据-调度工具】dolphinscheduler安装和遇到的问题
1.安装 安装步骤按照官网安装即可 官网:DolphinScheduler | 文档中心 (apache.org) 版本:3.1.5 2.踩坑记录 Q1.大文件无法上传 问题描述: 在资源中心中上传文件选择完大文件夹之后,选择确认之后确认按钮转了几圈圈之后就没…...
滑动轨迹生成的思路和代码分享-测试可过极验 90%机率
如有技术侵权、可联系本人下架 由于极验采用人工智能的方式对滑动的轨迹进行的验证,因此如果我们比较随意的生成鼠标滑动轨迹基本是肯定被封的,因此我们要详细分析一下鼠标轨迹的规律, 通之前介绍的调试手段,手工滑动滑块,获取到鼠标滑动轨迹的集合数组如下: [[-37,-41…...

【Linux】项目自动化构建工具make/makefile
🏖️作者:malloc不出对象 ⛺专栏:Linux的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、make/makefile的背景二、…...
【系分范文】论软件需求获取技术以及应用
目录 论题论题介绍论文要点理论素材准备范文摘要正文论题 论软件需求获取技术以及应用 论题介绍 软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。软件需求获取是一个确定和理解不同的项目干系人的需求和约束的过程。需求获取是否科学、准备充分,对获取…...
vue2.0中post请求
vue2.0中post请求 三种格式:在vue中axois的用法:1、 multipart/form-data类型2、 x-www-form-urlencoded类型3、 application/json类型 三种格式: ○ Content-Type:x-www-form-urlencoded ○ Content-Type:multipart/form-data ○ Content…...

MySQL双写缓冲区(Doublewrite Buffer)
本文已收录至Github,推荐阅读 👉 Java随想录 文章目录 摘要为什么需要Doublewrite BufferDoublewrite Buffer原理Doublewrite Buffer相关参数总结 摘要 InnoDB是MySQL中一种常用的事务性存储引擎,它具有很多优秀的特性。其中,Dou…...

免费开源的Umi-OCR 文字识别工具
大家好,我是小寻,欢迎关注公众号:工具优选,免费领取优质项目源码和常用工具,还可以加入我的交流群! 如今,在日常生活和工作中,我们经常需要捕捉屏幕截图并识别其中的文本信息。比如别人给你发资料时直接发…...
如何让微信小程序弹窗滚动条设置在最上面
最近发现一个事情搞得很烦,微信小程序的弹窗内容可以滚动的时候,要保证每一次打开都在最上面,研究了一下终于发现了怎么解决 第一步 首先得把你的弹窗里面的内容用scroll-view标签包起来,像这样 <scroll-view style"hei…...

c语言-指针
指针详解 这段时间在看 Linux内核,深觉C语言功底不扎实,很多代码都看不太懂,深入学习巩固C语言的知识很有必要。先从指针开始。 什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组&…...

Jenkins集成SonarQube实现代码质量检查
文章目录 一、前提配置1.1 安装及配置SonarQube Scanner插件1.2 配置SonarQube servers 二、非流水线集成SonarQube1.1 配置非流水线任务 三、流水线集成SonarQube 一、前提配置 1.1 安装及配置SonarQube Scanner插件 (1) 点击【系统管理】>【插件管理】>【可选插件】搜…...

2023 谷歌I/O发布会新AI,PALM 2模型要反超GPT-4,一雪前耻!
文章目录 1 前言2 Google I/O 发布者大会3 PaLM 2模型3 Bard项目4 其他AI工具4.1 AI 图片编辑 Magic Editor4.2 Duet AI 办公4.3 Universal Translator 翻译工具4.4 Google 沉浸式导航4.5 Google 搜索引擎 5 讨论 1 前言 每年必看两大会,苹果发布会和谷歌发布会&am…...

MySQL和Redis如何保证数据一致性?
前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用,在读取缓存这方面基本都是一致的,大概都是按照下图的流程进行操作: 但是在更新缓存方面,是更新完数据库再更新缓存还是直接删除缓存呢?又或者是先删除缓存再…...
Markdown使用(超详细)
(HBuilderX) 掌握md及HBuilderX对md的强大支持。如果没有点右键设置自动换行,可按Alt滚轮横向滚动查看。 很多人只把markdown用于网络文章发表,这糟蹋了markdown。 markdown不止是HTML的简化版,更重要的是txt的升级版…...
yolov5实现扑克牌识别的产品化过程
文章目录 介绍项目下载硬件准备软件环境素材获取自行获取素材网盘获取图片标注模型训练窗口截图窗口截图(HWND)桌面截图wgc方法最终采用的方式WGC使用方法如何保存灰度图片python 如何加载dll库图片推理扑克牌逻辑ui编写模型加密软件授权软件加密软件打包安装包制作...

第07讲:Java High Level Client,读写 ES 利器
SkyWalking OAP 后端可以使用多种存储对数据进行持久化,例如 MySQL、TiDB 等,默认使用 ElasticSearch 作为持久化存储,在后面的源码分析过程中也将以 ElasticSearch 作为主要存储进行分析。 ElasticSearch 基本概念 本课时将快速介绍一下 E…...
dockerfile暴力处理配置文件外提
前言: 一般来说,springboot打成的jar运行时,同目录/config目录下放application.yml文件会被进行加载,然后通过设置docker映射出宿主机即可做到配置文件外配的效果,但很多时候别的配置文件做不到这种效果,说…...
如何快速给出解释——正交矩阵子矩阵的特征值的模必然不大于1
Memory 首先快速回忆一下正交矩阵的定义: A为n阶实矩阵,且满足A‘AE或是说AA’E,那么A为正交矩阵。 (啊,多么简洁的定义) 其次快速想到它的性质: ① 实特征值必然 或 其他复数…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...