1

很久很久以前,我一直在搞砸这种碰撞响应。我想我会问你们一些指导。

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

这个 JSBin 展示了我目前拥有的东西。我可以四处走动,当我撞到箱子时,我不会走低谷,我会滑过箱子。有两个问题:

  1. 向左滑行,一切顺利,向右滑行开始“跳跃”;
  2. 有时在碰撞 20 秒后,球体会穿过盒子。我认为这可能与我在向右滑行时遇到的“跳跃”有关。

快速解释我的方法

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

如果有人有更好的方法,请告诉我。当我在解释我的代码时,这似乎会更有效,但请告诉我:)

提前致谢!

4

2 回答 2

2

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

否则你也可以使用私有函数scene._getNewPosition直接使用碰撞引擎

于 2014-05-05T15:33:51.873 回答
2

我已经解决了我遇到的问题。这是任何需要它的人的代码:)

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;

}
于 2014-05-05T19:15:34.147 回答