我正在使用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。
要弄清楚您视线的宽度和高度,您需要了解您的视场(在GL中,我们通常使用垂直角度和纵横比来定义此视场)以及与近平面的距离;宽度和高度会随着沿z轴的距离而变化。
在正交投影中,无论您距离近剪辑平面有多远或多近,观看体积都具有相同的宽度和高度。在这种投影中,(x,y,...)
z = 1.0处的点与屏幕的一个边缘与(x,y,...)
z = 100.0处的同一点等距,因此您可以为所有点建立一个X和Y范围。
使用此处讨论的透视投影,点离近平面越远,由于可见坐标空间扩大,它越被推向屏幕中心。
如果要保持Z不变,那么唯一拥有可见X和Y坐标范围的唯一方法是。但是,如果保持Z不变,那么为什么首先要透视投影呢?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句