首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Libgdx3D中的RayCasting

Libgdx3D中的RayCasting
EN

Stack Overflow用户
提问于 2014-07-28 13:23:49
回答 2查看 4.8K关注 0票数 5

好的,我已经尝试了相当长的一段时间,在libgdx中进行光线投射,根据我正在寻找的位置进行3d碰撞检测。但是我画了一片空白,似乎没有任何文档。有没有人能把我送到正确的方向?

EN

回答 2

Stack Overflow用户

发布于 2014-07-28 13:45:26

实际上,使用libgdx可以很容易地实现您想要做的事情。下面是我用来做光线测试,找出我的光线会撞到的最近的碰撞物体。让我们假设它位于一个名为BulletUtil的类中。

代码语言:javascript
运行
复制
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;
}

现在,您还需要一个对单击事件做出反应的InputProcessor

代码语言:javascript
运行
复制
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;
    }
}

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

票数 8
EN

Stack Overflow用户

发布于 2015-12-23 19:09:35

@noone在你的代码中,有两行代码对我不起作用。可能会被弃用?

代码语言:javascript
运行
复制
callback.getRayFromWorld().setValue(rayFrom.x, rayFrom.y, rayFrom.z);
callback.getRayToWorld().setValue(rayTo.x, rayTo.y, rayTo.z);

我已将它们更改为

代码语言:javascript
运行
复制
  Vector3 rayFromWorld = new Vector3();
  rayFromWorld.set(rayFrom.x, rayFrom.y, rayFrom.z);
  Vector3 rayToWorld   = new Vector3();
  rayToWorld.set(rayTo.x, rayTo.y, rayTo.z);

这使得整个函数工作起来像一个护身符。

我发现的另一件事是,你必须激活body (由该函数返回)才能对其施加力。大多数僵硬的身体在一段时间后被设置为睡眠,ClosestRayResultCallback不会唤醒它们。

代码语言:javascript
运行
复制
btCollisionObject target = CollisionUtils.rayTest(dynamicsWorld, ray);
//test for collisionflags and stuff here
//and if your target is instance of btRigidBody
btRigidBody body = (btRigidBody)target;
body.activate();
body.applyCentralForce(ray.direction.scl(50000));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24988852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档