我正在使用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.
答案 0 :(得分:2)
要确定观察体积的宽度和高度,您需要知道您的视野(在GL中我们通常使用垂直角度和纵横比来定义)和距离近平面的距离;宽度和高度将随着z轴的距离而变化。
在正交投影中,无论您与近剪裁平面有多远或接近,观看体积都具有相同的宽度和高度。在这种投影中,z = 1.0处的点(x,y,...)
与屏幕的一个边缘等距离为z = 100.0处的相同点(x,y,...)
,因此您可以建立单个X和Y范围为所有点。
使用所讨论的透视投影here,距离近平面越远,因为可见坐标空间扩大,所以越往屏幕中心推动越多。
如果保持Z不变,唯一可以获得单一可见X和Y坐标范围的方法。 但如果你保持Z不变,那你为什么要首先进行透视投影呢?