Articles of 碰撞解决

如何使用Slick2D使用tile属性检测和处理冲突?

我试图在Slick2D基础上设置一个基于地图的碰撞检测。 我目前在地图上有两个图层,一个背景图层和一个碰撞图层。 碰撞层有一个“阻塞”属性的瓦片,画在玩家不能走的区域上。 我已经浏览了Slick文档,但不明白如何读取tile属性并将其用作碰撞检测的标志。 我的“移动”播放器的方法有些不同,可能会影响碰撞的处理方式。 玩家总是停留在同一个地点,而不是更新玩家在窗口上的位置,更新地图渲染的x和y。 我正在通过限制播放器的移动来处理与对象的碰撞,当它的hitbox与对象的hitbox相交时。 例如,玩家击中对象右侧的代码如下所示: if(Player.bounds.intersects(object.bounds)&&(Player.x<=(object.x+object.width+0.5))&&Player.isMovingLeft){ isInCollision=true; level.moveMapRight(); } else if(Player.bounds.intersects(object.bounds)&&(Player.x<=(object.x+object.width+0.5))&&Player.isMovingRight){ isInCollision=true; level.moveMapRight(); } else if(Player.bounds.intersects(object.bounds)&&(Player.x<=(object.x+object.width+0.5))&&Player.isMovingUp){ isInCollision=true; level.moveMapRight(); } else if(Player.bounds.intersects(object.bounds)&&(Player.x<=(object.x+object.width+0.5))&&Player.isMovingDown){ isInCollision=true; level.moveMapRight(); } 并在关卡的更新代码中: if(!Player.isInCollision) Player.manageMovementInput(map, i); 但是,这种方法仍然有一些错误。 例如,当从右侧击中对象时,玩家将向上和向左移动,通过对象剪切并卡在其hitbox内。 如果有更有效的方式来处理这个,任何意见将不胜感激。

碰撞检测建议

我目前正在开发一个移动设备的原型游戏,用户将在屏幕上看到几个对象,并且必须以正确的顺序逐个触摸它们以赢得胜利。 我想你可以说这跟鼹鼠游戏很相似,但是屏幕上不会出现痣,我会有几个物体在移动。 我在实现这个游戏的碰撞检测algorithm方面遇到了一些困难,因此我希望你的建议是什么是最好的方法来使用。 例如,假设一个物体在一个给定的方向上移动,那么我可以使用SAT来检查它是否与其他物体发生碰撞。 如果发生碰撞,则会停止并随机select另一个方向移动。 另一种select是将我的屏幕分为正方形或六边形瓷砖。 这样,我可以在移动物体之前检查瓷砖是否是空闲的或被占用的。 我的游戏是二维的,将使用自上而下的立体投影,并使用Cocos2d-X和Marmalade SDK进行开发。 我没有使用任何物理引擎,因为我的游戏不需要它们(对象只需要四处移动,它们不会反弹或需要任何物理行为)。

三角形网格碰撞/分辨率

我一直在尝试一些不同的碰撞检测方法,现在我想尝试对三角形网格实施简单的Mesh-Mesh碰撞检测。 我想知道我是否在正确的轨道,或者如果我错过了一些关键的东西。 我的碰撞检测的总体思路是一个没有旋转的移动物体,对静止的物体。 我也希望移动的物体滑过它们碰撞的静止物体的表面/边缘。 该algorithm是: 列出移动物体原点范围内的所有静止物体。 添加到移动的移动物体范围内的所有静止物体列表中 按照移动物体原点的最短距离对列表进行sorting。 遍历列表并检测移动的移动物体和静止物体之间的碰撞 找出运动物体的顶点穿过静止物体的三角形的最短距离(反之亦然)。 find移动物体的边缘通过静止物体的边缘的最短距离。 如果最短的距离是顶点 投影在破损的三角形平面上的位移并find终点。 使用此终点和原点重新计算位移 重新启动迭代 如果最短的距离是顶点 计算这两个边缘在接触点所产生的平面上的位移。 找出这个预测的终点 使用此终点和原点重新计算位移 重新启动迭代 如果没有发现碰撞,则继续迭代 将最终位移应用到移动对象的位置 发现碰撞后重复迭代的原因是为了避免在先前检查的对象中分辨率导致新的碰撞的情况。 为了得到顶点和边的交点,我做了两个方程,两个方程都有M作为我希望应用到移动物体的位移。 所有的资本variables都是Vec3的,彼此Vec3的两个资本是增量AB == B – A 小写variables是标量。 Mat3把Vec3作为列 这是我testing移动的顶点对一个固定的三角形的方程: //Ray: P = M*t + Q //Trianlge: P = A + AB*u + AC*v //Ray-Triangle Intersect: M*t + Q = P = A […]

AABB扫描与体素世界的碰撞反应

我遵循这个教程: 链接 ,我能够使它与3d体素世界的碰撞工作。 但是我遇到的问题是碰撞响应。 我想让玩家在靠墙的时候滑到墙上,而不是卡在每个体素边缘。 这是因为我得到了正常的AABB扫描testing是体素的一部分。 (是的,我正在做广泛的检查首先)。 在上面的图像是我的问题的2D表示。 体素是黑色矩形,蓝色是玩家,红色是扫描检查区,绿色线是法线。 我想到的可能的解决scheme是: – 将体素合并到基于邻居的更大的碰撞盒中,但是当洞出现并且玩家大小增加时,会导致其他问题。 – 如果沿正常方向存在邻居体素,则忽略碰撞正常。 这是我目前在我的代码中,并在地面上滑动墙壁时工作正常,但倒在他们身上时失败: http : //ideone.com/xdsr2d 因为碰撞的次数和碰撞的次序(我在aabb扫描testing后得到的体素和法线的次序)中有许多体素是难以预测的,所以难以确定熔融接缝是否足够好。 我很感激任何帮助,因为我一直在围绕这个问题扑了很长一段时间。 (如果我的问题有任何问题,请告诉我,这是我第一次在gamedev.stackexchange上发帖)

