把观音视为世界坐标

时间:2017-07-17 12:00:00

标签: opengl glm-math

我有通常的立方体(-1,-1,-1到1,1,1)和我的相机矩阵(视图和投影)。 投影矩阵是透视投影。 我想看看给定相机哪个区域可见。为了想象我想像平截头体那样拉伸我的立方体,以便我可以看到来自其他相机的结果。

我的理想:

获取viewProjectionMatrix的反转并将我的cubecoordinate与它相乘:

$this->hasMany("Prices", [
    "foreignKey" => "lease_id"
]);

现在,cubecoordinates应该在worldspace中,看起来像截头锥体。 但是这些超越的坐标是错误的。

我可以保证,viewProjectionMatrix正常工作,因为我像所有地方一样使用它。

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

1 个答案:

答案 0 :(得分:2)

投影矩阵将眼睛坐标映射到剪辑坐标。现在,您没有要回溯项目的剪辑坐标,只有NDC。

如何从NDC转换为剪辑坐标?好吧,请记住,我们正在使用齐次坐标而不是欧几里德坐标(因此是第4维w)。齐次坐标碰巧在乘以非零常数时是不变的。也就是说,对于任何非零(a, b, c, d),点(k*a, k*b, k*c, k*d)相当于k

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

现在,从均匀坐标到欧几里德坐标总是需要除以w。我们通常不在OpenGL中执行此操作的原因是仿射变换不会影响w,因此它通常保持1。但不是在这种情况下,因为投影矩阵及其逆都会影响w坐标。

因此,正如BDL在评论中指出的那样,您错过了w的除法。您需要在NDC坐标中获取可见立方体,通过一系列向后变换传递它们,最后除以w以便转到欧几里德坐标。事实上,您可能会跳过w的除法,因为您可能只是保持齐次坐标并使用其他相机的视图进行渲染。