4

我的问题:如何使用鼠标光标移动 3D 模型,使模型的 y 位置保持在 0。(使用 Libgdx)

我尝试过的: 我试图让我的 3D 模型跟随我的光标。

目前,我只是简单地使模型随着鼠标的 x 和 y 坐标移动,并添加了乘数和相机位置等因素。这不是很好,因为它不跟随光标,如果我旋转相机,那么模型不会朝着正确的方向移动。

这是我为移动模型创建的代码:

instances.get(modelIndex).transform.setToTranslation(((Gdx.input.getX()-650)/10) + cam.position.x,0,((Gdx.input.getY()-400)/10)+ cam.position.z);

这是问题图像的链接(绿色圆圈是鼠标所在的位置)。

libgx 鼠标

我知道我做错了,我应该使用 unproject 方法。我曾尝试使用 unproject 方法,但收效甚微,模型只是粘在相机的近面板上。我希望我的对象在 y 轴上保持在 0,所以我使用了这个:

cam.unproject(mousePos);
instances.get(modelIndex).transform.setToTranslation(mousePos.x, 0, mousePos.z);

然后,这导致模型在正确的方向上非常缓慢地移动(而不是使用鼠标)。此外,当我旋转或移动相机时,模型会被设置在远处甚至相机后面的某个地方。

4

1 回答 1

12

您不能简单地使用camera.unproject,因为单个 2D 坐标可以表示 3D 空间中的多个坐标。相反,您可以使用camera.getPickRay来获取Ray,它由原点(相机近平面上的位置)以及进入 3D 空间的方向定义。因此,您将在 3D 空间中获得代表 2D 坐标的线:

Ray ray = cam.getPickRay(screenX, screenY);

现在你想要那条线(射线)上 y=0 的点(到原点的距离):

ray.origin.y + ray.direction.y * distance = 0 <=>
ray.direction.y * distance = -ray.origin.y <=>
distance = -ray.origin.y / ray.direction.y

导致:

float distance = -ray.origin.y / ray.direction.y;

现在要在该距离处获得射线上的位置:

Vector3 tmpVector = new Vector3();
tmpVector.set(ray.direction).scl(distance).add(ray.origin);

要将模型实例转换设置为该值,您可以使用:

instance.transform.setTranslation(tmpVector);

这里instance指的是你的instances.get(modelIndex).

我鼓励您使用 InputProcessor(请参阅http://code.google.com/p/libgdx/wiki/InputEvent),以便将它们放在一起:

Vector3 tmpVector = new Vector3();
@Override
public boolean touchDragged (int screenX, int screenY, int pointer) {
    Ray ray = cam.getPickRay(screenX, screenY);
    final float distance = -ray.origin.y / ray.direction.y;
    tmpVector.set(ray.direction).scl(distance).add(ray.origin);
    instance.transform.setTranslation(tmpVector);
    return true;
}

请注意,您可能需要覆盖touchdown并返回true才能touchDragged被调用。

于 2013-08-31T21:02:59.967 回答