如何从物体空间位置获取近平面上的相机空间位置

时间:2014-09-12 16:01:15

标签: translation opengl-3 projection-matrix

正如标题所示,我有一个在单个向量定义的对象空间中具有特定位置的项目。

我想在近剪裁平面上检索此向量投影的相机空间中的坐标。

换句话说,我需要在此向量和由z坐标定义的平面之间的相机空间中的交点等于-1(我的近平面)。

我需要它在perspective projection

中用鼠标线性移动物体

编辑:现在我从对象空间向下移动到窗口空间,然后通过将窗口深度window.z设置为等于0,即近平面,从那里一直到相机空间。

请注意,为了从unProject获取相机空间,我只是作为模型视图矩阵传递一个单位矩阵new Mat4(1f)

public Vec3 getCameraSpacePositionOnNearPlane(Vec2i mousePoint) {

        int[] viewport = new int[]{0, 0, glViewer.getGlWindow().getWidth(), glViewer.getGlWindow().getHeight()};

        Vec3 window = new Vec3();

        window.x = mousePoint.x;
        window.y = viewport[3] - mousePoint.y - 1;
        window.z = 0;

        return Jglm.unProject(window, new Mat4(1f), glViewer.getVehicleCameraToClipMatrix(), new Vec4(viewport));
    }

有没有更好的方法(更有效率)才能在不进入窗口空间并返回相机的情况下获得它?

1 个答案:

答案 0 :(得分:0)

我能想到的最直接的方法是简单地将你的物体空间位置(以下称为矢量x)转换为眼睛空间,构造从原点到眼睛空间的光线坐标并计算该光线与近平面z_eye=-near之间的交点。

另一种方法是完全转换到剪辑空间。由于近平面在那里z_clip = - w_clip,您可以将结果的z坐标设置为-w,并使用反投影矩阵将其投影回眼睛空间。

在这两种情况下,如果点位于相机后面或相机平面z_eye = 0,结果将毫无意义。