簡體   English   中英

將2D屏幕坐標非投影到3D世界坐標

[英]Unprojecting 2D screen coordinates to 3D world coordinates

我正在做一些投影,投影到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]

我正在遵循以下圖表:

在此處輸入圖片說明

您實際上在這里有一個線性代數問題,不幸的是這是無法解決的。 當您將3D坐標空間投影到2D空間上時(這是model-> viewport轉換的工作),您將一路丟失尺寸,並且反向問題變得約束不足。

我的意思是,如果您僅在2D空間中有一個矢量(例如屏幕上的一個點),那么會有無數個3D矢量可以投影到同一2D矢量上,從而形成一個新的1D矢量空間。 而且由於投影不是仿射(線性)操作,因此這意味着您的一維空間不是直線。 而是3D空間中的曲線。

我似乎自己已經解決了這個問題。 我的錯誤是將投影矩陣的近平面設置為0,且最小值應為0.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM