Questions tagged «collision-detection»

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

5
如何确定网格中的哪些像元与给定的三角形相交?
我目前正在编写2D AI模拟,但是我不确定如何检查代理的位置是否在另一个代理的视野内。 目前,我的世界分区是简单的单元空间分区(网格)。我想使用三角形表示视野,但是如何计算与三角形相交的像元? 与此图片相似: 红色区域是我要计算的单元格,方法是检查三角形是否与这些单元格相交。 提前致谢。 编辑: 只是增加了混乱(甚至可能使其更简单)。每个像元都有一个最小值和最大值向量,其中最小值是左下角,最大值是右上角。

1
在2D物理引擎中,当物体静止时,如何避免无用的碰撞解决方案?
在我正在使用love-2d开发(用于学习)的物理引擎中,我通过以下方式实现了碰撞解决方案: FixedUpdate(dt) // I use fixed timestep foreach collide c1 in allNotStaticColliders c1.integartePhysic // i.e. apply gravitational force.. foreach collider c2 "near" c1 // "near"= I use spatial hashing if collide(c1,c2) resolve collision (c1,c2) // the heavy operation collison callbacks c1 collison callbacks c2 ... 如您所见,在gif动画的末尾,当所有对撞机几乎都固定在静态对象上时,FPS会衰减。 这是因为碰撞解决方案的数量随着对象在静止时花费更多的时间而增加。但是,许多计算都是“无用的”,因为对象已经相对彼此沉降到稳定的位置。 避免这些“无用的”碰撞检测的最佳实践(最好是不需要物理学位)是什么? 编辑:接受DMGregory提示,并得出此结果(尚不理想) (红色=静态,蓝色=活动,绿色=睡眠)

1
如何在LibGDX 3D中引发碰撞事件?
在下面的代码中,我举了一个我想做的事的例子。我有相机,当它碰到其中一个盒子时,我希望它停止移动,该怎么办? public class Main extends ApplicationAdapter { private final ModelBuilder builder = new ModelBuilder(); private final Environment environment = new Environment(); private ModelBatch modelBatch; private PerspectiveCamera camera; private Model model; private ArrayList<ModelInstance> instance = new ArrayList<ModelInstance>(); private FirstPersonCameraController controller; private BoundingBox[] boxBounds = new BoundingBox[1000]; private BoundingBox cameraBox = new …

1
用多个多边形分隔轴定理?
我正在尝试在C#中实现分离轴定理。我有一个可以计算两个多边形之间的最小平移矢量的函数。但是,我似乎无法创建一个函数来计算一个多边形与多个其他多边形之间的最小平移矢量。老实说,我已经为此工作了几个月,距离解决方案还很近,也无法在线找到解决方案。总是有一些边缘情况无法返回正确的结果,从而导致游戏中出现高优先级的错误。 以下是无法正常工作的常见边缘情况: 是否有针对此问题的知名解决方案?我只能发现有人说“只对每个多边形执行SAT”,但这很少产生最小的平移向量。 任何帮助将不胜感激。

2
从Rectangle.Intersects()获取碰撞详细信息
我有一个Breakout游戏,在该游戏中,有时会通过以下方式检测到球和桨之间的碰撞: // Ball class rectangle.Intersects(paddle.Rectangle); 有什么办法可以获取当前碰撞的确切坐标或有关碰撞的任何详细信息XNA API? 我考虑做一些基本的计算,例如比较碰撞时每个物体的精确坐标。它看起来像这样: // Ball class if((rectangle.X - paddle.Rectangle.X) < (paddle.Rectangle.Width / 2)) // Collision happened on the left side else // Collision happened on the right side 但是我不确定这是正确的方法。 你们对我可能要使用的引擎有任何提示吗?甚至使用这种方法的良好编码习惯?

5
弹球游戏的2D碰撞检测
到目前为止,在以前的游戏中,我使用带有框的简单2D碰撞,然后在像素级别检查碰撞。 如果要在几乎很多帧中进行弹球游戏,那么球将与墙壁或其他表面接触,那么还有其他方法吗?

1
gluLookAt如何工作?
据我了解, gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); 等效于: glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); 但是当我打印出ModelView矩阵时,对的调用glTranslatef()似乎无法正常工作。这是代码片段: #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int Ry …


