问题标签 [aabb]

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 回答
1343 浏览

line - 线段上最接近 AABB 的点

我需要知道最接近 AABB 的线段上的点。我知道这条线绝对不会与盒子相交。

作为一种可能的简化,盒子的一个尺寸是零(大部分时间),所以我只需要找到线段上离一个面最近的点。(我可以扩展它以检查边缘情况下 AABB 的所有 6 个面)

只是为了确认

  • 线不是无限的,它由两个点定义
  • 盒子/面也是受限的而不是无限的
0 投票
1 回答
198 浏览

java - 最大可能的 AABB 的 Java 组平铺矩阵

我正在制作一个基于 2D 瓷砖的游戏,当我陷入这个问题时,我正在使用 AABB 碰撞算法,我有一个瓷砖矩阵:

基于这个矩阵,我想计算 AABB 池,它是一个简单的列表,在这里定义:

我正在寻找一种能够迭代瓦片矩阵并在矩阵中找到最大可能的实体附着瓦片的 AABB 矩形的算法,让我解释一下:

瓷砖表示

给定这个矩阵,算法将创建 aabb 池,如下所示 平铺结果

最后,我创建了这个脚本来调试算法

该脚本产生以下结果:

脚本结果

但这不是我所期望的,因为该算法按 y 对图块进行分组并且没问题,但当我可以时不能按 x 分组,就像那里

预期脚本结果

最后(对不起,很长的帖子)算法必须遵守以下规则:

  • 更喜欢按 Y 对图块进行分组
  • 当 Y 不可能时,按 X 对图块进行分组
  • 不要与现有组重叠
  • 将所有图块分组
0 投票
3 回答
2651 浏览

c++ - 横扫 AABB 碰撞检测和响应问题

我正在开发一个简单的 2D 游戏,但在碰撞检测和响应方面遇到了问题。我正在使用改编自这篇文章的代码:http ://www.gamedev.net/page/resources/_/technical/game-programming/swept-aabb-collision-detection-and-response-r3084

我已经尝试对代码进行许多更改,但我似乎无法让它按预期运行。我的算法试图检测单个移动实体和一个或多个静态块之间的碰撞。它使用以下逻辑:

1. 宽相碰撞检测:

创建一个封装实体运动的 AABB,然后检测与静态块的 AABB 的重叠。将这些碰撞事件添加到列表中,并按影响时间对该列表进行排序。

2.窄相碰撞检测:

计算每个碰撞事件的碰撞时间和碰撞法线,并将实体移动到每个静态块之外的适当位置。使用碰撞法线将实体滑动到正确的位置。

这是我用来计算碰撞事件的影响时间的代码:

这是生成碰撞响应的代码:

现在,问题——在以下情况下,移动实体完全停止。我曾期望它在这两种情况下都会水平滑动。我一直无法确定是碰撞检测代码的问题,还是碰撞响应代码的问题:

0 投票
2 回答
158 浏览

javascript - 正确使用 Physics.aabb.union()

我正在学习PhysicsJS,我尝试像这样使用union

但球只是从底部掉下来。

我在 GitHub 或任何使用它的地方都找不到任何代码。有人可以提供一些指导吗?

0 投票
2 回答
856 浏览

java - LIBGDX Box2D World QueryAABB 不工作

所以我试图让我的世界中的身体在一个范围内,这是一个square(AABB).

这是我的代码:

但这实际上是,只有当AABB它直接在摩擦中时,我才会得到一份报告。我有一些图像向您展示我的意思。

不工作: 不工作:(

在职的: 在职的 :)

0 投票
0 回答
220 浏览

c++ - CGAL:如何获取给定距离内的所有图元

我需要实现一个碰撞检测算法。我需要得到所有基元对(即点-面对和边-边对),其中两个基元在给定距离内。

对于大型网格,我选择 CGAL::Surface_mesh 作为我的基本网格数据结构,并决定使用 AABB 树以提高效率。AABB 树手册页提供了几种用法:

  1. 交叉点:关于精确的交叉点

    • 交叉点测试:do_intersect(), number_of_intersected_primitives(), all_intersected_primitives(), any_intersected_primitive(),精确的交叉点检查

    • 交集构造:all_intersections(), any_intersection(),都返回具有给定原语的交集对象

  2. 距离:

    • closet_point(), closet_point_and_primitive(). 我可能需要这样的东西。

所以我想我可以自己定制这个。我注意到Square_distance()Compare_distance()用作距离函数,我可以像这样重载这些函数吗

有人能帮我吗?

0 投票
1 回答
2106 浏览

unity3d - 在 Unity 中,获取网格,或者以其他方式获取 Sprite 的局部边界?

这个问题只涉及 Unity 游戏引擎

这是一个所谓的 Unity“精灵”(Unity Sprite 类)的视觉示例,它是一个薄 3D 对象。

