gpt4 book ai didi

java - 取消投影鼠标以获取 3D 世界坐标 Libgdx

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:48 27 4
gpt4 key购买 nike

我的问题:如何让 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 mouse

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

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

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

最佳答案

您不能简单地使用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

关于java - 取消投影鼠标以获取 3D 世界坐标 Libgdx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552284/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com