Articles of 碰撞检测

我应该使用哪种types的碰撞检测?

所以在过去的一周里,我一直在摸索SAT(分离轴定理)。 我知道它是如何工作的,但似乎无法得到正确的C#代码。 总是有一个面孔或边缘让我的球员穿越障碍。 所以我想知道,如果我正在采取艰难的方式,我不需要SAT来达到我想达到的目标。 我的游戏涉及: – 三维立方体有时会在一个角度(不是90的倍数) – 没有太多的立方体(所以我不需要我的碰撞检测太便宜) – OBB碰撞 那么对于我来说碰撞的最好的select是什么? 如果SAT是我的select,它将在C#中看起来像什么? 编辑 我的星期六代码: var n1 = (bb1.BCK_TOP_LFTCorner – bb1.BCK_BTM_LFTCorner).Normalized(); var n2 = (bb1.BCK_BTM_LFTCorner – bb1.BCK_BTM_RGTCorner).Normalized(); var n3 = (bb1.FRT_BTM_LFTCorner – bb1.BCK_BTM_LFTCorner).Normalized(); var n4 = (bb2.BCK_TOP_LFTCorner – bb2.BCK_BTM_LFTCorner).Normalized(); var n5 = (bb2.BCK_BTM_LFTCorner – bb2.BCK_BTM_RGTCorner).Normalized(); var n6 = (bb2.FRT_BTM_LFTCorner – bb2.BCK_BTM_LFTCorner).Normalized(); var norms = new […]

碰撞检测和边界框创建

我正在尝试创建边界框。 我的目标不是用x,y和z坐标来创建它们。 但是,我会加载一个模型或者渲染一个形状 – 比如飞机。 那么algorithm应该能够在它周围创建有效的边界框。 我在编写opengl。 你能帮我解决吗?

如何从图像中获取一个2Dvector地形以进行Java碰撞检测?

我正在尝试使用如下所示的地形来制作2D纯Java游戏。 在之前的游戏中,我使用了基于瓷砖的collsions,但现在我想使用基于vector的collsions,因为不平坦的地形需要小块瓷砖。 我想知道的是,我如何从上图中获取vector,以及如何使用它们。 对于第一部分,我可以手动测量每个坐标,如下所示,但特别是对于更详细的更详细的地图,这将是一个巨大的工作量。 我想知道是否有办法做到这一点更容易。 我见过的工具可以让你在图像上绘制vector,但是这些工具只能导出到像Box2D和Unity这样的引擎,这些引擎是用不同的代码语言编写的。 正如我之前所说,我只想使用Java。 对于第二部分,如果我有vector的坐标,我该怎么处理它们呢? 我以前使用矩形,但现在我需要使用连接每个坐标的线或多边形。 另外,如何检查玩家的多边形或矩形与形成地形的多边形或线条之间的碰撞? 当使用长方形时,我可以使用playerR.Intersects(terrainR) ,但我怎样才能做到这一点与地形? 一个易于理解的教程的链接也是一个很好的答案,特别是对于我的问题的最后一部分。 提前致谢。

团结,如何检测跳后着陆?

