第二十六章 碰撞体Collision(上)

news2024/10/2 12:32:10

在游戏世界中,游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如,攻击怪物则是主角与怪物的碰撞,触发机关则是主角与机关的碰撞。在DirectX课程中,我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复杂的,我们不可能按照模型的原始形状进行两者之间的碰撞检测,而是将模型看做近似的立方体或者球体来进行碰撞检测,虽然这种形式的检测精度不是很高,但是对于一般的游戏体验来讲,已经足够了。

在Unity中碰撞体分为:盒型碰撞体、球形碰撞体和胶囊碰撞体,还有一个网格碰撞体。当然,我们还可以将任意数量的上述碰撞体添加到单个游戏对象以创建复合碰撞体。复合碰撞体可以更加贴近的模拟游戏对象的形状,同时保持较低的性能开销。复合碰撞体一般用于父子化的游戏对象,并且根游戏对象上应该只使用一个刚体组件。在某些情况下,如果复合碰撞体也不够准确。我们才可以使用网格碰撞体精确匹配游戏对象网格的形状。网格碰撞体需要更高的性能开销,因此请尽量不要在游戏中大量使用。此外,网格碰撞体之间无法进行碰撞检测,只能是简单的盒型或球形碰撞体与网格碰撞体进行碰撞检测。

接下来,我们创建一个新的场景“SampleScene2.unity”来演示碰撞体的使用。

我们在一个平面上面添加两个球体,默认情况下,创建的球体会自动添加球形碰撞体。

 

如上图所示中的“Sphere Collider”球形碰撞组件,为了能够让我们左边的黄色球体Sphere2产生运动,我们需要添加一个刚体,如下所示:

此时,我们的黄色球体Sphere2同时具备了碰撞体和刚体两个组件。接下来,我们给黄色球体施加一个力,让其能够向右运动去撞击紫色的球体Sphere1。

我们增加了一个X轴方向的数值为2的力。接下来,我们就运行这个工程来查看效果:

我们发现,当黄色球体接触到紫色球体的时候,就静止不动了。我们暂时不解释这个结果。我们上面提到过,球体是自动添加球形碰撞体的,也就是说,我们的紫色球体上面有一个球形碰撞体(没有刚体)。我们取消紫色球体上面的球形碰撞体,在重新运行这个工程。

 

我们发现,黄色球体会穿过紫色球体继续向右运动下去。从紫色球体的表现,我们可以看出碰撞体组件最明显的表现就是不会让对方游戏对象穿透(也叫穿模)。接下来,我们将黄色球体的碰撞体组件也取消掉(同时取消刚体Use Gravity属性,防止重力影响掉落平面以下),也就是说两个球体都没有碰撞体组件了。如果我们再次运行工程的话,就会发现黄球依然穿透紫球。那么,我们恢复紫球的碰撞体组件呢?我们再次运行工程,就会发现黄色再次穿透紫球了。最后的结论就是,两者都具备碰撞体组件的时候,才会发生碰撞检测。这个道理非常简单,熟悉我们DirectX课程的应该知道,碰撞检测的本质就是两个碰撞模型进行相互包含计算,因此碰撞双方都必须具备碰撞体,否则没办法进行检测计算。

接下来,我们就来介绍一些碰撞体组件的参数。

首先是Edit Collider按钮,点击这个按钮,可以让我们可视化的调整碰撞体的尺寸。

点击线框连接点,拖动就可以修改碰撞体的大小,同时在Inspector检视面板中看到

上图中的中心点的Y值和半径Radius值就随之改变了。对于圆形来讲,只需要圆心和半径就能确定它的大小了。这一点应该很容易理解。当然我们还可以通知修改数值改变大小。

Is Trigger是一个触发选项,后面我们会详细介绍它。

Material代表物理材质。当碰撞体相互作用时,它们的表面需要模拟所应代表的材质的属性。例如,一块冰将是光滑的,而橡胶球将提供大量摩擦力并且弹性很好。虽然碰撞时碰撞体的形状不会变形,但可以使用 Physics Materials(物理材质)配置碰撞体的摩擦力和弹力。

