标签: collision-detection

Libgdx 3d 中的光线投射

好吧,所以我也已经尝试了很长一段时间,在 libgdx 中的 Raycast 用于基于我看的位置进行 3d 碰撞检测。但我画了一个空白,似乎没有任何文档。有人会好心地把我送到正确的方向吗?

java collision-detection libgdx raycasting

5
推荐指数
1
解决办法
4746
查看次数

如何检查圆是否位于凸多边形内部

我想检查一个圆是否相交或位于凸多边形内。我找到了一种出色的方法来检测点是否在多边形内部(来自此处):

        public boolean insidePolygon(Vector2 [] vertices, Vector2 p)
        {
            int i, j;
            boolean c = false;
            int nvert = vertices.length;
            for (i = 0, j = nvert - 1; i < nvert; j = i++)
            {
                if (((vertices[i].Y > p.Y) != (vertices[j].Y > p.Y)) &&
                 (p.X < (vertices[j].X - vertices[i].X) * (p.Y - vertices[i].Y) / (vertices[j].Y - vertices[i].Y) + vertices[i].X))
                    c = !c;
            }
            return c;
        }
Run Code Online (Sandbox Code Playgroud)

这对于单个点来说非常有效,但是我们有什么方法可以修改它来检查给定半径的圆是否在多边形内部?我想这是可能的,因为圆实际上是一个点,但更大,但我仍然没有成功......

java geometry collision-detection

5
推荐指数
1
解决办法
3394
查看次数

计算三角形内的格点

我有一个大三角形的点,我们称之为 a、b、c。(a =(x,y)等)。

现在我想统计这个三角形围成的区域内有多少个积分点,所以我首先看一下皮克定理。我考虑的第二种方法是生成一个以三角形的最大值、最小值为界的点列表,然后检查每个点是否位于三角形内部。

我使用重心坐标方法来做到这一点。它有效,但是我的三角形相当大,我的程序基本上是跨点的蛮力。我如何改进这个算法?

我的代码可以在这里找到:https ://bpaste.net/show/58433b6e389c

algorithm collision-detection counting

5
推荐指数
1
解决办法
1466
查看次数

运动刚体自行移动

我的 2D Unity 游戏中有一个非常奇怪的问题,我能够将其简化为以下核心问题/最小再现测试用例。请按照以下步骤进行重现(Unity 5.1.1f1):

  • 在位置 创建一个玩家对象(立方体)(0,0,0)
  • 删除BoxCollider组件。
  • 附加以下C#脚本,Unity将自动添加所需的组件,从而使其成为刚体碰撞器。
  • 设置isKinematic标志。
  • 将另一个立方体添加到场景中的 location 处(2,0,0)
  • 删除BoxCollider组件并添加BoxCollider2D. 这使得这个立方体成为一个静态碰撞器。
  • 设置isTrigger标志。
  • 运行场景。

预期行为:
玩家立方体向另一个立方体加速,并在接触它后停止移动。

观察到的行为:
玩家立方体向另一个立方体加速,然后继续以恒定速度移动。

其他实现细节:
我最初通过平移所有对象的变换来移动它们,并且根本没有使用刚体,因为我不需要碰撞检测。现在我知道了,所以我想要刚体。我深入研究在线资源,发现我应该使用rigidbody.MovePosition()而不是transform.Translate()or transform.position。我修改了脚本,出现了上面的错误。
返回来transform.position修复问题,但这不是一个好的解决方案,因为它涉及不良实践,根据我读到的内容,会产生大量的 CPU 负载。

