Questions tagged «collision-detection»

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

9
有没有一种简单的方法可以阻止敌人站在同一地点?
所以:自上而下的游戏,我的敌人追赶玩家,当他们在一定距离之内时便站着不动并开火。如果它们都来自同一方向,则它们最终都将站在同一位置(即彼此“站在”内部),因为我目前不在敌人之间进行碰撞检测-它们可以自由越过彼此。 解决这个问题的简单方法是什么?某种形式的碰撞检测还是某种方式?

6
如何优化距离功能?
在开发一款相当简单的类似RTS的游戏时,我注意到我的距离计算正在影响性能。 在任何时候,都会进行距离检查,以了解一个单位是否在其目标范围内,射弹是否已达到其目标,玩家是否跑过了皮卡,常规碰撞等。列表继续进行,并检查两点之间的距离经常使用。 我的问题就是这个。我想知道除了常规的sqrt(x * x + y * y)方法以外,游戏开发人员还有哪些替代方法可以检查距离,如果我们每帧执行数千次,这将非常耗时。 我想指出的是,我了解了曼哈顿的距离和平方的距离比较(通过跳过sqrt瓶颈)。还要别的吗?

5
碰撞解决
我非常了解如何检查碰撞,但是我不知道如何以良好的方式处理碰撞。 简化,如果两个对象发生碰撞,我将使用一些计算来更改速度方向。如果我不移动这两个对象,它们将仍然重叠,并且如果速度不够大,它们在下次更新后仍将碰撞。这可能导致对象彼此卡住。 但是,如果我尝试移动两个对象以使其不重叠,该怎么办。这听起来是个好主意,但我已经意识到,如果有两个以上的对象,这将变得非常复杂。如果我移动两个对象并且其中一个与其他对象发生碰撞该怎么办,所以我也必须移动它们,并且它们可能与墙壁发生碰撞等。 我有一个自上而下的2D游戏,但我认为这与它没有太大关系。通常如何处理冲突? 代表Wooh提出这个问题

4
如何处理2D中的角碰撞?
我正在写一个自上而下的2D XNA游戏。自从我第一次上学以来,我一直在尝试自己编写物理学和碰撞学知识。 每当我的玩家精灵角色试图移动到其边界与墙的边缘相交的位置时,我都会计算出反弹角(入射角=反射角),并让玩家反弹出墙并避免碰撞。 我很难弄清楚如何处理我的精灵同时与两个墙边相交的情况,尽管它碰到了一个角落。 我的代码当前告诉我,两个墙的边缘已经相交,但是没有碰到哪个边缘,因此没有反弹。 选择哪个边缘反弹的数学测试是什么?看到它的时候很简单,但是我正在努力寻找它的数学测试。

