Libgdx 3d 中的光线投射

5 java collision-detection libgdx raycasting

好吧,所以我也已经尝试了很长一段时间,在 libgdx 中的 Raycast 用于基于我看的位置进行 3d 碰撞检测。但我画了一个空白,似乎没有任何文档。有人会好心地把我送到正确的方向吗?

noo*_*one 8

使用 libgdx 实际上很容易实现您想要做的事情。以下是我用来进行光线测试并找到我的光线会击中的最近碰撞对象的内容。让我们假设它位于一个名为BulletUtil.

private static final Vector3 rayFrom = new Vector3();
private static final Vector3 rayTo = new Vector3();
private static final ClosestRayResultCallback callback = new ClosestRayResultCallback(rayFrom, rayTo);

public static btCollisionObject rayTest(btCollisionWorld collisionWorld, Ray ray) {
    rayFrom.set(ray.origin);
    // 50 meters max from the origin
    rayTo.set(ray.direction).scl(50f).add(rayFrom);

    // we reuse the ClosestRayResultCallback, thus we need to reset its
    // values
    callback.setCollisionObject(null);
    callback.setClosestHitFraction(1f);
    callback.getRayFromWorld().setValue(rayFrom.x, rayFrom.y, rayFrom.z);
    callback.getRayToWorld().setValue(rayTo.x, rayTo.y, rayTo.z);

    collisionWorld.rayTest(rayFrom, rayTo, callback);

    if (callback.hasHit()) {
        return callback.getCollisionObject();
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

现在你还需要一个InputProcessor对点击事件做出反应的东西。

public class BulletInputProcessor extends InputAdapter {

    private Viewport pickingViewport;
    private btCollisionWorld collisionWorld;

    // a constructor which takes a Viewport and the collision world and stores them
    public BulletInputProcessor(...) { ... }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        if (button == Input.Buttons.LEFT) {
            Ray pickRay = pickingViewport.getPickRay(screenX, screenY);

            btCollisionObject body = BulletUtil.rayTest(collisionWorld, pickRay);
            if (body != null) {
                // do whatever you want with this body now
                return true;
            }
        }

        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

Viewport负责创建采摘Ray。您应该在这里使用视口来管理PerspectiveCamera您用来渲染世界的视口。不要忘记通过 注册输入处理器Gdx.input.setInputProcessor(new BulletInputProcessor(collisionWorld, viewport))