7

我想避免我的播放器能够站在墙内。每场比赛我的玩家都会移动一些小距离和/或旋转。

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

我有通常的射线/三角形相交代码。

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

在 3D 环境中,您如何有效地确定玩家何时何地与墙壁和障碍物发生碰撞?

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

我尝试过的一般解决方案是把玩家想象成一个球体;把它翻过来,我试图制作一个半径大于实际墙壁的网格,并在上面做碰撞射线。我想计算一个在这个网格前面有一些固定距离的网格,即一个立方体将扩展为一个略大的立方体,具有圆角的边缘和角落。(我的网格比立方体更不规则。想象一个锅炉房内部的网格表示,并想象尝试计算一个距离该房间所有墙壁、锅炉和门框等 20 厘米的网格。)这是一个围绕桶的简单网格:

在此处输入图像描述

对于每个面,我可以计算表面法线;这就是我知道哪种方式“出局”的方式。

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

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

我也可以想象将每个边缘连接为球端圆柱体,依此类推。

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

我将在 Javacsript 中计算这个网格,然后执行射线相交。所以性能也是一个考虑因素。过于精细的网格在进行碰撞检测时会很昂贵。

如何有效地计算足够好的轨迹网格?还是做位置感知模糊三角形相交?或者有没有更好的方法来进行碰撞,它能否以某种方式模拟事物以弧线而不是直线移动?

4

1 回答 1

0

(没有人获得赏金 :( gamedev.stackexchange 上的 Nathan Reed帮助使用了术语。它被称为胶囊三角形交叉点。)

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

一种标准方法是按半径挤压三角形,并将三个三角形边缘中的每一个都添加为胶囊。

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

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

我发现预先计算每个面的边界球并与胶囊的边界球进行交叉测试是一种非常便宜的方法,可以在大多数情况下避免这种昂贵的测试。我还预先计算了每张脸的法线,尽管这是一个较小的胜利。

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

于 2012-09-20T09:03:10.507 回答