2014-09-12 25 views
0

正如标题所示,我有一个项目在由单个矢量定义的对象空间中具有特定位置。如何从物体空间位置获得近平面上的摄像机空间位置

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

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

我需要它为perspective projection

编辑用鼠标线性移动对象:现在我从物体空间再往窗口空间,然后从那里到摄像机空间通过设置窗口深度窗口.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

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

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

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

+0

您好,我想请您详细说明第二种方法吗?我乘了我的模型空间位置 - >世界空间 - >相机空间 - >剪辑空间。然后clip.z = -clip.w然后我乘以逆向proj,但它看起来不对.. – elect 2014-09-15 06:56:01

+0

那么,你应该得到的眼睛空间位置回来。但是在同类坐标系中,所以你可能必须用得到的'w'来分解结果'xyz',以得到你期望的3D笛卡尔坐标。 – derhass 2014-09-15 15:36:46

相关问题