FPS 游戏中的碰撞检测使用三个.js

Collision Detection in FPS Game using three.js

本文关键字:三个 js 游戏 碰撞检测 FPS      更新时间:2023-09-26

我最近一直在尝试修复我的第一人称射击游戏三.js游戏中的碰撞检测,但还有一些问题我什至不知道如何解决......

  • 摄像机可以查看墙壁内部
  • 碰撞会定期将玩家推离地图

我这里有一个jsfiddle:http://jsfiddle.net/sxv5fwL4/95/

而且我也收到了关于帖子下的三个.js subreddit的一些建议......

"Use of the "stemkoski" collision detection?"

我提前感谢您的时间,并感谢/u/stovenn 在我的 reddit 帖子中提供的帮助。

我认为 /u/stovenn 谈到了这个 git http://stemkoski.github.io/Three.js/

根据线程 如何在三个.js中检测碰撞? 在 stemkoski git 中是三个碰撞检测的工作示例.js

这个jsfiddle0(更新版本见答案末尾)是所引用版本的黑客版本。 地图存在一个问题,我已经通过将其阅读为[u][v]并映射编辑:(u-->z和v-->x)来解决。 现在,代码中地图的布局与模拟中地图的布局相同。

我使用了一个非常简单的"边界框中的(2D)点"碰撞测试。 它基于测试玩家在每个动画步骤中建议的新位置是否位于墙立方体的 x 范围和 z 范围内。 如果是这样,则建议的位置将被拒绝,并且玩家先前的(存储)位置将重新恢复。

这是核心代码:-

if (   tile_x_min <= player_pos_x && player_pos_x <= tile_x_max
    && tile_z_min <= player_pos_z && player_pos_z <= tile_z_max )                              
{
collision_flag = true;
player.velocity.x = 0;
player.velocity.z = 0; 
Message = "IN Wall Cell [" + x + "," + z +  "]" +
"(x:" + tile_pos_x + ", z:" + tile_pos_z + ")";                                           
}   

我在玩家位置使用了一个小的辅助立方体("eddie"),并将相机向后移动了一点以使其可见。 这对排除故障有很大帮助。

无论如何,如果您愿意,请尝试一下,并让我知道它是怎么回事。

编辑(1) jsfiddle1 添加播放器/摄像机的简单旋转。 使用键numpad_7和numpad_9左右旋转。

编辑 (2) jsfiddle2 响应同时按下的多个键。 此外,使用 eddie.visible = false 隐藏了 eddie cube。

编辑(3) jsfiddle3 添加了独立的相机旋转:向上-居中-向下(使用小键盘键 2,5,8)。 播放器+相机水平旋转是通过小键盘键4,6。

我正在使用Ammo.js,这是伟大的子弹物理库的插件端口。这是一个专业的开源集合检测库。

这是我创建的示例:physics.autodesk.io

可能对某人有用。