Questions tagged «collision-detection»

碰撞检测是确定两个或多个实体在游戏过程中是否相互接触。


1
什么时候四叉树优于空间散列?
我正在同时制作具有很多对象的2d平台游戏。它们都是AABB碰撞检测到的。我首先尝试使用四叉树来减少要检查的对象的数量,尝试了几种不同的配置,但事实证明它并没有达到我所需要的效果。我实现了空间哈希,而且效率更高,每次碰撞要检查的对象数量大大减少了。 是否存在使用四叉树进行2d碰撞检测优于空间散列的情况?根据我的测试,似乎空间散列总是以较少的要测试碰撞的对象结束? 我尚未对算法进行计时,但是例如在C语言中进行编码时,哈希只是非常昂贵或难以实现吗?值得一提的是,我使用javascript编写游戏,其中的哈希是“免费”的。 这是比较,我是否忽略了某些内容?http://zufallsgenerator.github.io/2014/01/26/visually-comparing-algorithms/

2
如何防止光线投射的车轮侧滑?
我一直在使用本文作为参考来编写一个非现实的汽车物理引擎作为学习练习。 我有一辆可以正确地与地形碰撞并为每个车轮施加正确的悬架力的汽车。我的下一个问题是防止车轮横向移动。例如,如果我将汽车停在斜坡上,它将在斜坡上向侧面滑动,然后再从侧面停止滑动(因为没有任何形式的摩擦)。 链接的文章说,必须施加“侧向力”,再加上向前的力,但它掩盖了该侧向力的计算方式。 给定每个车轮的碰撞信息(相交法线等)以及有关汽车刚体的信息,如何计算施加到刚体上的适当侧向力以防止侧向运动?

4
使玩家平稳地上楼梯
我有一个2D平台游戏,其中玩家始终向右行驶,但是地形并不总是水平的。例: 我实现了一个边界框碰撞系统,该系统仅检查与玩家框和其他方块的交点,以防止遇到大方块时玩家无法奔跑,因此必须跳下去,但是当我上楼梯时,我希望他就像他在水平地面上一样平稳运行。使用碰撞系统,您必须跳楼梯才能通过! 我考虑过要在楼梯的边缘之间生成一条线,并在那条线上强加玩家移动……您如何看待?还有更聪明的事情吗?

2
我该如何使好人攻击只击中坏人,反之亦然?
我的游戏有许多不同类型的好人和许多不同类型的坏人。他们都将向对方发射弹丸,但我不希望任何对准都会发生意外附带损害。因此,坏人不应该打/伤害其他坏人,好人不应该打/伤害其他好人。 我想解决此问题的方法是通过使其Unit实例(这是javascript,btw)具有alignment可以为goodor 的属性bad。而且我只会让碰撞发生 class Attack boolean didAttackCollideWithTarget(target) return attack.source.alignment != target.alignment and collisionDetected(attack.source, target) 当然,这是伪代码。 但是我之所以问这个问题,是因为我觉得除了在Unit类中添加另一个属性之外,还有一种更优雅的方法来设计它。

1
为什么Unity的OnCollisionEnter不能给我表面法线,最可靠的方法是什么?
Unity的on碰撞事件为您提供了Collision对象,该对象为您提供了有关发生的碰撞的一些信息(包括具有击中法线的ContactPoints列表)。 但是您不会得到的是所命中的对撞机的表面法线。这是说明的屏幕截图。红线来自ContactPoint.normal,蓝线来自RaycastHit.normal。 这是Unity隐藏信息以提供简化API的实例吗?还是标准的3D实时碰撞检测技术只是不收集这些信息? 对于问题的第二部分,确保碰撞产生表面法线的方法是一种肯定有效且相对有效的方法? 我知道射线投射可以为您提供表面法线,但似乎我需要针对所有场景进行多次射线投射才能做到这一点(也许接触点/法线组合在第一次投射时错过了对撞机,或者您可能需要对所有物体进行平均接触点的法线以获得最佳效果)。 我目前的方法: 备份Collision.contacts[0].point其正常命中 对播放正常的否定命中的光线float.MaxValue,Collision.collider 如果失败,请对非负法向重复步骤1和2。 如果失败,请尝试执行步骤1至3 Collision.contacts[1] 重复4,直到成功或直到所有接触点耗尽为止。 放弃,返回Vector3.zero。 这似乎可以捕获所有内容,但是所有这些射线广播都使我感到不安,并且我不确定如何在足够的情况下测试这种方法是否奏效。有没有更好的办法? 编辑 如果这确实是3D冲突的处理方式,那么在一般情况下为什么要概述为什么与Unity特有的东西一样受欢迎。

