Articles of 碰撞分辨

基于三角定位的分离轴定理实现片状最小平移向量

我使用分离轴定理实现了一些碰撞检测。 适用于轴alignment的矩形和四个可能的直角三角形中的两个。 由于某种原因,当斜边向左或向右取向时,所计算的最小平移向量是三角形的底部或高度的法线的平移vector,而不是与正在碰撞的斜边。 http://img.ufgame.com/collision-resolution/W5WHH.png 我有一个我的实现jsfiddle演示。 碰撞盒碰撞时,中心盒和右侧三角形都显示正确的MVT。 左边的那个没有。 将鼠标移到canvas上移动碰撞盒。 http://jsfiddle.net/XLtdB/

2D – 需要帮助了解如何解决简单的物理引擎中的多个碰撞

我正在尝试在Java中使用基本的OpenGL函数创建一个小型游戏引擎,并从头开始实现其他所有function。 我试图得到一个基本的物理引擎的工作(类似box2D只是简单得多),我设法检测使用SAT和我的不同身体之间的碰撞,我按照本教程尝试和实施冲突解决。 这似乎有些工作,但还有一些问题。 最大的一个问题是当我有多个对象碰撞时,它们似乎正在陷入彼此(但是只有两个对象才能正常工作)。 下面是一个演示我在说什么的例子: 这是我用来解决冲突的代码: /** * Resolves the collision */ public void resolve() { TekRigidBody bodyA; TekRigidBody bodyB; TekVector2f rv; TekVector2f impulse; TekVector2f correction; float normalVelocity; float massSum; float ratio; float e; float j; bodyA = collider1.gameObject.getBehavior(TekRigidBody.class); bodyB = collider2.gameObject.getBehavior(TekRigidBody.class); if (bodyA == null || bodyB == null || (bodyA.getInvMass() == 0f && […]

我怎样才能得到准确的碰撞解决矩形的角落?

我有一个工作碰撞系统实施,它是基于最小的平移向量。 这在大多数情况下都能正常工作,除非最小平移vector实际上不在碰撞方向。 例如: 当一个矩形在另一个矩形的任何一边的远边上时,可以施加一个力,在这个例子中,将一个矩形推到另一个矩形中,特别是像墙或地板那样的静态物体。 如图所示,碰撞来自上方,但由于处于边缘,所以会转换为左侧而不是后退。 我已经寻找了一段时间来find一种方法,但我可以find的一切处理一般角落碰撞,我的问题只在这一个有限的情况下。 有什么建议么?

奇怪的问题在非静态物体的碰撞解决

我在引擎开发方面有点初学,所以我决定从头开始编写我自己的引擎,这样我就可以更多地了解所有的事情。 除了物理引擎方面的事情让我头痛之外,我的进度还算不错。 这是我的意思的一个gif: 从本质上讲,只要玩家不是从上面或从右向左碰撞另一个非静态身体,引擎就可以正常工作。 这是我写的碰撞parsing代码: package resources import ( "game/pidgeot-socket/ecs" "github.com/bxcodec/saint" ) type PhysicsSystem struct { Hub *Hub } func (system PhysicsSystem) Loop() { entities, err := system.Hub.World.AllEntitiesWithComponent(ecs.CollisionComponent) if err != nil { return } for e, _ := range entities { // apply impulse c_p, _ := system.Hub.World.GetComponent(e, ecs.CollisionComponent) c := (*c_p).(*ecs.Collision) p_p, _ […]

利用光线投射将点移动到AABB

这可能是微不足道的,但我很难使其工作。 我有一个用Verlet Velocity模拟的三维坐标的粒子世界。 我只关心他们的中心和几个静态AABB之间的碰撞。 从本质上讲,我无法得到解决碰撞的干净方式。 例如,说我有一个坐标的框: min = (0, -1, -384) max = (512, 1, 0) 任何与它碰撞的粒子都应该停止向相关方向移动,但是继续移动其他方向 – 不会反弹。 我在pos中有一个粒子,在一个时间步中想要去newpos (它被向下和向东推): pos = (-0.068037, 0.000000, -58.516845) newpos = (0.014446, 0.000000, -58.555490) 显然,在X轴上有碰撞。 我的光线对撞机检测到它,并弹回光线与AABB相交的点: intersection = (0.000000, 0.000000, -58.548722) 现在,如果我刚刚设置了这个位置,下一个步骤就会发生碰撞,因为这个位置恰好在AABB的边界上 。 这使得每个粒子都“粘”到与之相撞的任何盒子上。 在前面的例子中,我想让粒子按照当前的速度滑下AABB墙。 我怎样才能做到这一点?

AABB与OBB碰撞分辨率抖动的角落

我为AABB角色实现了碰撞库,并且解决了AABB与AABB,AABB与OBB之间的碰撞问题。 我想要某些部分的斜坡,所以我玩弄了几个OBB来制作一个,除了一个明显的问题之外,这个工作很好。 OBB角落的碰撞分辨率会使玩家的AABB不断抖动。 我已经尝试了一些我曾经想过的事情,但是我无法将自己的头脑完全包裹在发生的事情中。 以下是关于正在发生的事件以及我的代码的video : 这里是获得冲突解决的function(我可能不是这样做的,所以这可能是问题所在): public Vector2 GetCollisionResolveAmount(RectangleCollisionObject resolvedObject, OrientedRectangleCollisionObject b) { Vector2 overlap = Vector2.Zero; LineSegment edge = GetOrientedRectangleEdge(b, 0); if (!SeparatingAxisForRectangle(edge, resolvedObject)) { LineSegment rEdgeA = new LineSegment(), rEdgeB = new LineSegment(); Range axisRange = new Range(), rEdgeARange = new Range(), rEdgeBRange = new Range(), rProjection = new Range(); Vector2 n […]

基于matrix的游戏物理(碰撞检测和响应)如何工作?

我熟悉如何使用形状相交testing,分离轴定理以及使用minkowski和和支持vector定义形状的MPR和GJK来进行碰撞检测和响应。 我知道有另外一种方法可以使用matrix来进行碰撞检测和响应,但我对此一无所知。 任何人都可以向我解释如何工作的基础知识,或者链接到一些资源? 我一直无法拿出正确的条款来问谷歌显然。 谢谢!

连续碰撞检测

所以我正在玩分离轴定理和碰撞。 很明显,它碰到的是什么问题。 我需要与它碰撞的那个面相切的单位正常parsing深度穿透。 对于矩形很容易。 Update Y velocity If collision collision happened on the y axis. Update X velocity If collision collision happened on the x axis. 但是我想要一个更一般的方法来处理所有的情况。 我想出了两个解决scheme 1)所以我想到了一个三角形上面的解决scheme。 很明显,它不会工作,因为矩形面是轴alignment的,而三角面不是。 所以我想我可以使用点积来计算面和速度,像矩形一样求解它,但是每个面都有自己的轴。 这当然涉及每个面部再次检查整个形状的碰撞。 2.)我也认为我可以做Polygon v Ray碰撞检测来找出碰撞的面部。 我的问题是:哪种解决scheme更快? 还是有一个更好的,还没有出现在我的脑海里? 我不知道怎么做Polygon v Ray的碰撞,但是我猜想那个foreach face,find射线和人脸段的交点。

如何在使用光线投射来预测未来碰撞的位置时解决碰撞?

我遇到了一个我似乎无法解决的问题,同时为我的游戏实现移动/碰撞检查代码。 游戏是2D的,我游戏中的所有对象都使用AABB或圆圈作为碰撞掩码。 我目前的移动游戏对象的过程使用以下步骤: [运动定义]将游戏对象的运动vector设置为vec2(xSpeed,ySpeed) [广泛]广泛的阶段,以find潜在的碰撞对象 [碰撞检测]沿着运动vector对AABB进行射线照射,对照步骤2中find的所有对象,并find第一个碰撞 [冲突解决]将游戏对象移动到发生第一次碰撞的位置 下面是碰撞检测的截图。 它沿着运动vector(红线)投射对象的AABB(左下方的蓝色矩形),并findAABB将进入和退出另一个对象的AABB(大蓝色矩形)的点。 当我input/退出另一个对象时,它返回我的位置,normal和lambda(沿着运动vector的progressive [0.0,1.0])。 实际上,AABB的光线投射在两个AABB的configuration空间障碍物上作为线光线进行。 我已经实现了这个线圆,线aabb,圆圈和aabb,aabb情况下,他们正常工作。 我的问题是碰撞解决步骤。 问题是我的对象使用当前的过程卡在彼此。 原因在于raycast过程返回对象与另一个对象“恰好碰撞”的位置。 因此,在我的游戏世界的下一次更新中,物体在移动之前就已经发生了碰撞。 当我执行碰撞检测步骤时,结果是在对象的起始位置发生“第一次碰撞”。 我一直在阅读相关的问题,但还没有find明确的答案。 以下是我读过的一些东西,以及我发现的问题(从“坏”到“更好”): [如果在路上遇到碰撞,请勿移动]移动物体时,可能会引起紧张和怪异的行为。 例如,如果对象以每帧5个像素朝向墙壁移动,则取决于其位置,它将在距离墙壁5到0个像素之间的某处结束。 当这个解决scheme扩展到移动对象之间的碰撞检查时,我怀疑发生了抖动行为。 [实现IsTouching()方法来检查一个对象是否碰撞,但不穿透另一个对象]我不知道如何在光线投射algorithm中优雅地使用这些信息来允许形状的“滑动行为”,而不会牺牲性能(因为algorithm是现在非常优化)。 另外,我想象的物体“触摸”被定义为穿透深度为0.0。 检查这可能会导致浮动四舍五入错误的情况下的错误。 [碰撞时推开物体和碰撞物体]我的一些物体(如墙壁和地形)是静止的,我宁愿稍微移动它们以解决碰撞问题。 [沿碰撞正常物体将物体推出碰撞物体]使用此解决scheme,物体可能卡在另一物体中,因为它被“盲目”推出碰撞物体。 [沿着运动vector将物体向后推出碰撞物体]这听起来不错,因为物体不会卡在其他物体中。 但是,我不知道如何select“多less”来推出对象的对象。 我能想到的最好的办法是使用“0.00001f”这样的非常小的浮点数来移动它。 但这听起来很特别。 简而言之:如果我确切地知道第一次碰撞会发生在哪里,而不会将它卡在其他物体中,我应该在哪里移动物体?

第二滑动碰撞响应过程中如何防止沿墙加速

我正在写一个简单的二维物理系统,使用与边缘碰撞的圆。 当用户按下一个键时,圆的速度在按下的方向上增加一些量。 目前没有摩擦,尽管这不应该是相关的(例如,如果一个角色跳跃,那么在着陆之前通常没有摩擦,但墙壁仍然应该正常工作)。 速度vector的幅度也是有限的。 当圆与边缘碰撞时,其速度沿着边的表面投射。 这样可以使圆圈沿着墙壁滑动,但是它会导致圆圈沿着表面加速,而不是以预期的恒定速度移动。 下面是一个示意图: 左边是红色vector代表速度的第一次迭代,绿色vector代表从用户input添加到速度的量。 这个组合vector投影在墙上以产生蓝色vector。 在右边是第二次迭代,其中与当前速度相同的绿色vector被添加到当前速度(与第一次迭代相同的投影速度),并且该合成vector沿着表面投影以产生新的紫色速度vector。 正如你所看到的,紫色vector比蓝色vector大,这意味着第二次迭代的圆比第一次迭代快,因此沿着墙壁加速。 在连续迭代中,角色将继续加速,直到达到最大速度。 我明白为什么会发生这种情况,但是我正在努力弄清楚如何改变逻辑,以便游戏能够处理这种情况。 通常,角色加速速度越慢,表观速度越小,他们相对于墙壁表面移动得越垂直。