Center就是碰撞体的中心,默认X/Y/Z都是0,等效于于局部坐标系原点。

Radius是圆形碰撞体的半径大小,默认值是0.5。

如果是盒型碰撞体的话,这里应该是Size属性,其X/Y/Z代表盒性的长宽高。

如果是胶囊碰撞体的话,这里应该是Radius和Height,以及Direction三个属性。其中Radius代表胶囊体的半径,Height代表胶囊体的高度,而Direction则是局部空间中纵向方向的轴,默认是Y轴。胶囊体通常用来模拟“人形”形状进行碰撞检测,因此多用于人物角色上。

我们使用碰撞体的时候,最重要的注意点就是,让碰撞体的尺寸能够恰当的包裹住我们的模型。因为我们是在Unity上创建的球体,而Unity会根据球体的尺寸自动匹配添加球型碰撞体。因此,球体模型和球型碰撞体的尺寸是非常吻合的。但是,如果是我们自己手动导入的FBX格式的3D模型,Unity就不能保证碰撞体能够恰当的包裹住3D模型了。碰撞体能够恰当的包裹3D模型非常的重要,这个将直接决定我们游戏中模型之间的碰撞检测,因为碰撞体是不可见的,我们只能通过模型与模型的距离来检查是否发生碰撞。但是我们自己都很明白,模型与模型的距离并不代表碰撞体与碰撞体之间的距离。如果模型与碰撞体不能恰当的包裹,那么我们可能在视觉上产生很大的差异,影响游戏体验。

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

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

相关文章

生成模型经典算法-VAEGAN(含Python源码例程)

生成模型 文章目录 生成模型1. 概述2. 生成模型典型结构-VAE&GAN2.1 VAE2.1.1 简介2.1.2 模型处理流程 2.2 GAN2.2.1 简介 2.2.2 生成对抗网络要点2.2.3 生成对抗网络的训练准则2.2.4 生成对抗网络模型处理流程 3.生成模型和判别模型在AIGC中的应用3.1 生成模型在AIGC中的应…

【SQL】面试篇之排序和分组练习

1587 银行账户概要 II 1587题目 # Write your MySQL query statement below select name, balance from (select u.account, name, sum(amount) as balancefrom Users uleft join Transactions ton u.account t.accountgroup by u.account ) temp where balance > 10000总…

给定一个文本文件,每行是一条股票信息,写程序提取出所有的股票代码

问题:给定一个文本文件,每行是一条股票信息,写程序提取出所有的股票代码。其中,股票代码规则是:6 位数字, 而且以.SH 或者.SZ 结尾。 文件内容示例: 2020-08-08;平安银行(000001.SZ);15.55;2940…

( 数组和矩阵) 645. 错误的集合 ——【Leetcode每日一题】

❓645. 错误的集合 难度:简单 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了…

教你如何快速安装下载EasyRecovery16最新版本

