LibGDX - 如何检测是否单击了3d对象?

时间:2015-11-22 06:36:43

标签: java libgdx

我正在尝试制作一些简单的代码来检测模型是否被点击。到目前为止,我见过的最好的方法是在网格周围创建一些矩形并使用Gdx.input.justTouched()进行检测以获取x,y坐标,然后检查矩形contains是否返回了坐标justTouched()

我不知道是否有更好的方法可以做到这一点,某种网状onClick监听器或LibGDX已经存在的我不知道的东西(我一直在搜索Google和javadocs但我不能似乎找不到任何东西)。我真的不需要处理z轴坐标,至少我不这么认为。我只有一个PerspectiveCamera并且它不会移动那么多(不确定这是否重要?)

无论如何,在我的render()方法中我有:

if (Gdx.input.justTouched()) {
    //this returns the correct values relative to the screen size
    Vector2 pos = new Vector2(Gdx.input.getX(), Gdx.input.getY());

    //I'm not sure how to get the correct rectangle to see what the
    //width and height are for the model relative to the screen?
    Rectangle modelBounds = new Rectangle(<<not sure what to put here>>);

    if (modelBounds.contains(pos.x, pos.y) {
        System.out.println("Model is being touched at: " + pos.x + ", " + pos.y);
    }
}

真的不确定这是否是正确的方法。我可以通过以下方式获得模型的位置:

modelInstance.getNode("Node1").globalTransform.getTranslation(new Vector3());

但是我不知道如何将宽度和高度设置为相对于屏幕尺寸的矩形,如果它甚至可能

我也不确定这是否会导致大量延迟,因为如果点击它们,我将需要检测大约7个节点。

有更好的方法吗?如果没有,有没有办法获得模型宽度&amp;相对于屏幕尺寸(或相机,可能)的高度?

编辑:了解使用边界框,看起来就像我需要的那样。但是,不太确定如何正确实现它。我已将代码更改为:

public ModelInstance modelInstance;
public BoundingBox modelBounds;

@Override
public void create() {
    ...
    //omitted irrelevant bits of code
    modelInstance = new ModelInstance(heatExchangerModel);
    modelBounds = modelInstance.calculateBoundingBox(new BoundingBox());
}

@Override
public void render() {
    ...
    if (Gdx.input.justTouched()) {
        Vector3 pos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
        System.out.println(pos);
        if (modelBounds.contains(pos)) {
        System.out.println("Touching the model");
        }
    }
}

我不确定BoundingBox的输出应该是什么,或者它给我的数字与2d空间中的位置相关联。嗯..

EDIT2:认为我越来越近..了解光线和我.getPickRay的{​​{1}}方法。 PerspectiveCamera似乎返回完全无法使用的数字,例如真的小数字。我想我需要做一些事情:

.getPickRay

然后if (Gdx.input.justTouched()) { Vector3 intersection = new Vector3(); Ray pickRay = perspectiveCamera.getPickRay(Gdx.input.getX(), Gdx.input.getY()); Intersector.intersectRayBounds(pickRay, modelBounds, intersection); } 应该给我重叠的点。然而,它似乎无法正常工作,给我一些非常小的数字,如intersection ..嗯......

0 个答案:

没有答案