透视摄像机坐标到libgdx中的屏幕坐标

时间:2014-04-02 17:49:56

标签: opengl matrix libgdx transformation

perspectiveCamera = new PerspectiveCamera(90, 80, 48);
perspectiveCamera.position.set(0,0, 10f);
perspectiveCamera.lookAt(0,0,0);
perspectiveCamera.near = .01f;
perspectiveCamera.far = 300f;

我的ScreenWidth x ScreenHeight是800 x 480;

pCamera.unproject(mytouchPoint)应该假设在

之间给出结果

x = 0到80 y = 0到48

但是x轴和y轴都得到了0.000xyz

2 个答案:

答案 0 :(得分:3)

请勿对相机的near成员使用如此小的值,否则会导致浮点错误和/或z-fighting。

您提供给PerspectiveCamera构造函数的宽度和高度值用于计算宽高比。在3D透视图中没有单一的2D分辨率(世界坐标中的屏幕平面的大小)。

您不能简单地将2D屏幕坐标投影到单个3D坐标。对于每个2D屏幕坐标,可能存在“无限”量的3D坐标。因此,摄像机的unproject方法将使用所提供的屏幕坐标的z坐标来决定返回哪些3D坐标。如果z为零,它将给出近平面上的坐标。如果z是1,它将给出远平面上的坐标。

假设您使用z = 0表示myTouchPoint并且假设您有一个非常小的近平面(因为您near值非常小),未投影的值将变小并且因此(几乎)等于零。

有关详细信息,您可能需要查看:http://blog.xoppa.com/interacting-with-3d-objects/

答案 1 :(得分:1)

我找到了一种轻松做到这一点的方法。它也很快。

只需在所需深度z处创建一个平面,并在其上找到光线的交点。

float zDepth=-10;//your decision or and object z position

public boolean touchDown(int screenX, int screenY, int pointer, int button) {

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

    Plane plane=new Plane();
    plane.set(0,0,1,0);// the xy plane with direction z facing screen

    plane.d=zDepth;//***** the depth in 3d for the coordinates

    Vector3 yourVector3Position=new Vector3();
    Intersector.intersectRayPlane(ray, plane, yourVector3Position);

}