我正在尝试制作一些简单的代码来检测模型是否被点击。到目前为止,我见过的最好的方法是在网格周围创建一些矩形并使用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
..嗯......