最近辛辛苦苦写的PPT报告被手残的我一个不小心给删除了,本来在空调屋里懂得瑟瑟发抖的我瞬间后背就被汗水浸湿了,好在懂点计算机知识,没有继续乱操作,在使用EasyRecovery后很快就找回来了! EasyRecovery 16(有几个版本…

Git(六):基本命令(3):储藏、标签、拉取、子模块

目录 17、stash 储藏 17.2 描述 17.3 基本用法 18、tag 标签 18.1 描述 18.2 基本用法 19、fetch 获取 19.1 描述 19.2 基本用法 20、pull 整合 20.1 描述 20.2 基本用法 20.3 pull 与 fetch 的区别 21、push 更新推送 21.1 描述 21.2 基本用法 22、remote 管…

Vue性能优化

目录 Vue性能优化的必要性:Vue项目优化工具webpack-bundle-analyzerwebpack-bundle-analyzer作用:webpack-bundle-analyzer用法:webpack-bundle-analyzer运行:webpack-bundle-analyzer使用: vue项目性能优化代码模块化…

Tensorflow入门图像分类-猫狗分类-安卓

最近在温习 Tensorflow,写了一篇笔记,记录了使用 Tensorflow 训练一个猫狗图像分类器的模型并在安卓应用上使用的全过程。 一、数据集准备 1.1 数据集来源 我采用的是微软的猫狗数据集,链接:Download Kaggle Cats and Dogs Datas…

2023华中杯数学建模C题完整模型代码

已完成全部模型代码,文末获取。 摘要 随着工业化和城市化的快速发展,空气污染已经成为全球性的环境问题。细颗粒物(PM2.5)等污染物对人类健康、生态环境和社会经济造成了严重影响。本研究旨在深入探究影响PM2.5浓度的主要因素&a…

【Android入门到项目实战-- 8.4】—— 如何解析JSON格式数据

目录 一、准备工作 二、使用JSONObject 三、使用GSON 比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量,但缺点是语义性较差,看起来不直观。 一、准备工作 还是使用前面文章的方法,在服务器…

【C++】STL标准库之vector

STL标准库之vector vector类的简介常用的vector类的接口构造容量遍历及访问增删查改迭代器迭代器失效问题 vector类的简介 vector是大小可变数组的序列容器,与string相比,vector中可以存任何类型的数据,而string中存储的只能是字符类型。 因为…

第二十九章 使用消息订阅发布实现组件通信

PubSubJS库介绍 如果你想在React中使用第三方库来实现Pub/Sub机制,PubSubJS是一个不错的选择。它是一个轻量级的库,可以在浏览器和Node.js环境中使用。 PubSubJS提供了一个简单的API,可以让你在应用程序中订阅和发布消息。你可以使用npm来安…

大数据Doris(十):Doris基础介绍

文章目录 Doris基础介绍 一、基本概念 二、建表语法及参数解释 1、column_definition_list 2、index_definition_list 3、engine_type 4、key_type 5、table_comment 6、partition_desc 7、distribution_desc 8、rollup_list 9、properites 三、数据类型 Doris基础…

java合并数组的方法

在 Java中,数组是一种重要的数据结构,在 Java中数组的操作方式有两种,一种是直接使用数组来操作,另一种是通过引用计数或者双指针对数组进行操作。对于直接使用数组来操作的方式,我们可以通过两个方法来实现。 一种是将…

C++(多态中)

目录: 1.多态实现原理(再剖析) 2.析构函数加virtual 3.C11新增两个关键字 override 和 final 4.重载、覆盖(重写)、隐藏的对比 5.抽象类 1.多态实现原理(再剖析) 实现出多态的效果,我…

Docker之Docker Compose技术

目录 一、什么是docker compose? 二、安装docker compose 三、使用案例:部署一个简单的fastapi服务 (以下教程是基于环境已将安装了docker服务) 一、什么是docker compose? Compose是一个将多个docker容器组合部署的技术,能通过编写yaml配置文件…

IJCAI2023 | A Systematic Survey of Chemical Pre-trained Models(化学小分子预训练模型综述)

IJCAI_A Systematic Survey of Chemical Pre-trained Models 综述资料汇总(更新中,原文提供):GitHub - junxia97/awesome-pretrain-on-molecules: [IJCAI 2023 survey track]A curated list of resources for chemical pre-trained models 参考资料&…

『python爬虫』09. bs4实战之下载精美壁纸(保姆级图文)

目录 爬取思路代码思路1.拿到主页面的源代码. 然后提取到子页面的链接地址, href2.通过href拿到子页面的内容. 从子页面中找到图片的下载地址 img -> src3.下载图片 3. 完整实现代码总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏&…

docker 非持久化存储 tmpfs mounts

docker 非持久化存储 tmpfs mounts 简介tmpfs mounts 限制--tmpfs 和 --mount 之间的差异在容器中使用 tmpfs mounts指定 tmpfs 选项 简介 官方文档:https://docs.docker.com/storage/tmpfs/ 与 volume 和 bind mounts 不同,tmpfs mounts 是临时的&…

jdk中juc多线程编程工具

jdk线程池实现原理分析 目录 CompletionService CompletableFuture 基本原理 CompletableFuture的接口 静态方法 handle() vs whenComplete() xxxEither() 异常处理exceptionally() 获取任务结果 结束任务 Semaphore CyclicBarrier CountDownLatch jdk线程池实…