LibGDX 3D:我想要一些与AABB的基本碰撞,而不使用子弹物理

时间:2017-03-05 12:36:02

标签: java 3d libgdx

我的游戏基本上是3D地下城探索游戏。玩家是一个长方体,它可以碰撞的一切是一个在网格中对齐的立方体

目前,玩家可以在这个地牢中移动并且一切正常:他们可以移动,但他们也可以穿过墙壁!

每当玩家移动时(即当他们向前,向后,向左或向右按​​压时)都会进行碰撞处理。这是他们向前推进时的代码。

if (Gdx.input.isKeyPressed(forwardKey)) {
    float totalMove = -moveVelocity; // Total directional movement amount
    /* Therefore ... */ float eachMove = (totalMove / moveParts);
    System.out.println(eachMove);

    for (int i = 0; i < moveParts; i++) {
        BoundingBox newBounds = new BoundingBox(bounds);

        newBounds.set(
                newBounds.min.add(0, 0, -eachMove), 
                newBounds.max.add(0, 0, -eachMove));

        boolean done = false, willCollide = false;
        for (Wall w : Main.currentLevel.getFlattenedWallsArrayList()) {
            if (tryCheckCollision(newBounds, w.getBounds())) {
                // Iff it will collide
                willCollide = true;
                done = true;
            }
            if (done) break;
        }
        if (!willCollide) {
            newVelocity.z += eachMove;
        }
    }
}

所以这种作品,但一点也不好:你可以前进,当你遇到一堵墙时,你会停下来。然而,当你试图从墙上移回时,你不能 - 这让我相信玩家走得太远了,但是我看不出这是怎么可能的。

我碰撞时需要做的另一件事是,当有人碰到一堵墙时,他们不只是停止,如果他们看起来像那样,他们应该继续独自移动墙壁方向。

我确信这可以通过子弹物理学来实现,但我不想使用它,因为它似乎比它的价值更多的努力,因为我的世界由对齐的立方体组成。

TL; DR:我需要一些方法来编程播放器的碰撞,而不使用子弹物理。

编辑:以下是tryCheckCollision方法:

private boolean tryCheckCollision(BoundingBox checkBounds, BoundingBox collisionBounds) {
    Vector3 center = Vector3.Zero.cpy();
    collisionBounds.getCenter(center);

    if (distanceTo(center) <= maxCollisionCheckDistance) {
        return checkBounds.intersects(collisionBounds);
    }

    return false;
}

编辑:此外,bounds是玩家的边界框。我使用这个来更新每一帧:

instance.calculateBoundingBox(bounds);
bounds.mul(instance.transform);

0 个答案:

没有答案