8
如何防止平台游戏角色的角色夹在墙砖上?
目前,我有一个带有地形瓷砖的平台游戏(图形是从Cave Story借来的)。该游戏是使用XNA从头开始编写的,因此我没有使用现有的引擎或物理引擎。 瓦片碰撞的描述几乎完全与此答案中描述的一样(对于矩形和圆形使用简单的SAT),并且一切正常。 除非玩家摔倒时撞到墙壁。在这种情况下,他们会抓住瓷砖,开始以为自己撞到了实际上不存在的地板或天花板。 在此屏幕截图中,播放器向右移动并下降。因此,在移动之后,将检查碰撞-首先,发现玩家角色正在与地板上第3个瓷砖碰撞,并向上推。其次,发现他与旁边的瓷砖发生碰撞,并向侧面推开-最终结果是玩家角色认为自己在地上并且没有跌倒,并且只要碰到瓷砖就“抓住”瓷砖。 我可以通过定义从上到下的瓷砖来解决此问题,这使他可以平稳地跌倒,但是相反的情况发生了,当他向上跳到墙上时,他会撞到一个不存在的天花板。 我应该如何解决这个问题,以使玩家角色可以顺着墙倒下?

4
圆内圆碰撞
在我的一个项目中,我有一个圆形的游戏区。在这个圆圈内,另一个小圆圈在移动。我要做的是防止小圆圈移到大圆圈之外。在下面可以看到,在第2帧中,小圆圈部分在外面,我需要一种方法将其移回即将要移到外面的位置。如何才能做到这一点? 另外,我需要沿着大圆弧的碰撞点,以便可以更新小圆的速度。如何计算这一点? 我想做的是在移动小圆圈之前,先预测它的下一个位置,如果它在外面,我会发现t = 0和t = 1之间的碰撞时间(t = 1全时间步长)。如果我有碰撞时间t,那么我只是在t内移动小圆圈,而不是整个时间步长。但是,问题又来了,当我碰到两个圆圈,一个圆圈在另一个圆圈内时,我不知道该如何检测碰撞发生。 编辑: 我想找到碰撞点示例(绿色)。也许图片有点不对劲,但您明白了。

2
在非常简单的3D赛车游戏中,如何处理碰撞?
我想知道在一些简单的3d赛车游戏中是如何发生碰撞的(尤其是在Outrun 2 / Motoracer之类的游戏中)。 在具有复杂环境(开放世界)的经典赛车游戏中,我想这是通过一个基本的盒子(用于汽车)与飞机相撞(用于轨道,建筑其他东西)来完成的。整个过程将使用一些边界框进行优化(这是许多游戏中完成碰撞的方式)。 在《 Outrun 2 / Motoracer》这样的游戏中,游戏玩法是如此简单,以至于开发人员可能并不需要它,并且一切都可以简化很多。对于那些从未玩过的人,这里是这么具体: 汽车/自行车总是粘在道路上。 道路总是相同的大小,并且形状非常简单。 唯一的可能性是沿着这条路行驶,这不可能离开这条路,或者与其他东西发生碰撞(其他汽车/自行车除外,但我们不在乎)。 当您与道路相撞时,会发生非常基本的街机碰撞(只需将汽车从道路上推开) 这是我认为碰撞(可能)已经完成的方式: 整个轨迹可被视为3d贝塞尔曲线的巨型曲线。从该曲线可以生成道路多边形(使用从曲线生成的前,左和上向量)。其他元素(如房屋,树木等)也可以使用此方法放置和对齐。 然后,处理碰撞(并绘制汽车): 1)从当前汽车3d位置找到3d曲线上的最近位置。换句话说,将3d汽车位置转换为贝塞尔曲线位置。道路上的每个3d位置都可以视为沿着3d曲线(t)+横向位移(d)的位移。检查下面的图像是否不清楚(这是2d示例,但这很容易应用于3d)。 当t = 0轿厢在轨道段的起点时,当t = 1轿厢在终点处。当d = -1或1辆汽车在轨道边界时,当d = 0汽车在道路中间时 2)使用t和将汽车与道路对齐d(非常简单:对于t和,d我可以得到3d位置+上/前/左向量)。这辆车现在粘在路上了 3)检查d轿厢的横向位移。如果价值太大(d > 1)或太低,则(d < -1)汽车偏离轨道。只需将其夹在正确的位置即可。 这也使3d剔除非常简单,只需将轨道从当前汽车t位置绘制到即可t + some_big_enough_value_to_avoid_visible_clipping。 也许我完全错了:仅检查汽车(边界框)和代表轨道(没有建筑物等)的一组非常简化的多边形的碰撞会更快,更简单。3d世界(以及由此产生的colision模型)以前只是使用某些3rd party工具(运行游戏时不再有3d曲线,只是一堆多边形)生成的。

