2017-07-17 73 views
1

我有通常的立方体(-1,-1,-1到1,1,1)和我的相机矩阵(视图和投影)。 投影矩阵是一个透视投影。 我想看看哪个区域从给定的相机可见。为了想象我想像锥体一样伸展我的立方体,以便我可以看到其他相机的结果。得到作为世界坐标的视锥体

我爱迪尔:

得到viewProjectionMatrix的逆繁衍我cubecoordinate它:

glm::vec4 CubeCoordinates[8]{           
    glm::vec4(-1.0f, -1.0f, 1.0f, 1.0f), 
    glm::vec4(-1.0f, 1.0f, 1.0f, 1.0f), 
    glm::vec4(1.0f, 1.0f, 1.0f, 1.0f), 
    glm::vec4(1.0f, -1.0f, 1.0f, 1.0f), 
    glm::vec4(-1.0f, -1.0f, -1.0f, 1.0f), 
    glm::vec4(-1.0f, 1.0f, -1.0f, 1.0f), 
    glm::vec4(1.0f, 1.0f, -1.0f, 1.0f), 
    glm::vec4(1.0f, -1.0f, -1.0f, 1.0f) }; 

glm::mat4 InvertedViewProjectionMatrix = glm::inverse(refCamera.GetViewProjectionMatrix()); 

for (uint32_t i = 0; i < 8; ++i) 
{ 
    CameraEdgesWorldSpace[i] = InvertedViewProjectionMatrix * CubeCoordinates[i]; 
} 

现在cubecoordinates应该在世界空间,看起来像圆台。 但outcomming坐标是错误的。

我可以保证,viewProjectionMatrix是正确的工作,因为我喜欢到处使用它。

计算错了吗?或者我使用错误的命令来颠倒矩阵(我是GLM的新手)?

+3

您错过了视角鸿沟。在投影(或反向投影)之后,w坐标不再是1。 – BDL

+0

所以我只需要用w来区分呢? – Thomas

+0

是的。如果这没有帮助,请添加一个示例,显示相机矩阵中的值以及分割后的结果向量。 – BDL

回答

2

投影矩阵将眼睛坐标映射到剪辑坐标。现在,您没有剪辑坐标来反投影,您只有NDC。

如何将NDC转换为剪辑坐标?那么,请记住,我们正在使用齐次而不是欧几里得坐标(因此第四维w)。齐次坐标在乘以非零常数方面恰好是不变的。即,对于任何非零k,点(a, b, c, d)相当于(k*a, k*b, k*c, k*d)

你可以通过将它们乘以1/w从剪辑坐标转到NDC。这是一个不断增加的乘法!因此,NDC本身就是一个有效的剪辑坐标,因此您可以对其进行反向投影。

现在,从齐次到欧几里德坐标总是需要除以w。我们通常不会在OpenGL中执行此操作的原因是仿射变换不会影响w,所以它通常保留为1。不过在这种情况下,投影矩阵及其相反确实会影响w坐标。

因此,正如BDL在评论中指出的,您错过了w的划分。您需要在NDC坐标中采用可见立方体,将它们通过向后转换链,然后将其除以w以转至欧几里德坐标。实际上,你可以跳过w的分割,因为你可以简单地保持齐次坐标,并用另一个相机的视角来渲染它。