在此处输入图像描述 在此处输入图像描述

显示 AABB(绿线)。在 Unity 中,通过.bounds( doco ) 提供脱离 gpu 的实时 AABB。如果是 CG 新手,请解释 AABB

(注意,Unity(doco , doco)中的“local”表示:在父对象的四元组中;“world”表示在场景对象的四元组中。)

现在!对于任何阅读的 Unity 工程师:

通常在 Unity 中,使用可见对象时,当您想要获取Unity Bounds时,

如果您希望它们在世界空间中,renderer.bounds则返回世界空间中的Unity Bounds

如果您希望它们在本地空间中,mesh.bounds则返回本地空间中的Unity Bounds

这是 Unity 的基础,您一直都在这样做。然而。使用新的精灵,也就是说SpriteRenderer,据我所知,没有真正访问网格。

(你实际上可以得到 .triangles,但是从那里重建绕组和大小会很麻烦。)

那么,如何获得Sprite的本地 Unity Bounds呢?

(请注意,sprite.bounds它本身就是一样的renderer.bounds,这无济于事。)

0 投票
1 回答
125 浏览

c# - 当两个对象的大小不同时,AABB 碰撞器不会与精灵重叠

在我的项目中,我试图在两个实体对象之间实现离散的 AABB 碰撞。我的代码适用于两个相同大小的对象,但对于两个不同大小的对象,当两个精灵显然没有接触时,就会发生碰撞。当两个精灵碰撞时,它们之间的距离越大,物体大小之间的差异就越大。

为什么会发生这种情况,我该如何更改代码,以便碰撞按预期用于两个不同大小的对象?

相关代码目前的方式是:

Box 结构体表示一个边界框。它还具有检查交叉点的方法。用否定的方式检查交叉点

具有碰撞器的对象必须实现 IBoundingBoxCollider 接口: public interface IBoundingBoxCollider { #region data Box BoundingBox { get; } bool SolidCollider { 得到;放; } 布尔静态碰撞器 { 获取;放; } 浮动 DistanceTraveledThisFrame { 获取;} #endregion #region 方法 void CheckCollision(IBoundingBoxCollider other); #endregion }

字符由 Character 类表示。此类具有 CheckCollisions 和 UpdateCollider 方法。UpdateCollider 也在类构造函数中被调用。Character 类继承自 AnimatedObject,该类处理动画,该类继承自 DrawableObject,后者处理将精灵绘制到屏幕上。DrawableObject 具有 Position、Rotation 和 Scale 属性。Draw 和 Update 方法处理 Game1 中相应地在 Draw 和 Update 上调用的静态事件。

在 Game1 类中有一个 List。列表的每次更新都会被迭代,并且每两个碰撞器都会调用 CheckCollision:

编辑1

尝试了 Monset 的解决方案,将 Box 结构替换为 Monset 所做的类,并进行了一些命名更改:

它给了我不能从密封类型'Microsoft.Xna.Framework.Rectangle'派生

0 投票
0 回答
87 浏览

java - 如何优化 3D AABB 旋转 (Java)

最近我一直在我的游戏引擎中实现 3D AABB,为了完成旋转,我使用了一种简单的方法,使用我的 Vector3f.rotate() 方法围绕框的中心旋转所有 8 个计算的角。但正如您在下面可能注意到的那样,它的效率非常低。如果你想对这里的整个班级进行排序是github(https://github.com/EquilibriumGames/Flounder-Engine/blob/master/src/flounder/physics/AABB.java)否则这里是我需要帮助的snipit与,我相信那里可能有更简单的方法,但我想知道你的想法。谢谢!

0 投票
1 回答
3952 浏览

time-complexity - 四叉树范围搜索的复杂性

我已经搜索过这些信息。发现这个:

https://groups.google.com/forum/#!topic/uw.cs.cs240/MGfrsvKAiMA

和这个:

四叉树 O(N) 的最坏情况复杂度如何?

,但我不相信它回答了我的问题。第一个,也许,但我不明白解释。说到点子上了。

我在离散空间(实体的二维方表)上有一个四叉树。它是一个区域树,如英文维基百科页面 ( https://en.wikipedia.org/wiki/Quadtree#Types ) 中所述。每个区域只能拥有一个实体。每个实体都有其离散坐标。

queryRange()我已经实现了一种方法来查找特定(离散)AABB 中的所有实体,其工作方式与上述 Wiki 页面中的功能完全相同。

我的问题是:这个queryRange()函数的时间复杂度是多少?

我试过自己弄清楚,但它似乎取决于许多不同的因素,例如:树的深度、树中元素的数量、给定 AABB 的大小。我认为它的核心与 queryRange() 递归访问的子树的数量有关。

我也将感谢任何可靠的消息来源。我正在写一篇硕士论文,我需要引用。不过,我似乎真的无法在这个主题上搜索到任何好的内容。