3
如何计算球体和平面之间的碰撞响应?
我正在尝试创建一个简单的3D游戏,并且需要将玩家限制在游戏世界的范围内。当玩家撞到世界的两边时,我希望玩家的飞船稍微弹起。 实际上,我试图将玩家困在一个盒子里,阻止他们从侧面逃脱…… 我设法将游戏世界的界限定义为一组平面,并具有法线和距原点的距离。播放器有一个球形的边界球,通过跟踪此网站http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php,我设法检测到了碰撞。 现在,我无法完全确定检测到碰撞时该怎么办。我能管理的最好的办法是让玩家卡在飞机上,直行通过飞机,或者以非常快的速度反复跳下飞机。 常识告诉我,我需要使用其法线来计算平面上的反射角并将其应用于玩家的速度,但是我想我首先需要查看玩家是否已通过平面,这是我无法做到的锻炼。

4
有没有办法提高n个对象系统的碰撞检查效率?
我正在制作一个包含许多屏幕对象的游戏,其中一个是玩家。我需要知道哪些对象在每次迭代中都发生冲突。 我做了这样的事情: for (o in objects) { o.stuff(); for (other in objects) if (collision(o, other)) doStuff(); bla.draw(); } 这个有O(n ^ 2),我被告知是不好的。我如何更有效地做到这一点,甚至有可能吗?我在用Javascript编写,n通常小于30,如果保持不变,会不会有问题?

3
针对多个正方形的基于图块的高效碰撞检测?
目前,我正在自己开发一款基于图块的游戏(想想Terraria,但不要太幻想了(我认为这是一个词?如果不是,抱歉)。 无论如何,我目前有碰撞检测功能(甚至适用于极端情况!),这对我来说是一大进步。看到一个精灵没有穿过一个块,这让我非常高兴。但是后来我有了基准测试的想法。馊主意。 1000平方,没问题。10,000平方,对于3个字符来说有点滞后。100,000平方(真是巨大的地图),无法显示3个字符。 我遇到的问题是,我什至不想考虑与玩家,角色,物品等距离太远的块,但我不想不断地将这些块装入内存。 到目前为止,这是我的算法,请随时批评。 foreach (Block in level) { if (distance from block to player > a specified amount) ignore this block; else { get the intersection depth between the two bounding boxes if (depth of intersection != Zero-vector) { check y size vs x size resolve on smallest …

3
如何找到被移动的圆圈扫过的2D网格单元?
我正在基于2D网格制作游戏,其中有些单元格可以通过,有些则不能。动态对象可以独立于网格连续移动,但需要与不可逾越的单元碰撞。 我编写了一种算法来追踪射线对着网格,从而为我提供了所有与射线相交的单元。但是,实际对象不是点大小的。我目前将他们表示为圈子。但是我无法找到有效的算法来追踪运动的圆。这是我需要的图片: 数字显示圆与网格单元碰撞的顺序。有人知道找到这些冲突的算法吗?最好使用C#。 更新圆可以大于单个网格单元。

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.