我想避免我的播放器能够站在墙内。每场比赛我的玩家都会移动一些小距离和/或旋转。
TL;DR请提供经典线段->-三角形相交算法的变体,它也返回接近未命中,或以另一种方式解决问题 如果线段在三角形的给定距离内通过,则线段相交。这个问题有很多微妙之处,例如三角形的轨迹角是圆形的,以及线段是否与三角形相切。
我有通常的射线/三角形相交代码。
然而,射线是移动玩家的非常差的近似值!我有玩家的中心缺失边缘的问题,但玩家网格穿过它们。
在 3D 环境中,您如何有效地确定玩家何时何地与墙壁和障碍物发生碰撞?
一种通用的方法是使用接近未命中的三角形代码,其中光线是一个球帽圆柱体。
我尝试过的一般解决方案是把玩家想象成一个球体;把它翻过来,我试图制作一个半径大于实际墙壁的网格,并在上面做碰撞射线。我想计算一个在这个网格前面有一些固定距离的网格,即一个立方体将扩展为一个略大的立方体,具有圆角的边缘和角落。(我的网格比立方体更不规则。想象一个锅炉房内部的网格表示,并想象尝试计算一个距离该房间所有墙壁、锅炉和门框等 20 厘米的网格。)这是一个围绕桶的简单网格:
对于每个面,我可以计算表面法线;这就是我知道哪种方式“出局”的方式。
我的头脑风暴让我想象将每个面的法线乘以固定距离,然后发出一个具有相应偏移的三角形。
然而,这会在边缘留下孔洞,并且可能(?)导致一些边缘穿过非常紧的锐角?
我也可以想象将每个边缘连接为球端圆柱体,依此类推。
我对上面的桶使用的方法是计算共享一个顶点的所有面的平均法线,然后将其乘以碰撞半径。它不能很好地处理锐角,如果顶点在相对侧的面之间错误地共享怎么办?
我将在 Javacsript 中计算这个网格,然后执行射线相交。所以性能也是一个考虑因素。过于精细的网格在进行碰撞检测时会很昂贵。
如何有效地计算足够好的轨迹网格?还是做位置感知模糊三角形相交?或者有没有更好的方法来进行碰撞,它能否以某种方式模拟事物以弧线而不是直线移动?