Questions tagged «collision-detection»

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

4
如何有效检查点是否在旋转的矩形内?
我一方面要出于优化的目的,另一方面出于学习的目的,我敢问:如何使用C#或C ++ 最有效地检查2D点P是否在2D旋转的矩形内XYZW? 当前,我正在做的是使用《实时碰撞检测》一书中的“三角形中的点”算法,并运行两次(对于组成矩形的两个三角形,例如XYZ和XZW): bool PointInTriangle(Vector2 A, Vector2 B, Vector2 C, Vector2 P) { // Compute vectors Vector2 v0 = C - A; Vector2 v1 = B - A; Vector2 v2 = P - A; // Compute dot products float dot00 = Vector2.Dot(v0, v0); float dot01 = Vector2.Dot(v0, v1); float …

2
外推打破碰撞检测
在对精灵的运动进行推断之前,我的碰撞效果非常好。但是,在对精灵的运动进行推断(以使物体平滑)之后,碰撞不再起作用。 这是外推之前的工作方式: 但是,在执行推断后,碰撞例程将中断。我假设这是因为它作用于外推例程(位于我的render调用中)产生的新坐标。 应用推断后 如何纠正这种行为? 我尝试在推断后再进行一次额外的碰撞检查-这似乎确实解决了许多问题,但是我将其排除在外是因为将逻辑放入渲染中是不可能的。 我还尝试制作了spritesX位置的副本,对其进行推断并使用该位置而不是原始位置进行绘制,从而保留了原始位置以供逻辑使用-这似乎是一个更好的选择,但仍然会产生一些奇怪的效果与墙壁碰撞时。我很确定这也不是解决此问题的正确方法。 我在这里找到了几个类似的问题,但是答案并没有帮助我。 这是我的推断代码: public void onDrawFrame(GL10 gl) { //Set/Re-set loop back to 0 to start counting again loops=0; while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){ SceneManager.getInstance().getCurrentScene().updateLogic(); nextGameTick+=skipTicks; timeCorrection += (1000d/ticksPerSecond) % 1; nextGameTick+=timeCorrection; timeCorrection %=1; loops++; tics++; } extrapolation = (float)(System.currentTimeMillis() + skipTicks - …

2
下降块和复杂形状
我目前有一个简单的类似Tetris的游戏,遇到了我无法解决的问题。 与俄罗斯方块中有一个单独的下降形状不同,我有多个可能需要互锁的形状需要下降;我需要计算他们的最终职位。考虑以下: 要计算绿色形状的最终位置,我只需向下扫描每个正方形,直到碰到另一个正方形或板的边缘。完成 对于多种简单形状,我会按照自己的方式进行开发。因此,发现红色不需要移动,橙色下降1,绿色下降3。完成 我不知道如何对待互锁的绿色和红色形状。使用#2的逻辑,我们最终会“卡住”漂浮在空中。如果我向下扫描以获取绿色形状,则会遇到红色,因此不会移动,反之亦然。解决方案可能是将两种形状视为一种。 与#3类似,在这种情况下,我也可以通过将对象视为一个对象而成功。 与#3和#4不同,我无法将形状视为一个形状,因为橙色形状最终会浮动一个正方形太高... 问题6的另一种变化。 可能还有其他情况,使我有许多形状在越来越复杂的情况下交织在一起,但是我认为以上内容涵盖了问题的最基本部分。 我觉得我还没有遇到/想过一个优雅的解决方案,并且非常感谢您提供任何见解,想法或资源。 解 根据下面的@ user35958的答案,我想出的解决方案确实很优雅,我创建了以下递归函数(伪代码) function stop(square1, square2){ // Skip if we're already stopped if(square1.stopped){ return; } // Are we comparing squares? if(!square2){ // We are NOT comparing squares, simply stop. square1.stopped = true; } else { // Stop IF // square1 …

3
窄相碰撞检测算法
冲突检测分为三个阶段。 Broadphase:在所有可以交互的对象之间循环,如果可以加快循环,则允许误报。 Narrowphase(窄相):确定它们是否碰撞,有时如何碰撞,没有误报 解决方法:解决冲突。 我要问的问题是关于窄相的。有多种算法,复杂度和准确性不同。 Hitbox交集:这是一种后验算法,具有最低的复杂度,但也不太准确, 颜色交集:每个像素的Hitbox交集,后验,像素完美,时间上不准确,复杂度更高 分离轴定理:更常用,对三角形准确,但是a后验,因为它找不到边,考虑到最后一帧,它更稳定 线性射线广播:A先验算法,对半逼真的物理学很有用,它可以找到相交点,甚至比SAT还要精确,但是复杂性更高 样条插值:先验,比线性射线更精确,更复杂。 我可能已经忘记了更多。问题是,何时使用SAT更好,何时使用射线,何时花键以及是否有更好的选择。

2
船在基于RTS的2D瓦片中的桥下通过
我正在编写基于2D切片的RTS。我想为其添加“伪3D”功能-跨河桥梁。 我还没有开始任何编码,只是试图考虑它如何适合碰撞检测模型。经过桥下的船只和经过桥上的部队最终将占据地图上的同一单元。如何防止它们发生碰撞? 是否有解决此问题的通用方法?还是我需要实现3D世界才能做到这一点?

4
碰撞矩形响应
我很难让一个可移动的矩形与多个矩形碰撞。 我正在使用SFML,它有一个方便的函数intersects,它需要2个矩形并返回交集。我有一个充满矩形的向量,我希望我的可移动矩形发生碰撞。我使用以下代码(p是可移动矩形)遍历此代码。 IsCollidingWith返回布尔值,但也使用SFML intersects来计算交叉点。 while(unsigned i = 0; i!= testRects.size(); i++){ if(p.IsCollidingWith(testRects[i]){ p.Collide(testRects[i]); } } 和实际的Collide()代码: void gameObj::collide( gameObj collidingObject ){ printf("%f %f\n", this->colliderResult.width, this->colliderResult.height); if (this->colliderResult.width < this->colliderResult.height) { // collided on X if (this->getCollider().left < collidingObject.getCollider().left ) { this->move( -this->colliderResult.width , 0); }else { this->move( this->colliderResult.width, 0 ); …

2
突围碰撞:检测碰撞的一面
我正在写一个突破性的克隆游戏(我的第一场比赛),我完全不知道该如何打砖头。 我有一个碰撞检测方法,如下所示: DetectCollision(Object a, Object b) x = distance(a.x, b.x); y = distance(a.y, b.y); if (x is smaller than the combined width & y is smaller is than combined height { return true; } return false; 这完全可以正常工作,但是我需要知道碰撞的一面以及相对于中心的位置,以便正确响应。 过去几天我一直在偷看,但迷路了。

2
连续物理引擎的碰撞检测技术
我正在使用一个纯粹的连续物理引擎,因此我需要选择用于宽相和窄相碰撞检测的算法。“完全连续”表示我从不进行交叉测试,而是想找到方法在每次碰撞发生之前将其捕获,然后将其放入由TOI排序的“计划的碰撞”堆栈中。 宽相 我能想到的唯一连续的宽相方法是将每个物体围成一个圆圈,并测试每个圆圈是否会相互重叠。但是,这似乎效率极低,并且没有任何剔除。 我不知道对于今天的离散碰撞剔除方法(例如四叉树),可能存在什么连续的类似物。我应该如何防止不适当且毫无意义的广泛测试,例如分立引擎?我还希望能够看到超过1帧的碰撞。 狭窄阶段 我已经设法使狭窄的SAT适应连续检查而不是离散检查,但是我敢肯定,您可能遇到过的论文或网站中还有其他更好的算法。 您建议我使用哪种快速或准确的算法,每种算法的优点/缺点是什么? 最后说明: 我说的是技术而不是算法,因为我尚未决定如何存储可能是凹形,凸形,圆形甚至有孔的不同多边形。我计划根据算法的要求对此做出决定(例如,如果我选择将多边形分解为三角形或凸形的算法,我将以这种形式简单地存储多边形数据)。

1
变形表面
我正在尝试完成水平曲面的变形物理行为,但到目前为止,尚不知道如何从实现开始。 无论表面的形状(平面,立方体,球体……)如何,我都希望在游戏实体(玩家,敌人,物体……)的位置上有小凹痕。 解释起来有点复杂,所以我说明了我在说什么,这是一个带有球体的示例: 因此,这些表面应该能够使其自身稍微变形(看起来像是真正柔软的床或沙发)。我的曲面可能需要很高的顶点数才能获得平滑的变形,但是我的大问题是计算该变形的数学方法。 我正在用OpenGL用C / C ++进行编程,但是在正确方向上的任何建议都可以。

2
在类似《魔兽争霸3》的游戏中寻找障碍物
考虑在基于图块的地图上进行A *搜索。直接的代码是:如果该单元格中有一个单元,则该单元不可访问,可以。 但是存在地图分辨率问题。当我研究《魔兽争霸3》时,那里的怪物和建筑物确实具有不同的半径,并且您可以走得很近,这更像是基于矢量的,这是如何实现的? 另外,将移动障碍物碰撞检测与路径查找算法(例如Warcraft 3)结合起来的标准解决方案是什么?


4
查找导弹和位图地形的交点的最有效方法是什么?
在回答了我先前关于查找2D位图地形的坡度的问题后,我现在需要了解在导弹上击中的2D地形上找到点的最佳方法。显然,我可以看到导弹下方是否有任何像素与地形相交,但是可以说它已经深入到地形中。 返回到最初碰撞位置的最佳方法是什么?我可以一次将X像素移回导弹的先前位置,但是X的一个好值是多少?还有更聪明的方法吗?也许移动一半的距离,然后移动四分之一,等等?


3
两个定向包围盒(OBB)之间最快的3D碰撞检测
我在游戏中需要添加碰撞系统的时刻。我尝试了jBullet,尽管它确实起作用了,但这并不是我想要的。我只想要一种简单的方法来测试两个面向边界的框(OBB)树是否碰撞。 我本来是要用那棵树做碰撞的。制作一个AABB进行广相,然后通过测试,如果树中的每个OBB与另一棵树发生碰撞。 我确实在互联网上找到了一些东西,但是我无法完全理解它们。我要的是一个很好地解释3D OBB碰撞的网站或资源? 我了解到,GJK比SAT更快,它似乎能够告诉我这些盒子相互穿透的距离。我找到了一些GJK东西,但它们不是盒子。相反,事情变得更加复杂和混乱。 我只希望能够通过3个向量制作OBB:中心,大小和每个轴的旋转。然后能够测试与这些碰撞。预先感谢您发布的任何内容。

2
如何测试一个点是否位于两条平行线之间?
在我设计的游戏中,爆炸会从起点向鼠标方向发射。爆炸的宽度始终是相同的。 沿着屏幕底部(当前是什么)移动的方格应该受玩家控制的爆炸影响。 目前,我正在尝试寻找一种方法来发现这些正方形的角是否在爆炸的两条边界线之内。我认为最好的方法是围绕原点旋转正方形的角,好像爆炸完全处于水平状态,然后查看拐角的Y值是否小于或等于爆炸的宽度。表示它们位于受影响的区域内,但我无法解决

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.