投影矩阵只从 0 到 1
Projection Matrix only goes from 0 to 1
我正在使用 C++ 处理我的投影矩阵。
如果我使用正交矩阵,轴的范围从 0 到我的屏幕尺寸。
现在,如果我使用我的透视矩阵,轴范围从 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 轴的距离而变化。
下图说明了这种情况:
在正交投影中,无论您离近裁剪平面多远或多近,视体积都具有相同的宽度和高度。在这种投影中,z=1.0 处的点 (x,y,...)
与屏幕边缘的距离与 z=100.0 处的同一点 (x,y,...)
的距离相等,因此您可以建立一个 X 和所有点的 Y 范围。
使用所讨论的透视投影 here,一个点离近平面越远,它就越被推向屏幕中心,因为可见坐标 space 扩展。
要获得单一可见 X 和 Y 坐标范围的唯一方法是保持 Z 不变。 但是如果你保持 Z 不变,那么你为什么首先要透视投影?
我正在使用 C++ 处理我的投影矩阵。
如果我使用正交矩阵,轴的范围从 0 到我的屏幕尺寸。 现在,如果我使用我的透视矩阵,轴范围从 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 轴的距离而变化。
下图说明了这种情况:
在正交投影中,无论您离近裁剪平面多远或多近,视体积都具有相同的宽度和高度。在这种投影中,z=1.0 处的点 (x,y,...)
与屏幕边缘的距离与 z=100.0 处的同一点 (x,y,...)
的距离相等,因此您可以建立一个 X 和所有点的 Y 范围。
使用所讨论的透视投影 here,一个点离近平面越远,它就越被推向屏幕中心,因为可见坐标 space 扩展。
要获得单一可见 X 和 Y 坐标范围的唯一方法是保持 Z 不变。 但是如果你保持 Z 不变,那么你为什么首先要透视投影?