4
我的物理引擎中更新问题的动量和顺序
这个问题是我上一个问题的“后续”问题,涉及到碰撞检测和解决,您可以在这里找到。 如果您不想阅读上一个问题,这里是有关我的物理引擎如何工作的简短描述: 每个物理实体都存储在称为SSSPBody的类中。 仅支持AABB。 每个SSSPBody存储在一个名为SSSPWorld的类中,该类更新每个身体并处理重力。 每帧,SSSPWorld都会更新每个身体。 每个更新的实体都在空间哈希中查找附近的实体,检查是否需要检测与它们的碰撞。如果是,它们将调用“碰撞”事件并检查是否需要解决与其之间的冲突。如果是,他们将计算穿透矢量和方向重叠,然后更改其位置以解决穿透问题。 当一个物体与另一个物体碰撞时,只需将其速度设置为自己的速度即可将其速度传递给另一个物体。 如果从上一帧起未更改位置,则将物体的速度设置为0。如果它也与移动的物体(例如升降机或移动的平台)相撞,则会计算升降机的运动差,以查看物体是否尚未从其最后位置移动。 同样,当一个实体的所有AABB角与某帧中的某些内容重叠时,它会引发“压碎”事件。 这是我的游戏的完整源代码。它分为三个项目。SFMLStart是一个简单的库,用于处理实体的输入,绘制和更新。SFMLStartPhysics是最重要的类,其中SSSPBody和SSSPWorld类位于其中。PlatformerPhysicsTest是游戏项目,包含所有游戏逻辑。 而这是在SSSPBody类,评论和简化了“更新”的方法。如果您不想看整个SFMLStartSimplePhysics项目,则只能看一下。(即使这样做,您也应该看看它,因为它已被注释。) .gif显示两个问题。 如果将实体放置在不同的顺序中,则会发生不同的结果。左侧的板条箱与右侧的板条箱相同,只是以相反的顺序放置(在编辑器中)。 两个板条箱都应朝屏幕顶部推进。在左边的情况下,没有箱子被推进。在右边,只有其中之一是。两种情况都是意外的。 第一个问题:更新顺序 这很容易理解。在左侧的情况下,最上面的板条箱先于另一个板条箱被更新。即使底部的板条箱将速度“传递”到另一个板条,它也需要等待下一帧移动。由于它没有移动,因此底部木箱的速度设置为0。 我不知道如何解决此问题。我希望解决方案不依赖于“排序”更新列表,因为我觉得我在整个物理引擎设计中做错了什么。 主要的物理引擎(Box2D,Bullet,花栗鼠)如何处理更新顺序? 第二个问题:只有一个板条箱被推向天花板 我还不明白为什么会这样。“弹簧”实体的作用是将物体的速度设置为-4000,然后将其重新放置在弹簧本身的顶部。即使禁用重新定位代码,该问题仍然会发生。 我的想法是,当底部板条箱与顶部板条箱发生碰撞时,其速度设置为0。我不确定为什么会这样。 尽管有机会看起来像放弃第一个问题的人,但我在上面发布了整个项目的源代码。我没有任何东西可以证明这一点,但是相信我,我努力解决了这个问题,但是我找不到解决方案,并且我以前没有任何物理和碰撞方面的经验。我一直在努力解决这两个问题超过一个星期,现在我很绝望。 我认为如果不从游戏中剥离许多功能(例如,速度传递和弹簧),就无法找到解决方案。 非常感谢您花时间阅读此问题,如果您甚至想提出解决方案或建议,也要多谢。

6
碰撞100%避免实施
我绝对是游戏开发的初学者,而且我对避碰/解决冲突一无所知,在过去一周中,我是在该网站上或通过此网站学到的...因此,如果我要问的是什么,请立即纠正我。基于错误的假设/误解。我尽力弄清楚了,但是那句话对我来说仍然是新颖的。 车辆 在我的游戏中,我有可以自动行驶的车辆。它们被放置在3D空间中,它们的运动由许多变量决定,这些变量对于每个车辆而言都是不同的。这里感兴趣的一个主要是: 仅向前运动。 甲速度,可以最小和最大,但其min是之间变化不(甚至接近)零。 甲转向半径,其取决于从速度(更高的速度,更大的半径) 两个最大加速度(用于降低和增加速度) 目标 我的目标是实现某种能够100%准确避免碰撞的AI (即,我将确保车辆永远不会碰撞)。 设计 尽管我更喜欢将AI“车载”的想法(即每辆拥有自己的“防撞AI”的车辆,最终查询和/或向其他车辆发送消息),但我仍然可以在以下位置实现CA AI:中央层(向车辆调度命令)。 在大多数情况下,车辆仅需在任何方向上相互避开,但在某些情况下,它们将必须避免碰撞并朝着同一目标行驶 到目前为止我发现的东西以及被卡住的地方 在这个站点上其他问题中找到的许多链接中,我发现特别有用的链接有: 撞球之间的碰撞 避免意外碰撞 排队 虽然这三个链接以许多方式“打开了我的视线”,但我仍然不清楚如何在我的情况下使用该信息。特别是在第2条中,只有“尝试”才能防止冲突(但是冲突确实会不时发生)。虽然第3条有时需要停车以防止碰撞。 我还注意到的是,上面链接的避免碰撞算法使用线速度的“即时投影”来检查车辆是否在行驶中。我想知道这是否足以满足我的需要,或者是否必须以更现实的方式来投影我的位置(例如:如果我将60°转向右90°,则我应该计算其余位置的位置曲线的30°,然后假设是线性运动)。 最后,我特别担心僵局。换句话说:尽管世界上的车辆密度会很低,但我担心,如果一定数量的车辆向同一点汇合,一旦他们意识到自己正在碰撞,就不可能进行任何规避操作因为它将使车辆与其他碰撞路径碰撞。 题 我怎样才能达到我的“目标”?深入理解当然是非常值得赞赏的,但是与外部资源的链接也将有很大帮助(我肯定不是第一个遇到此问题的人,但是可能我使用了错误的关键字来搜索网络吗? ) 预先感谢您的帮助!

3
OBB与OBB碰撞检测
假设您有两个边界框对象,每个边界框对象都将框的当前顶点存储在矢量中,并且该对象的所有顶点都相对于公共轴旋转和平移。 这是一张图像来说明我的问题: 如果两个OBB重叠任何链接以帮助解释该问题的解决方案,我将如何解决?请不要太费解了...

7
如何检测2D平台游戏中被压扁的玩家?
我正在检查碰撞中是否有平台角色,如#1所示。红点是被检查的像素,灰线指示它们所属的轴。我喜欢以这种方式检查碰撞(相对于边界框)得到的结果。除了一个问题:挤压检测,其他所有功能都按我的意愿运行。 在以下图像中,浅蓝色框表示地面,橙色框表示对象,箭头表示移动方向。 检测玩家何时被压倒的简单解决方案是查看相对两侧的碰撞点是否都在触发。如果是这样,则说明玩家被压碎了。在#2中,您可以看到正常的暗恋场景。播放器已接地,顶部碰撞点与下落的物体相交。这触发了暗恋。 #3、4和5存在有问题的场景。在#3中,玩家正在朝向上移动的物体移动。右侧碰撞点撞击物体,导致碰撞并使玩家停止。 现在,如果对象继续向上移动并且玩家继续向右移动(如#4所示),则该对象清除玩家右侧碰撞点,然后玩家向右移动。但是现在,这样做的目的是使对象与顶部碰撞点相交,从而导致不必要的垂直挤压。 #5中显示了类似的情况。两个物体相距足够远,可以清除底部碰撞点,从而允许玩家跌倒,但不能超过允许侧面碰撞点清除的程度,从而导致不必要的水平挤压。 我一直在努力寻找解决方案,但是我提出的任何方案都没有特别有效,所以我想知道是否有人对解决这些问题有想法或见识。 为了消除一些混淆,红色碰撞点将位于精灵内,而灰线仅用于表示每个碰撞点的相关轴。例如,如果角色的精灵是一个简单的绿色方块,则拐点将如下所示:

2
碰撞检测逻辑应该放在哪里?
我正在开发一个小型2D游戏引擎。角色具有绘画方法,当前可以执行以下操作: 根据角色的速度等计算角色的新位置。 更新碰撞网格单元** 在新位置绘制角色 **我创建了一个碰撞网格以减少相交检查的次数 现在我想到的用于检测碰撞的基本算法是: For Each Character Check intersection with characters in surrounding 8 cells 我可以简单地将此代码放在paint方法中。但是,这是我预期的问题。 假设两个字符A和B位于碰撞网格中的相邻单元格中。现在,按照上述算法,在字符A的迭代中,它将检测到它与B碰撞。在字符B的迭代中,它将检测到它与A碰撞。 但是我有一个想法,当A检测到它与B发生碰撞时,应该通知B它与A发生碰撞。当有两个以上的actor发生碰撞时,这样可以节省很多比较。但我不确定如何处理。我认为应该检查游戏循环内的碰撞,而不是每个角色都检查碰撞。 这种方法正确吗?您如何处理此类问题?我自己想到了碰撞网格。碰撞网格逻辑还有其他选择吗?