2
Microsoft XNA Platformer示例,是否正确实施了碰撞检测?
Microsoft提供的示例似乎(从我所看到的)碰撞检测将有一个小错误。当用户与不可通过的图块碰撞时,将计算相交的深度。深度值X和Y中较小的一个用于固定用户的位置,因此它不再与图块碰撞。但是,如果用户沿对角线行驶,这是否可能导致用户无法准确地到达角色首先与图块发生碰撞的位置? 我可能是错的,但这只是我的看法。 private void HandleCollisions() { // Get the player's bounding rectangle and find neighboring tiles. Rectangle bounds = BoundingRectangle; int leftTile = (int)Math.Floor((float)bounds.Left / Tile.Width); int rightTile = (int)Math.Ceiling(((float)bounds.Right / Tile.Width)) - 1; int topTile = (int)Math.Floor((float)bounds.Top / Tile.Height); int bottomTile = (int)Math.Ceiling(((float)bounds.Bottom / Tile.Height)) - 1; // Reset …

3
在慢动作中显示碰撞是否在计算上令人放松?
在许多赛车游戏(例如Burnout Paradise)中,当碰撞将要发生时,游戏会自动切换为慢动作并以缓慢的顺序进行,直到碰撞完成为止。 我一直以为这是为了效果。您不想错过任何碰撞!但是我的一位朋友最近建议这样做是为了确保在发生碰撞时不需要过多的处理速度。 现在我认为这实际上是相反的。当发生碰撞时,慢动作中会显示很多细节,我确信计算和渲染管道会产生开销。 什么是对的? 慢动作场景会增加还是减少CPU / GPU使用率?


3
如何实现快速,准确的2D碰撞检测?
我很清楚如何检测两个或多个2D对象是否碰撞,但是我对如何决定是否检查碰撞感兴趣。在以前的项目中,我只是让每个对象都与其他每个对象进行检查(我知道,O(n ^ 2)级的愚蠢程度),并且创建的游戏性不那么流畅。 各种论坛都赞扬四叉树,B树以及您能想到的任何其他种类的树或结构的伟大之处。 确定是否应检查碰撞的最有效结构是什么?

5
空间散列和四叉树的2D空间分区替代方案
我一直在尝试在游戏中实现空间分区算法,但是空间散列和四叉树都不是我想要的。 我的级别大小不应该有限制(只有Int32限制)。我需要一个不需要“水平宽度”和“水平高度”的空间分区算法。 我有许多移动的物理对象。我需要算法足够快以支持500多个对象。 还有其他选择吗?



3
等距碰撞检测
我在尝试检测两个等距图块的冲突时遇到了一些问题。 我尝试在图块上的每个点之间绘制线,然后检查线截距,但是这行不通(可能是由于公式错误) 经过一段时间的研究,我相信我正在考虑很多,而且必须有一种更简单的方法。 我不是在寻找代码,只是一些建议以最佳方式实现重叠检测

1
圆线碰撞检测问题
我目前正在开发一个突破克隆,我遇到了障碍,无法正确检测球(圆)和砖(凸多边形)之间的碰撞。我正在使用“圆线碰撞检测”测试,其中每条线代表凸多边形砖上的边缘。 在大多数情况下,Circle-Line测试可以正常工作,并且可以正确解决碰撞点。 碰撞检测正常工作。 但是,有时候我的碰撞检测代码由于球实际上与砖相交时的负判别而返回false。 碰撞检测失败。 我知道这种方法的效率低下,并且使用了轴对齐的边界框来减少测试砖的数量。我主要关心的是下面的代码中是否存在任何数学错误。 /* * from and to are points at the start and end of the convex polygons edge. * This function is called for every edge in the convex polygon until a * collision is detected. */ bool circleLineCollision(Vec2f from, Vec2f to) { Vec2f lFrom, …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.