Xna 块世界碰撞检测

Xna 块世界碰撞检测,xna,collision,Xna,Collision,我目前正在XNA的block world引擎上工作,无法使碰撞检测和处理正常工作。世界在一个以(z*width*width+y*width+x)索引的数组中,包含由字节表示的不同块。一切都很好。至少我是这么想的 我尝试了不同的碰撞处理技术,目前我正在使用一个版本,其中我计算玩家/摄影机的方向,在将其添加到位置之前,我检查每个单独的向量(x、y和z),以半个单位的偏移(以补偿块大小1.0)与世界,并且仅在结果为零时应用它。到现在为止,一直都还不错。现在,当我径直走进一个角落时,问题就出现了,因为x

我目前正在XNA的block world引擎上工作,无法使碰撞检测和处理正常工作。世界在一个以(z*width*width+y*width+x)索引的数组中,包含由字节表示的不同块。一切都很好。至少我是这么想的

我尝试了不同的碰撞处理技术,目前我正在使用一个版本,其中我计算玩家/摄影机的方向,在将其添加到位置之前,我检查每个单独的向量(x、y和z),以半个单位的偏移(以补偿块大小1.0)与世界,并且仅在结果为零时应用它。到现在为止,一直都还不错。现在,当我径直走进一个角落时,问题就出现了,因为x轴和z轴在我进入立方体一点之前不会相交/碰撞

那么,我如何正确地计算块世界中的碰撞检测和处理呢

我真的希望在这个问题上有一些意见,最好是在更高的/概念性的层面上,但当然也欢迎代码示例



为了进一步解释我的情况,根据@A-Type的回答:

所以,让我们在这里更准确地帮助我理解你。我的角色在每个方向上只有一个大单位,这应该会让事情变得更容易

首先,你认为我应该首先更新我的角色位置,然后检查冲突吗?这将是我比较喜欢的碰撞检测方法,但如果更容易的话,我会先检查,如果可能的话再移动

我知道玩家只能与8个立方体相交(在你的例子12中),取整似乎也是一个很好的主意,但我不太明白从12个立方体(在你的例子中,我的是8个立方体)到3个立方体的过渡。这是否会导致角色立方体的角点不被考虑的问题

我曾尝试实现这一点,但失败了,所以我认为更多的理论可能会实现这一点。(实际上,我已经让碰撞检测开始工作,但在这些情况下,我完全失去了速度,而不仅仅是在碰撞方向。)



谢谢你的时间!
Karl

利用您的世界格式创建比检查每个块更有效的碰撞算法

假设你的区块有一个3D字节数组,0是一个空白,我强烈建议你将玩家的位置四舍五入到你的世界中的一组网格空间中,并检查这些空间是否不是0。然后对非空块执行冲突处理代码

例如,如果您的角色高度为2,宽度/深度为1(如Minecraft中的Steve),则他最多可以同时与12个网格空间相交(4个在头部上方,4个在腰部周围,4个在脚部下方),至少2个(如果他与网格完全对齐)

将角色的主体转换为网格术语。将角色的位置四舍五入为网格单元,然后检查其周围的12个空格(如果他是2x1)。如果任何块不为空,请在这些块和角色之间执行冲突解决。检查哪些相邻块取决于圆角的方向。例如,如果角色的位置为(3.4、2.7、1.1),则可以将其四舍五入为(3、3、1),然后检查在X方向上大于1、在Y方向上小于1、在Z方向上大于1的块,因为您分别向下、向上和向下四舍五入


我希望这是可以理解的。如果没有,请发表评论。我不知道为什么,但我似乎不能像我应该解释的那样解释这个概念,特别是因为我已经做了差不多一年了。

好吧,让我们再来一次。在任何有效的系统中,碰撞检测都有两个基本阶段。有宽相位和窄相位,如果你愿意的话。宽相位使用不准确但廉价的方法来确定两个对象是否可以相交,并将其传递到窄相位。狭义相位取两个候选物体,并应用更复杂的物理来调解碰撞

对于基于网格的世界,我们有一种非常简单且有利的方法来处理宽相位碰撞。这就是网格本身。我们可以根据球员的位置和大小来确定他可能要穿越的8个街区(从现在起我们将使用你的案例)。注意,在我最初的回答中,看起来我是在说把它缩小到3个块——我把它变得比需要的更复杂,特别是对于1个块的字符。最简单的方法是:将角色的中心四舍五入到栅格的,即8个块的角相交处。然后选择这8个块进行窄相位测试。确保使用中点舍入,而不是使用整数时的默认地板舍入。即,如果值为1.53,则应舍入为2,1.49999舍入为1

现在,狭隘的阶段,我没有真正涵盖太多。你问我是先搬家还是后搬家,我想你需要先搬家。我不是物理模拟的大师,但我知道你首先要计算碰撞的方向(角色中心减去块中心)。深度是这个向量的长度。如果块的宽度为1,则不希望该长度小于1;这表明它们是相交的(基本上是相交的)

现在,有很多方法可以从碰撞中“恢复”对象。我建议确定物体碰撞最少的轴。也就是说,如果碰撞方向向量的X分量最小,则意味着您的玩家在X方向上离碰撞最近。在该方向上施加与X方向碰撞深度成比例的反向力。或者,如果您选择,只需将角色的位置设置为您想要的距离,而不必考虑力。但你只会想要我