如何在pygame中使用碰撞掩码和overlap_area?

所以,我一直在做一个游戏原型,我一直在使用精灵碰撞,而不是再削减它。 我阅读了有关蒙版和重叠区域的文档: https : //www.pygame.org/docs/ref/mask.html#pygame.mask.Mask.overlap_area 我究竟如何使用它? 该文件说:“这可以用来查看事物碰撞的方向,或者看看两个面罩碰撞的程度,通过有限差分计算重叠区域的梯度,可以find近似的碰撞法线。 我不太理解这个描述。 我怎么能说出碰撞的方向? 返回值实际包含什么? 我将如何实现两个Pygame Sprites与图像和透明度的碰撞? 是否有更深入的解释(最好是带有示例代码)? 我找不到比文档更详细的内容。

两个刚体(不是球)的碰撞分辨率

请帮助碰撞计算。 从现在开始,我有两个刚体,每个都有质量,质心,运动vector(红色),旋转角度(红色)和顶点坐标。 另外,我能够检测到碰撞点(绿色)。 如果有多个碰撞点,我search中心点,并认为是这样。 碰撞计算足够了吗? 如果没有,任何人都可以向我展示良好的手册(或建议)? 从我的角度来看,我应该把运动和旋转力的总和应用到大箱子的碰撞点上,用这个和来影响小箱子,反之亦然。 这是真的,还是我想念什么? 而且,在这个魔法之后,我应该降低两个物体的vector和旋转速度,以模拟碰撞时的动能损失。

如何确定2D碰撞发生的方向?

问题如下: 想想二维塞尔达(链接觉醒,过去的一个链接)风格的运动,你可以从四个基本方向,或基本上,下,左,右碰到墙壁。 我的运动和这些游戏之间的区别是我想允许对角线运动。 例如,当玩家与左边的墙碰撞时,如果他向左上推,我希望他停止向左移动,但是继续向上移动。 我遇到的问题是我的代码当前检测到碰撞是向上和向左的碰撞,所以玩家只是停下来。 我应该采取什么措施来纠正这个问题? bool canCollideLeft = false; bool canCollideRight = false; bool canCollideUp = false; bool canCollideDown = false; if (HeroRect.Left > OldHeroRect.Left) { canCollideLeft = false; canCollideRight = true; } if (HeroRect.Left < OldHeroRect.Left) { canCollideLeft = true; canCollideRight = false; } if (HeroRect.Bottom > OldHeroRect.Bottom) { canCollideUp = false; canCollideDown […]

解决点与移动线之间的碰撞

我正在devise一个二维物理引擎,使用Verlet积分移动点(可以导出下面提到的速度), 约束来表示移动的线段, 连续的碰撞检测来解决移动点和静态线之间的碰撞,以及移动/静态之间的碰撞点和移动线。 我已经知道如何计算这两种碰撞事件的碰撞时间,以及如何解决移动点静态碰撞事件。 但是,我不知道如何解决移动/静态点移动线碰撞。 这里是一个点和移动线碰撞事件的初始条件。 我们有一个由两点A和B连接的线段。在这个瞬间,点P正在碰到AB线。 这些点有单位质量,有些可能有初始速度,除非点P是静态的。 该线是无质量的,并且没有明确的旋转分量,因为A点和B点可以自由移动,因此延长或收缩线(稍后将由约束求解器固定)。 碰撞是无弹性的。 碰撞后最后的速度是多less?

利用摩擦使刚体停止

我想如何将摩擦力应用到物体上,以便在施加力的时候最终减速到零? 这是我的物理对象: 刚体“球体” 碰撞形状:btSphereShape(0.50) 质量:1.0公斤 恢复原状:0.5 摩擦:10.0 刚体“平台” 碰撞形状:btBoxShape(btVector3(23.0,0.5,23.0)) 质量:0.0公斤 恢复原状:0.75 摩擦:1.0 我将btVector3(0,0,-100)的中心力施加在按键“W”上。 球体移动但从未停止。 还有什么我应该考虑的? 球体不是滚动的(力量在中心),阻尼不能被使用,因为它减缓了任何力量,甚至重力。 我曾经尝试过: 增加了平台的质量。 我将线性和角度因子设置为(0,0,0),因此平台不会受到任何作用力的影响。 应用总施加力的负面。 我得到了一个工作结果,但不是我想要的。 如果我有摩擦,物体会更加现实地减速

Unity2D确定两个碰撞实体之间度数的最佳方法是什么?

我试图确定两个对象之间的碰撞方向。 我将利用这个来进行各种各样的事情,例如创建与另一个实体到达某个实体的地点成比例的特定方向的血液实体。 什么是最好/最有效的方式来做到这一点? 我一直这样做,但似乎不稳定/不工作。 假设两个实体都是中心旋转的,我使用三角函数来查找角度。 ATAN(B / A)。 出于某种原因,输出角度似乎是相当随机的。 这是我做的方法: protected void checkCollisionDirection(Collision2D target) { Vector3 positionDifference = target.gameObject.transform.position – gameObject.transform.position; int quadrant = 0; float x = positionDifference.x; float y = positionDifference.y; float degrees = Mathf.Atan (y / x) * Mathf.Rad2Deg; if (positionDifference.x > 0 && positionDifference.y > 0) { quadrant = 1; } […]