投影矩阵仅从0到1

纯的

我正在使用C ++开发我的Projection Matrix。

如果我使用正交矩阵,则“轴”范围从0到我的屏幕尺寸。现在,如果使用我的Perspective Matrix,则Axis范围从0到1。

如果我要放置对象,这不是很好。我可以将它们的运动除以宽度和高度,但我认为应该有更好的解决方案,就像使用正交矩阵一样。

                T aspect = (right - left) / (top - bottom);
            T xScale = 1.0f / tan(fov / 2.0f);
            T yScale = xScale / aspect;

            return Matrix<T>(
                yScale, 0.0f, 0.0f, 0.0f,
                0.0f, xScale, 0.0f, 0.0f,
                (left + right) / (left - right), (top + bottom) / (bottom - top), zFar / (zNear - zFar), -1.0f,
                0.0f, 0.0f, (zNear * zFar) / (zNear - zFar), 0.0f);

那是我的观点矩阵

            T farNear = zFar - zNear;

            return Matrix<T>(
                2.0f / (right - left), 0.0f, 0.0f, 0.0f,
                0.0f, 2.0f / (top - bottom), 0.0f, 0.0f,
                0.0f, 0.0f, 1.0f / farNear, 0.0f,
                (left + right) / (left - right), (top + bottom) / (bottom - top), -zNear / farNear, 1.0f);

那是我的正交矩阵计算

因此,如何解决此问题,以便在使用透视矩阵时,轴范围从0到屏幕尺寸,而不是0到1。

安东·科尔曼(Andon M.Coleman)

您提到的此范围在透视投影中不起作用。

要弄清楚您视线的宽度和高度,您需要了解您的视场(在GL中,我们通常使用垂直角度和纵横比来定义此视场)以及与近平面的距离;宽度和高度会随着沿z轴的距离而变化。

下图说明了这种情况:

  在此处输入图片说明

在正交投影中,无论您距离近剪辑平面有多远或多近,观看体积都具有相同的宽度和高度。在这种投影中,(x,y,...)z = 1.0处的点与屏幕的一个边缘与(x,y,...)z = 100.0处的同一点等距,因此您可以为所有点建立一个X和Y范围。

使用此处讨论的透视投影,点离近平面越远,由于可见坐标空间扩大,它越被推向屏幕中心。

  http://www.alpcentauri.info/perspectivePic.jpg

如果要保持Z不变,那么唯一拥有可见X和Y坐标范围的唯一方法是。但是,如果保持Z不变,那么为什么首先要透视投影呢?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章