如何使用OpenGL进行反向透视?

问题描述 投票:1回答:1

我正在寻找一种使用OpenGL和C ++进行反向透视的方法。目前,我正在使用glFrustum进行经典透视,但是我想知道是否有可能出现此处介绍的反向透视(https://en.wikipedia.org/wiki/Reverse_perspective及以下)?如果没有,OpenGL还有其他方法吗?

enter image description here

c++ opengl glfrustum
1个回答
0
投票

这个问题确实让我很感兴趣。我并不完全相信我现在要称为“拜占庭式视角”的内容可以通过类似于(核心前配置文件)glFrustum提供的转换来容纳。不过,我还是受Computer Graphics: Principles and Practice (2nd Ed)中的推导以及OpenGL CCS / NDCS的启发而做了一些工作。

很遗憾,原始的S.O.该网站不允许使用嵌入式LaTeX,因此矩阵不会很漂亮。 认为此答案正在进行中


到目前为止,我已经导出了矩阵变换,导致有时称为“归一化Computer Graphics: Principles and Practice (2nd Ed)”的情况。 frustum处的远平面,Z = -1处的近平面和具有单位斜率的Z = - N / F平面。 (如果有一个很好的图表,这将非常清楚)

R, L, T, B

将此矩阵称为:[ 2N / (R - L) 0 (R + L) / (R - L) 0 ] [ 0 2N / (T - B) (T + B) / (T - B) 0 ] [ 0 0 1 0 ] [ 0 0 0 F ] 。对于任何点:[F.p]在近平面上,很容易证明变换后的同质点位于P = (x, y, - N, 1)^T平面上。 (注意:Z = - N / F是'transpose'运算符,以表明它实际上是column向量。)

同样,给定一个点:在远平面上为^T,在P = (x, y, - F, 1)^T平面上为变换的同质点线。


[拜占庭透视图需要另一个约束-我们将使用变量Z = -1,其中D是类似于Z = - D处的“眼睛”或“投影参考点”(PRP )。

由于您已经从提供的图像中收集到,所以平行线会聚在Z = 0处,而不是在“眼睛”处会聚。但是,您不希望从会聚的角度获得图像。您想从“前端”可视化效果。问题是-我们可以构造类似于Z = - D提供的产生拜占庭透视图的OpenGL矩阵吗?是否可以使其适合GL管道?

到目前为止,我得出的是'标准化的[[Byzantine视锥”。同样,远平面在glFrustum,近平面在Z = -1,并且Z = - N / F平面具有单位斜率-尽管规则视锥的负斜率。 (再次清晰的图片在这里值得一千个单词)

R, L, T, B
将此矩阵称为:[ 2N / (R - L)      0        (R + L) / (R - L)     0     ]
[       0      2N / (T - B)  (T + B) / (T - B)     0     ]
[       0           0              N / F           0     ]
[       0           0                0             N     ]
[F.b]坐标变换是相同的,但是X,Y分量变换是不同的。从某种意义上讲,这在某种意义上是直观的,这是

orthodox

视图体积的“反向”。再次,给定一个点:Z,W在近平面上,已变换的齐次点位于P = (x, y, - N, 1)^T平面上,并且一个点:Z = - N / F在远平面上的齐次变换位于P = (x, y, - F, 1)^T平面上。


考虑到矩阵的相似性,并且只需要简单的透视变换(以及一些琐碎的缩放和平移矩阵)就可以产生符合OpenGL剪辑坐标空间(CCS)及其NDCS投影的并行投影矩阵,似乎可以使OpenGL“拜占庭式”投影起作用。我只需要更多时间来工作...
© www.soinside.com 2019 - 2024. All rights reserved.