【问题标题】:Can someone explain me how rayCast works?有人可以解释一下 rayCast 的工作原理吗?
【发布时间】:2016-12-26 05:01:09
【问题描述】:

我正在学习 libgdx 和其中一件真正让我困惑的事情是它的光线投射。我阅读了如何使用它的教程并且我理解它,但我真的很想知道后面是什么。我搜索了这个方法的源码。

public void rayCast (final RayCastCallback callback, float point1X, float point1Y, float point2X, float point2Y) {   // FIXME pool RayCastCallback?
    world.raycast(new org.jbox2d.callbacks.RayCastCallback() {
    @Override
    public float reportFixture (org.jbox2d.dynamics.Fixture f, Vec2 p, Vec2 n, float fraction) {
        return callback.reportRayFixture(fixtures.get(f), point.set(p.x, p.y), normal.set(n.x, n.y), fraction);
    }
}, this.point1.set(point1X, point1Y), this.point2.set(point2X, point2Y));

} 我们如何看到这个方法递归地调用自己并返回对回调变量的reportRayFixture的调用。真正让我感到困惑的是代码从哪里选择夹具,以及它如何检查每个夹具。谁能解释一下它的工作原理。

这是源代码页https://github.com/libgdx/libgdx/blob/master/extensions/gdx-box2d/gdx-box2d-gwt/src/com/badlogic/gdx/physics/box2d/gwt/emu/com/badlogic/gdx/physics/box2d/World.java

我会很感激的!

【问题讨论】:

  • 您正在查看错误的代码(除非您使用的是 gwt)。您所指的代码用于 gwt 后端,这是使用 jbox2d 的特殊情况。所有其他后端只使用普通(本机)box2d 库。

标签: java libgdx game-physics


【解决方案1】:

Raycasting 是当我们在空间中绘制一条看不见的线并查看它与什么相交时。这样做的一个常见用途是弄清楚玩家正在点击什么——我们从相机沿玩家点击的方向画一条线,我们的线接触的第一个对象就是玩家点击的线。

在 Box2D 中,RayCastCallback 接口用于允许您编写代码,当您的光线击中夹具时执行(例如,您可能希望忽略某些夹具)。我没有亲自使用过,但我想你可以在射击游戏中使用类似的东西来查看穿墙武器是否可以击中墙后的物体(或类似的东西)。

在高层次上,这段可爱的代码正在做的事情有点轻微——如果你仔细观察它,它所做的就是在libGDX RayCastCallback 并将其包装在 JBox2D RayCastCallback 中,该 API 略有不同。它更像是重载方法而不是递归调用它。

我不知道的是为什么作者选择创建 Point1 和 Point2 实例变量。我想如果你有多个灯具,它们会被覆盖,所以也许它们应该包含被射线击中的最后一个灯具?即便如此,看起来多个光线投射会覆盖它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2016-09-11
    • 1970-01-01
    • 2021-08-02
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多