与基因座网格碰撞

时间:2012-09-10 18:52:48

标签: javascript graphics geometry mesh

我想避免我的球员站在墙内。每个游戏勾选我的玩家移动一些小距离和/或旋转。

TL; DR请提供经典线段 - > -triangle交叉算法的变体,它也可以返回近乎未命中,或以其他方式解决问题 如果线段在三角形的给定距离内通过,则线段相交。这个问题有很多细微之处,例如三角形的轨迹角是圆角的,如果线段与三角形相切。

我有通常的光线/三角交叉码。

然而,射线是一个非常差的移动玩家近似!我有玩家中心缺失边缘但玩家网格穿过它们的问题。

如何有效地确定玩家在3D环境中与墙壁和障碍物碰撞的时间和位置?

一种通用的方法是使用近似未命中的三角形代码,其中光线是一个球形圆柱体。

我尝试制作的一般解决方案是想象玩家是一个球体;从内向外翻转,我试图制作一个比实际墙壁大半径的网格,并对其进行碰撞。我想计算一个在这个网格前面有一定距离的网格,即一个立方体会扩展成一个稍大的立方体,带有圆角和边角。 (我的网格比一个立方体更不规则。想象一下锅炉房内部的网格表示,想象一下,计算一个距离所有墙壁和锅炉和门框20厘米的网格,在那个房间里。)这是一个围绕桶的简单网格:

enter image description here

对于每张脸,我都可以计算表面法线;这就是我怎么知道哪种方式'出'。

我的头脑风暴让我想象将每张脸的法线乘以固定的距离,然后发出一个带有相应偏移的三角形。

然而,这会在边缘留下孔,并且可能会(?)导致一些边缘穿过非常紧的锐角?

我也可以想象将每个边缘连接成球形圆柱体等等。

我用于上面的桶的方法是计算共享顶点的所有面的平均法线,然后将其乘以碰撞半径。它不能很好地应对锐角,如果在相对的两面之间错误地共享顶点该怎么办?

我将在Javacsript中计算此网格,然后执行光线交叉。所以性能也是一个考虑因素。在进行碰撞检测时,太精细的细网格将是昂贵的。

如何有效地计算出足够好的基因座网格?或者做loci感知模糊三角交叉?或者有更好的方法来进行碰撞,并且能以某种方式模拟物体以弧线而不是直线移动吗?

1 个答案:

答案 0 :(得分:0)

(没有人拿到赏金:{Nathan Reed on gamedev.stackexchange帮助了术语。它被称为胶囊三角交叉点。)

令人惊讶的棘手的数学和谷歌搜索并没有找到太多现成的代码来复制。

standard way按半径挤出三角形,并添加三个三角形边缘作为胶囊。

要挤出三角形,只需将三角形的法线乘以胶囊半径,将每个三角形角度偏移该量,然后对其进行正常的线段三角形测试。

每个三角形边缘的胶囊测试相当昂贵,因为你必须做三次。使用三角形测试中的重心坐标可能有助于避免一些胶囊边缘测试,但我没有想到这一点。您还可以避免在与其他足够钝的三角形共享的边缘上进行胶囊测试;你可以计算出来并标记这些边缘。我还没有打扰(还)。

我发现预先计算每个面的边界球并与胶囊的边界球进行交叉测试是一种超级便宜的方法,可以避免在大多数时间进行这种昂贵的测试。我也预先计算每张脸的法线,虽然这是一个较小的胜利。

由于测试非常昂贵,最好的办法是将玩家视为单个球体,并让交叉码给出一个面部交叉点列表。然后,您可以将玩家建模为一系列在地层中飞行的较小球体,并且您只需要对第一次通过较大球体的面部进行胶囊面交叉代码。