我做了一些投影,投影到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]
我正在遵循这个图表:
答案 0 :(得分:1)
这里你实际上有一个线性代数问题,而且遗憾的是这个问题无法解决。当您将3D坐标空间投影到2D空间(这是模型 - >视口变换的工作)时,您将在此过程中丢失维度,并且反向问题变得不受约束。
我的意思是,如果你在2D空间中只有一个矢量(例如屏幕中的一个点),那么就会有无数个3D矢量投射到同一个2D矢量上,形成一个新的1D向量空间。由于投影不是仿射(线性)操作,这意味着您的一维空间不是直线;相反,3D空间中的曲线。
答案 1 :(得分:0)
我似乎已经解决了这个问题。我的错误是将投影矩阵的近平面设置为0,这应该是最小值0.1