问题标签 [separating-axis-theorem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
846 浏览

javascript - 碰撞检测:分离轴定理 - 圆形与多边形

我一直在尝试基于Randy Gaul 的 C++ Impulse Engine实现圆和多边形之间的碰撞检测,非常接近代码,但算法永远不会返回 true。

这是JSFiddle。(为方便起见,正文使用 HTML5 Canvas API 呈现)

代码片段(只是碰撞检测):

请注意,b.verts2指的是多边形在现实世界坐标中的顶点。

我知道 Vector 类没有问题,但由于我对转换矩阵没有太多经验,因此该类可能是这些错误的根源,尽管它的代码几乎完全来自脉冲引擎也是如此,所以它应该可以工作。如前所述,该算法总是返回 false,即使确实发生了冲突。我在这里做错了什么?我尝试取出早期返回,但这只会返回奇怪的结果,例如带有负坐标的接触点,这显然不太正确。

编辑:修改了我的矢量类的垂直函数,使其与脉冲引擎的工作方式相同(两种方式都是正确的,但我认为一种是顺时针,另一种是逆时针——我还修改了我的顶点以反映逆时针)。不幸的是,它仍然没有通过测试。

https://jsfiddle.net/khanfused/tv359kgL/4/

0 投票
0 回答
93 浏览

game-engine - 如何存储凸多边形的边?

我正在制作自己的简单 2D 游戏引擎,我想使用分离轴定理来检测碰撞,但它要求对象是凸多边形,我真的很希望能够以简单的方式创建这些多边形,因为每个物理对象在我的游戏中,需要将自己的多边形映射到它,因此为每个对象手动创建这些多边形(通过提供多边形的每个顶点的像素坐标)会非常痛苦。

有没有更好的方法来做到这一点?

0 投票
1 回答
195 浏览

collision - 分离轴定理 MVT 仅沿一个轴

我在计算沿一个轴的 3D 穿透矢量时遇到问题。我已经实施了 SAT 并且它有效。我想计算我需要将第一个盒子从其他盒子中偏移多少,所以它总是位于其他盒子之上。一种用很长的盒子做简单的盒子投射。

我应该如何继续寻找将一个对象推向指定轴的方向的偏移量。

在此处输入图像描述

0 投票
1 回答
2009 浏览

java - 使用分离轴定理找到 MTV(最小平移向量)

所以我一直在尝试使用分离轴定理在我的游戏项目中进行碰撞检测和响应。我已经设法检测到碰撞,但对于我的一生,我无法弄清楚如何应对它。我正在尝试找到最小平移向量,但我不确定如何使其成为实际向量,以便我可以计算如何响应碰撞。我已经阅读了一个又一个教程,并且在这里查看了许多以前提出的问题,但我无法弄清楚如何实现它。我很难理解如何找到和使用 MTV,所以如果有人真的可以帮助我理解,也许可以给我一些例子,这样我就可以在实现中理解它,而不仅仅是理论,那就太好了赞赏,对于给您带来的任何不便,我深表歉意。我的代码确实成功地检测到了碰撞,它在下面:

这是简单的投影类:

如果需要任何额外的代码,我很乐意提供。请原谅我对如何查找和使用 MTV 缺乏了解,但我们非常感谢任何帮助。谢谢!

0 投票
2 回答
2040 浏览

python - Python int 对象不可下标

我目前正在尝试实现自己的 SAT(分离轴定理)碰撞检测系统,但遇到了问题。在第 34 行,我收到此错误消息:

第 34 行,在碰撞轴 = (v[1], -v[0]) TypeError: 'int' object is not subscriptable

奇怪的是 v 不是一个 int,它是一个元组。

这是代码

问题在第 34 行

0 投票
1 回答
609 浏览

algorithm - SAT 碰撞检测 - 角落修复

我正在构建一个游戏,我目前正在研究物理。

我正在使用SAT 算法来检测碰撞。碰撞发生在字符(AxisAlignedBoundingBox)和一些矩形(带旋转)之间。

一切正常,除了在特定情况下靠近角落的碰撞。(这是一个众所周知的问题,但我没有找到任何好的解决方案)。

在此处输入图像描述示例 1中,在第二个场景中,角色应该向上移动(停留在障碍物上)。
它恰好向左移动。
示例 2中,在第二个场景中角色不应该起床。有时会得到。

我知道为什么会这样,因为dxdyMinimum Translation Vector 并不总是想要的

这个问题有几种解决方案,但不是一个很好的解决方案(就解决问题而不是创造其他问题而言!)。我什至愿意从一开始就使用完全不同的算法。

请给我一个关于比 SAT 更好的算法的提示,或者一些解决方法。
谢谢你!

0 投票
0 回答
92 浏览

java - 分离轴定理的错误

我一直在努力实现 SAT 很长一段时间,这是我最后的手段,在对我的代码进行视觉检查之后,我似乎正确地获得了我正在检查的形状的面法线(轴),而且正确地将每个顶点投影到每个轴上,但是 SAT 返回错误,因为它没有检测到重叠,如果有人能指出我正确的方向,我将不胜感激。

SAT 课程:(开发实体)

向量类:

0 投票
0 回答
205 浏览

python - 分离轴定理 - 笛卡尔点的 Python 实现

我试图在 Python 中实现 SAT,但似乎无法让它工作。网上有很多信息,但似乎都没有解释代码(至少以我能理解的方式)以及如果您在笛卡尔平面上有点,如何应用 SAT。

在我的问题中,我有两个矩形(可能在一个角度上也可能不在一个角度上)存储为 x 和 y 坐标列表。

即我有两个列表 r1, r2 包含 [x1, y1], [x2, ..... [x4, y4] 对于两个矩形中的每一个。

如何在 Python 中实现代码以应用分离轴定理来确定碰撞?

任何帮助将不胜感激。

0 投票
1 回答
1145 浏览

algorithm - 定向盒(或 OBB)之间的交点

我正在尝试编写一个刚体模拟器,在模拟过程中,我不仅对查找两个物体是否碰撞感兴趣,而且对碰撞的点和法线感兴趣。我发现很多资源实际上说明了两个 OBB 是否使用分离轴定理发生碰撞。我也对 OBB 的 3D 表示感兴趣。现在,如果我知道两个碰撞 OBB 的最小重叠区域的轴,有没有办法找到碰撞点和碰撞法线?此外,有两种主要的碰撞情况,第一种是点面,第二种是边-边。我试图用谷歌搜索这个问题,但几乎每个解决方案都只检测真假碰撞。

请有人帮忙!

0 投票
1 回答
205 浏览

javascript - 分离轴定理困难

我在使用这种碰撞检测算法时遇到了很大的问题。我了解它是如何工作的,但我不知道如何在我的代码中实现它,即使我已经看过很多关于它的教程。此代码段中当前没有碰撞检测代码。这是演示: