正如标题所示,我有一个在单个向量定义的对象空间中具有特定位置的项目。
我想在近剪裁平面上检索此向量投影的相机空间中的坐标。
换句话说,我需要在此向量和由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));
}
有没有更好的方法(更有效率)才能在不进入窗口空间并返回相机的情况下获得它?
答案 0 :(得分:0)
我能想到的最直接的方法是简单地将你的物体空间位置(以下称为矢量x
)转换为眼睛空间,构造从原点到眼睛空间的光线坐标并计算该光线与近平面z_eye=-near
之间的交点。
另一种方法是完全转换到剪辑空间。由于近平面在那里z_clip = - w_clip
,您可以将结果的z
坐标设置为-w
,并使用反投影矩阵将其投影回眼睛空间。
在这两种情况下,如果点位于相机后面或相机平面z_eye = 0
,结果将毫无意义。