将2D屏幕坐标未投影到3D世界坐标

时间:2016-01-20 21:32:59

标签: java 3d 2d projection

我做了一些投影,投影到2D后我想要反向操作,不投影到3D。我感到困惑的唯一一步是从NDC到HDC,更具体的是如何反向透视划分?目前在做反向时,我最终得到-1 w值,在分割或乘法时不会做太多,或者可能还有其他我正在监督的事情。这是我目前的代码:

    private Vector3f projectTo3D(Matrix4f projection, Matrix4f view, Matrix4f world, Vector3f vertex) {

    Matrix4f.invert(projection, projection);
    Matrix4f.invert(view, view);
    Matrix4f.invert(world, world);

    System.out.println("projectTo3D - Screen Coordinate: " + vertex.toString());

    ....

    System.out.println("NDC: " + x + ", " + y + ", " + z);
    final Vector4f HDC = new Vector4f(x, y, z, -1f);
    HDC.x = HDC.x / HDC.w;
    HDC.y = HDC.y / HDC.w;
    HDC.z = HDC.z / HDC.w;

    System.out.println("HDC before transform: " + HDC.toString());
    Matrix4f.transform(worldProjectionView, HDC, HDC);
    System.out.println("HDC after transform: " + HDC.toString());

    final Vector3f worldCoordinates = new Vector3f(HDC.x, HDC.y, HDC.z);
    System.out.println("World coordinate: " + worldCoordinates.toString());
    return worldCoordinates;
}
        

projectTo2D - 世界坐标:Vector3f [-50.0,-50.0,0.0]

     

HDC:Vector4f:-195.05373 -44.30973 -529.6105 -529.6105

     

NDC:Vector3f [0.3682966,0.08366475,0.0]

     

屏幕坐标:547.31866,325.09943,0.0

           

projectTo3D - 屏幕坐标:Vector3f [ 547.31866,325.09943,0.0 ]

     

NDC:0.36829662,0.083664775,-1.0

     

变换前的HDC:Vector4f:-0.36829662 -0.083664775 1.0 -1.0

     变换后的

HDC:Vector4f:-292.38623 405.26837 -291.50772 1.0

     

世界坐标:Vector3f [-292.38623,405.26837,-291.50772]

我正在遵循这个图表:

enter image description here

2 个答案:

答案 0 :(得分:1)

这里你实际上有一个线性代数问题,而且遗憾的是这个问题无法解决。当您将3D坐标空间投影到2D空间(这是模型 - >视口变换的工作)时,您将在此过程中丢失维度,并且反向问题变得不受约束。

我的意思是,如果你在2D空间中只有一个矢量(例如屏幕中的一个点),那么就会有无数个3D矢量投射到同一个2D矢量上,形成一个新的1D向量空间。由于投影不是仿射(线性)操作,这意味着您的一维空间不是直线;相反,3D空间中的曲线。

答案 1 :(得分:0)

我似乎已经解决了这个问题。我的错误是将投影矩阵的近平面设置为0,这应该是最小值0.1