BabylonJS:碰撞检测

BabylonJS: Collision detection

本文关键字:碰撞检测 BabylonJS      更新时间:2023-09-26

我一直在摆弄这个碰撞响应很久了。我想我应该请你们给点指导。

http://jsbin.com/qoyuciti/1编辑链接:http://jsbin.com/qoyuciti/1/edit?html(只知道你不能在jsbin编辑模式下使用移动键(据我所知))

这个JSBin显示了我现在所拥有的。我可以四处移动,当我碰到盒子时,我不会滑过盒子。有两个问题:

  1. 向左滑动,一切正常,向右滑动,开始"跳跃";
  2. 有时候在碰撞大约20秒后,球体会穿过盒子…我想这可能与我右滑时所经历的"跳跃"有关。

快速解释我的方法

用户开始行走,当i与方框相交时,i开始测试球体前方180度圆锥体的相交(用户前进的方向)。一旦它找到一个空的位置,它就会把玩家放在那里。

如果有人有更好的方法,请告诉我。当我解释我的代码,它似乎可以更有效,但让我知道:)

提前感谢!

你也许可以使用内部碰撞系统,但创建一个假的自由相机,并添加你的球体作为相机的子。然后你可以使用按键移动摄像机,babylonjs会自动为你计算碰撞

否则,您也可以使用私有函数场景。直接使用碰撞引擎

我已经修复了我遇到的问题。这里的代码供任何需要的人使用:)

var intersect = box.intersectsPoint(player.position);
if (intersect) {
    var x = prevX,
        z = prevZ,
        slideSpeed = speed * 0.7;

    for (var angle = 0; angle > -90; angle -= 1) {
        x = prevX - Math.sin((direction - angle) * Math.PI / 180) * slideSpeed;
        z = prevZ - Math.cos((direction - angle) * Math.PI / 180) * slideSpeed;
        var intersect = box.intersectsPoint(new BABYLON.Vector3(x, player.position.y, z), true);
        if (!intersect) {
            break;
        }
        x = prevX - Math.sin((direction + angle) * Math.PI / 180) * slideSpeed;
        z = prevZ - Math.cos((direction + angle) * Math.PI / 180) * slideSpeed;
        var intersect = box.intersectsPoint(new BABYLON.Vector3(x, player.position.y, z), true);
        if (!intersect) {
            break;
        }
    }
    player.position.x = x;
    player.position.z = z;
}