尝试解决失败:

  • 切换到Update()Time.deltaTime没有任何区别。
  • 我尝试不返回Update(),而是简单地将 重置timestep为设置0时。stop不用找了。
  • 摆弄检查器并执行诸如冻结刚体上的位置或将玩家对象设置为触发器之类的操作根本没有效果。在游戏运行时(碰撞后)更改 Rigidbody 组件上的任何内容都会使立方体立即停止。任何东西,甚至将其质量设置为 0。
  • 我也尝试设置velocity为0,结果没有变化。这确实有意义,因为Update()完全跳过了(Debug.Log()顺便说一句,我还用 a …

c# collision-detection rigid-bodies unity-game-engine

5
推荐指数
1
解决办法
4212
查看次数

使用 GJK 的距离子算法在最接近原点的单纯形上找到点

我正在尝试实现Gilbert-Johnson-Keerthi 距离算法(GJK),但我遇到了“距离子算法”(也称为“约翰逊算法”)的问题,该算法用于确定单纯形上的点离原点最近。我得到了不正确的结果,但我在我的代码中找不到任何错误,所以问题一定出在我对算法的解释上。

在 Johnson 的算法(如 Gino van den Bergen 的书《交互式 3D 环境中的碰撞检测》中所述)中,X = {yi : i ? Ix}最接近原点的单纯形仿射壳上的点由下式给出:

在此处输入图片说明

其中 ?i^X 值是按照 X 的基数递增的顺序递归确定的:

在此处输入图片说明

...和 ​​?^X 由以下给出:

在此处输入图片说明

对于二维,我使用以下方法找到最接近原点的点:

Point ClosestPointToOrigin(Simplex simplex)
{
    float dx = 0;
    for (int i = 0; i < simplex.size(); ++i)
        dx += dj(simplex, i);

    Point closest_point(0,0);
    for (int i = 0; i < simplex.size(); ++i)
        closest_point += dj(simplex, i) / dx * simplex[i];

    return closest_point;
}
Run Code Online (Sandbox Code Playgroud)

其中 ?i 值由以下因素决定:

float …
Run Code Online (Sandbox Code Playgroud)

algorithm collision-detection computational-geometry

5
推荐指数
1
解决办法
1750
查看次数

圆弧碰撞检测

那么如何实现圆弧的碰撞检测呢?我是否必须使用 Box 2d 碰撞,或者我可以使用 Rectangle 或类似的东西以其他方式进行操作吗?

顺便说一句,我讨厌 box2d,因为我不理解其中的大部分内容,所以如果有一个排除 box2d 的解决方案,我将非常感激。

黄色圆弧

黄色圆弧在黑色圆圈上继续旋转。我如何在这里实现碰撞检测?

请帮忙 !谢谢!

collision-detection collision libgdx

5
推荐指数
1
解决办法
900
查看次数

找到最近的可用空间而不与现有点发生碰撞

给定一组点,我正在寻找有关如何有效地找到给定宽度和高度(由红色框表示)到指定点(本例中的点4)的最近可用空间的想法.

在此输入图像描述

还给出了一组不同的点(如下所示),其中盒子不能紧靠第4点,我仍然希望找到最近的空间(如图所示).我判断点4与红框中心之间的距离"最接近".

在此输入图像描述

任何帮助或想法将不胜感激.

javascript algorithm geometry canvas collision-detection

5
推荐指数
1
解决办法
105
查看次数

在 3D 空间中实现扩展多面体算法

我正在尝试在 3D 空间中实现 EPA 算法,但我似乎发现了一种凸单纯形可以变成凹单纯形的情况。

考虑这个单纯形:

在此输入图像描述

因为很难看出这里发生了什么,所以它是动画的:

原点是红、绿、蓝轴助手。没有边缘连接的白色球体代表我需要将多面体扩展到下一个的点。5 个黄色箭头是应删除的面的法线,因为它们与新点的原点方向相同。有些面看起来并不在同一方向,但我已经验证它们是作为面法线和新点的点积是:

  • 0.45396564417079877
  • 0.9473689548609279
  • 0.3346846050014339
  • 0.09982613239032267
  • 0.09982617482390854

所以 .gif 右侧的那两个面只是同一方向的大麦。

好的,EPA 算法要求删除这些面孔:

然后使用我们删除的面中的剩余边缘构造到新点的新面。但现在您可以看到凸单纯形已变成凹单纯形:

这显然是不对的,但我不确定我错在哪里。对我来说,就像我删除了不应该有的面,但这些面与新点的方向相同。

这是我的代码:

var EPA = function(aWorldVerts, bWorldVerts, simplex) {
    var simplexFaces = [{a: 0, b: 1, c: 2},
                        {a: 0, b: 1, c: 3},
                        {a: 0, b: 2, c: 3},
                        {a: 1, b: 2, c: 3}];

    var ret = null;

    while(true) {
        var face = findClosestFace(simplex, simplexFaces);
        var point = support(aWorldVerts, bWorldVerts, face.norm);
        var dist = point.clone().dot(face.norm);

        if(dist - face.dist …
Run Code Online (Sandbox Code Playgroud)

javascript collision-detection

5
推荐指数
1
解决办法
1643
查看次数

为什么我的碰撞测试总是返回“true”并且为什么图像矩形的位置总是错误的(0, 0)?

我的 collide_rect 函数无法正常工作。当它不应该返回时,它总是返回 True。我尝试在互联网上查找,但没有任何效果对我有用。我认为碰撞矩形不知何故没有使用两个精灵的实际坐标。有人能帮忙吗?

import pygame
import pygame.sprite
import sys


gameDisplay = pygame.display.set_mode((800,600))
pygame.display.set_caption("test_collision")
clock = pygame.time.Clock()
crashed = False


class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("ball.png")
        self.rect = self.image.get_rect()
        self.x = 280
        self.y = 475
        self.col = False
    def update(self):
        gameDisplay.blit(self.image, (self.x,self.y))
        self.rect = self.image.get_rect()
    def test_collisions(self,sprite):
        self.col = pygame.sprite.collide_rect(self,sprite)
class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.x = 1000
        self.y = 483
        self.image = pygame.image.load("obstacle.png")
        self.time = pygame.time.get_ticks()
        self.rect = self.image.get_rect()
    def change_x(self):
        self.time = pygame.time.get_ticks()
        self.x = -(self.time/5) …
Run Code Online (Sandbox Code Playgroud)

python pygame collision-detection pygame-surface

5
推荐指数
1
解决办法
1807
查看次数

drake 中基于网格的碰撞几何体

我想基于物理引擎生成用于感知和抓取的数据集。我尝试将谷歌研究最近发布的以下 3D 模型(https://app.ignitionrobotics.org/GoogleResearch )导入到 drake 中,并为各种鞋子创建分割数据集,即将网格放入垃圾箱/让它停下来读取RGB/深度和分割图像。

然而,在 drake 中将对象网格(.obj 文件)指定为碰撞几何体似乎不起作用,因为鞋子只是穿透垃圾箱并不断落入深渊(附加快照)。

在此输入图像描述

我还注意到 YCB 对象具有使用简单框和点接触描述的碰撞几何形状。这是相同的可视化(您可能已经熟悉)。绿色是碰撞几何体。

在此输入图像描述

如果我必须模拟上述内容,我是否需要描述谷歌研究数据集中所有对象的简单几何形状?如果有,它们是如何产生的?是否有一些工具可以用来生成这个或者它是手动完成的?或者当网格用于碰撞几何体时我应该启用水弹性接触模拟以使其工作吗?

如果它可以处理任何凸网格,另一种方法是将原始网格的凸包作为碰撞几何体。

另外,作为替代方案,我尝试使用 pybullet 进行相同的操作。我没有使用垃圾箱,而是使用了飞机。Pybullet 似乎正在正确处理将网格指定为碰撞几何体。这是 pybullet 中数据的快照。

在此输入图像描述

中间解决方案(尚未解决抓取部分):

在与 Sean 和 Russ 讨论后,我创建了三角形网格的凸包(使用 open3D),并且似乎使用此凸包作为碰撞网格和 <drake:declare_convex/>网格标签的注释,鞋子达到了稳定的姿势。我认为这个解决方案足以让我使用 drake 生成感知数据。这是使用以下解决方案后的快照:

在此输入图像描述

collision-detection drake

5
推荐指数
1
解决办法
812
查看次数