如何检测播放器的着陆,而不会通过onGround检查中断? 我有两个脚本,一个是正常的玩家脚本,另一个是我正在尝试的。 在onGround脚本中,当我跳到位于播放器下方的时候激活对撞机,当我不再按下跳转button时,它将再次禁用对撞机,这将检查我是否着陆。 这是工作,但当我跳,按快S,你会听到更多的只是一次登陆声音,但是当我跳高并按住S 2秒,然后下推到地面的声音出现一次。 所以我的想法是如何在最后一句没有问题的情况下正确检查着陆。 而下推()代码就是当我在空中跳跃并按下S的时候撞到地面的。 总结一下,我想正确检查着陆。 玩家代码: public class PlayerScript : MonoBehaviour { //MOVEMENT public float moveSpeed; public float pushDownForce; //PUSHDOWN public GameObject pushDownParticle; bool pushdown; private Vector3 offset; public GameObject lander; private AudioSource audo; public AudioClip audoClip; public Transform checkGround; //JUMP public bool onGround; bool onLand; public float jumpPressure; private float minJump; […]

爪哇 – 同时地面和墙壁碰撞

我一直在研究一个基于Line2D的碰撞系统: public void update() { for (int i = 0; i < lines.size(); i++) { line = lines.get(i); if (line.line.intersects(player.hitbox)) playerCollision(); } } public void playerCollision() { if (Math.abs(line.angle) <= 45) { player.jumped = false; if (player.speedY > 0) player.speedY = 0; // inefficient? while (line.line.intersects(player.hitbox)) { player.centerY–; player.hitbox.setRect(player.centerX – player.WIDTH / 2, player.centerY – […]

多边形圆碰撞algorithm不起作用

编辑:更新的代码和video 我一直在研究我的碰撞检测系统的最后一个部分 – 多边形 – 圆形碰撞方法。 我几乎在那里,但有一些小问题,似乎popup与它。 我将解释我所看到的一些事情,但是看下面这个简短的video可能更容易: https://1drv.ms/v/s!AjUDP95TjAMqje8AVA0LpPfeszVYoA 有三件事我看到: 当坡度下降的时候有一点颠簸(我猜我只需要平滑一点运动调整 在绕过某些角落时,调整距离得到错误计算,结果是: 一点多余的距离 大量的多余的距离 下面是我的代码的主要组成部分,很高兴更新post,并添加任何其他相关的代码块,使需要。 任何援助与此将不胜感激。 谢谢! 物理世界更新方法: IEnumerable<PhysicsFixtureBase> results = this.physicsTree.Query(fixture); foreach (PhysicsFixtureBase otherFixture in results) { Vector3 adjustment = Vector3.Zero; if (fixture.Body != otherFixture.Body && fixture.Intersects(otherFixture, out adjustment)) { this.OnContact(fixture, otherFixture); body.SetVelocity(Vector3.Zero); body.MovePosition3D(adjustment); } } 主要交叉点方法: public static bool Intersects(PhysicsCircleFixture circle, PhysicsPolygonFixture otherPolygon, […]

在碰撞时弹跳一次

我有BoxCollider2D和EdgeCollider2D,我怎样才能使BoxCollider2D只从EdgeCollider2D反弹,只有一次?

二维碰撞检测问题

同时让我的游戏名为“尼莫鱼之旅”,我偶然发现了一个碰撞检测问题。 请帮我解决它。 问题在于:程序只运行第一个if语句,在不考虑发生什么types的碰撞的情况下调整玩家的坐标。 这是我的代码: short int py = player.getPosition().y; short int px = player.getPosition().x; short int pw = player.getGlobalBounds().width; short int ph = player.getGlobalBounds().height; for (int i = 0; i < block.size(); i++) { short int by = block[i].getPosition().y; short int bx = block[i].getPosition().x; short int bw = block[i].getGlobalBounds().width; short int bh = block[i].getGlobalBounds().height; if […]

如何从A转移到B,检查和修复命运?

我只find检查两条线之间碰撞的公式。 但是从来没有关于行动,从一个点到另一个点的一个固定点。 我需要从pA移动到pB,如果在一条线(墙)上碰撞,在墙前移动到固定的新命运点。 在哪里find这个和/或哪个是公式?

IntersectMovingAABBAABB奇怪的行为

我正在使用“ Realtime Collision Detection ”一书中的IntersectMovingAABBAABB实现,我遇到了一些问题。 当我有两个相邻的AABB(不接触),A是静止的,B在上下移动时,我得到的结果是有碰撞。 显然这是错误的。 _______ _______ | | | | | A | | B | B moving up/down |_______| |_______| 我已经多次重新检查过我的代码,以确保我拥有与本书中相同的内容。 通过代码,我意识到,当直线向上或向下移动时,对于X或Z轴, v[i] < 0和v[i] > 0永远不会是真的。 因此,不会检查这些轴上的交点。 我发现这很奇怪,我想知道我是否错过了一些东西,或者这个代码简直太糟糕了。 这里是我的实现供参考: public static bool IntersectMovingAABBAABB(AABB a, AABB b, Vector3 va, Vector3 vb, out float first, out float last, out BlockFace face) { […]