0

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

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

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

我需要它来用鼠标在透视投影中线性移动对象

编辑:现在我从对象空间到窗口空间,然后通过将窗口深度 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));
    }

有没有更好的方法(更有效)来获得它而无需进入窗口空间并返回相机?

4

1 回答 1

0

我能想到的最直接的方法是简单地将您的对象空间位置(x下面称为向量)转换为眼睛空间,构造一条从原点到该眼睛空间坐标的射线并计算该射线之间的交点和近平面z_eye=-near

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

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

于 2014-09-14T02:43:38.923 回答