投影矩阵仅从0到1

时间:2015-03-05 18:53:17

标签: c++ opengl matrix directx

我正在使用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.

1 个答案:

答案 0 :(得分:2)

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

要确定观察体积的宽度和高度,您需要知道您的视野(在GL中我们通常使用垂直角度和纵横比来定义)和距离近平面的距离;宽度和高度将随着z轴的距离而变化。

下图说明了这种情况:

enter image description here

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

使用所讨论的透视投影here,距离近平面越远,因为可见坐标空间扩大,所以越往屏幕中心推动越多。

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

如果保持Z不变,唯一可以获得单一可见X和Y坐标范围的方法。 但如果你保持Z不变,那你为什么要首先进行透视投影呢?