Unity3D教程:简单的碰撞检测

Posted 小小姑娘很大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D教程:简单的碰撞检测相关的知识,希望对你有一定的参考价值。

需求:当立方体Cube碰到地面Plane的时候,输出碰撞物体的名称,则表述检测到立方体碰撞了地面。

1.搭建一个简单的场景。

在新的工程中选择File->new Scene创建新的场景。然后在该场景中添加地板:GameObject->Create Other->Plain,以及正方体:GameObject->Create Other->Cube。给正方体添加刚体:Component->Physics->Rigidbody。添加后可以设置刚体属性。在Project处右击,选择Import Package->Physic Matarials。引入完成后可以直接把材质拖动到Hierachy窗口的组件中。

bouncy:弹力十足的蹦蹦跳跳型。

ice:像冰块一样碰撞。

metal:像金属一样碰撞。

rubber:像橡胶一样碰撞。

wood:像木头一样碰撞。

然后在“Hierarchie”面板中单击表示地板的组件,然后在Inspector中给它命名为“Ground”,调整他们的位置大约像这样:

Unity3D教程:简单的碰撞检测

2.创建脚本文件添加监听。

选择Assets->Create->javascript,创建JS文件并且重命名为“CollisionTest”。在Project窗口中双击它,Unity会启动Monodevelop来编辑js文件。清除里面默认创建的代码。Unity3D教程手册。写上:

function OnCollisionEnter(obj:Collision) Debug.Log("Collider:"+obj.collider.name+" gameObject:"+obj.gameObject.name);

onCollisionEnter函数解释:这个函数是在被绑定的物体与其他物体发生碰撞的时候被调用。

obj参数解释:被撞的物体参数,类型是Collision,在本例中就是“Ground”。

携带变量gameObject,是我们碰撞的物体。

3、将脚本文件拖到立方体上实现绑定

在“Project”面板中选中collision.js脚本,按住鼠标左键不放,直接拖入“Hierarchie”面板中,放到Ground上,松开鼠标即完成绑定。可以在右边的Inspetor面板查看相关内容。

Unity3D教程:简单的碰撞检测

现在可以运行该程序了,运行后在界面左下角会输出:Collider:Cube gameObject:Cube。至此一个简单的碰撞检测便完成了。

使用向量进行简单的 2D 碰撞检测

【中文标题】使用向量进行简单的 2D 碰撞检测【英文标题】:Simple 2D collision detection with vectors 【发布时间】:2012-04-13 16:16:44 【问题描述】:

我正在尝试创建碰撞算法并在我的 Win32 2D GUI 应用程序中实现他。 任务是我得到一个向量来确定 .bmp 图像的中底,以及另外四个位于菱形位置的向量。我想让它工作,以便算法知道图像是来自左、右、上还是下。互联网上有很多关于矩形、圆形和距离计算的碰撞检测的教程,但我在将它们应用于菱形时遇到了困难。还有一种叫做axis-aligned bounding 的东西,但我认为它适用于 3d 矢量。当谈到这个话题时,我很弱,所以如果有任何熟练的 C++ 程序员可以指导我阅读一些提到这个话题的好电子书,或者如果代码很小,可以打出来。我尝试在 ABCD 整个菱形上进行 X、Y 坐标的迭代,结果惨遭失败。

感谢所有提供帮助的人。

【问题讨论】:

2 个问题:1) 这是作业吗? (如果是,那很好,但应该标记为homework)和2)到目前为止你尝试了什么? 轴对齐边界框(简称 AABB)对于 2d 和 3d 都很有用。这个想法是用一个简单的形状包围一个复杂的对象,以便于检查碰撞。然后,如果边界框发生碰撞,则无需检查内部复杂对象的所有细节。你仍然需要编写代码来碰撞真实对象——但它不需要每帧运行数千次...... 是的。抱歉没有标记为作业,这个网站对我来说是新的。我知道如何为矩形和圆形做碰撞,那是以前的作业。除此之外,我尝试进行像素完美碰撞,但后来我意识到在我当前的代码中实现它会更加困难。 【参考方案1】:

我不是计算机图形方面的专家,但通常你的问题归结为确定一个点是否在凸多边形内。

为此,我将使用以下简单技术。有一个称为向量积的函数,它有助于确定从一个向量到另一个向量的旋转方向是正还是负。因此,您检查点 X 是否在由多边形 A_1、A_2、...、A_n 形成的菱形内只是检查所有向量积 (A_iA_i+1, A_iX) 是否具有相同的符号。

向量 (x1, y1) 和 (x2, y2) 的向量积定义为 x1 * y2 - x2 * y1。

现在,您的检测过程如下:如果之前的位置在多边形外部,而当前位置在多边形内部,那么点已经击中多边形。为了确定哪一侧被交叉,您只需检查向量积 (A_iA_i+1, A_iX) 的哪些符号自上次位置更新以来发生了变化。

【讨论】:

对不起。我不太确定我是否理解 (A_iA_i+1, A_iX) 循环中的内容。 @Marko: A_iA_i+1 是从A_i 开始到A_i+1 结束的向量,A_iX 同样是:从A_iX 的向量。接下来,您需要计算这些向量的向量积。您正在为所有可能的i 执行此操作。然后检查产​​品的所有标志是否相同。

以上是关于Unity3D教程:简单的碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

[Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放

Unity3d碰撞检测中碰撞器与触发器的区别

Unity3D_(API)射线检测

Unity3D游戏开发之简单的碰撞检測

unity3d碰撞器检测碰撞跟触发器检测碰撞哪个好些

unity3d 碰撞检测