7
如何使A *代理避免其他代理?
我正在图块地图上实现多代理A *算法。代理仅在X和Y轴上移动。通过在计算路径时检查其他位置,我避免了它们之间的冲突。 除代理必须从不同方向传递同一图块的情况外,此方法都可以正常工作。在这种情况下,最佳解决方案是让一个代理等待另一个代理通过: 另外,如果没有北方走廊,寻路也会失败。 如何实现这种算法?

1
快速,准确的二维碰撞
我正在研究2d自上而下的射击游戏,现在需要超越基本的矩形边界框碰撞系统。 我有很多不同类型的精灵,它们都有不同的形状和大小。精灵的纹理都是具有透明背景的正方形png文件,因此,我还需要一种方法,仅当播放器进入纹理的彩色部分时才发生碰撞,而不是透明背景。 我计划按以下方式处理碰撞: 检查精灵是否在播放器范围内 进行矩形边界框碰撞测试 进行准确的碰撞(需要帮助时) 我不介意先进的技术,因为我想在考虑所有需求的情况下做到这一点,但是我不确定该如何处理。尝试什么技术甚至库。我知道我可能需要创建并存储某种形状,以精确表示每个精灵减去透明背景。 我已经读过每个像素很慢,所以鉴于我的物体水平和数量很大,我认为这不合适。我也看过Box2d,但找不到太多的文档,也没有找到有关如何使用SFML进行安装和运行的任何示例。

1
一个简单的2D矩形碰撞算法,该算法还可以确定矩形碰撞的边?
我最初尝试实现矩形相交,效果很好。但是,当我必须应用物理系统(例如速度,加速度和方向矢量)时,我将不得不找到一种方法来确定矩形的哪一侧发生碰撞。现在,在我的系统中,没有旋转的矩形,因此这简化了问题。但是,我找不到确定哪个矩形边发生碰撞的简便方法。我曾经处理过这个问题,但失败了。 我过去所做的是确定每个平行矩形边之间的距离,并检查该距离是否接近0(使用一些初始定义的距离范围)或为0。但是,对于浮点算法,这证明是不稳定的,因为未知时间的流逝。有时,这些矩形实际上会在满足定义范围之前相交。 另一方面,我正在考虑生成多个矩形,每个矩形各边。但是,再三考虑之后,将其与平行边进行距离范围检查是一样的,只是该距离范围就是每个微型矩形的宽度。 因此,对这个问题有什么建议吗?

1
如何使用SAT解决复合形状的碰撞?
SAT是确定任意凸多边形之间的碰撞的一种不错的方法。您甚至可以获得解决冲突所需的向量。 为了解决复杂(非凸)形状之间的碰撞,我正在考虑某种由多个凸多边形组成的复合形状。如果在宽相中发生碰撞(例如,圆与圆或AABB与AABB),则可以通过检查复合形状中的每个多边形与其他复合形状中的每个多边形来解决冲突。 我想知道实际上分离对象的最佳方法是什么?幼稚的方法是仅取最大幅度的向量并将其用于分离。在下图中,这将是V 2 但是,如果分离向量指向不同的方向,则无法立即解决碰撞,可能需要多次迭代。因此,在下一张图片中,我们将使用V 1进行分离,并在另一个迭代中使用V 2(或接近V 2的形状,因为形状将移动V 1的量)。 这种方法将无法分离指向彼此相反方向的向量,或者在如下图所示的情况下: 在这里,我们将在左侧的状态和右侧的状态之间无休止地进行迭代。 因此,在这里提出一个实际的问题:解决这个问题的合理方法是什么?我想将复合多边形用于复杂形状是一个合理的想法,但我真的很想知道在这种情况下应如何解决碰撞?如第三张图片所示,如何检测死角?

2
实施3D碰撞的最佳/高效方法
我已经为之前的游戏编写了一个基于2d的碰撞系统。这是我的第一个碰撞系统,而且丑陋。我通过检查所有对象与所有对象来寻找对象之间的碰撞。我已经听说过带有单元格的网格系统,其中一个对象只会看起来与其当前单元格中其他对象的碰撞。这真的是检查碰撞的好方法吗? 我想要一种好的技术来循环遍历3D世界中的所有物品。

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.