正交投影和透视投影
2024-12-13
41
0
将摄影空间中的三维物体投影到二维胶片上,也就是Direct3D中的屏幕,这种三维到二维的变换过程就是投影变换,即从取景空间到摄影空间的变换。
设三维物体在观察空间中的坐标为Pview,投影矩阵为Mproj,则顶点在投影空间中的坐标为:
Pproj = Pview * Mproj
参考资料:http://www.cppblog.com/lovedday/archive/2008/05/02/48632.html
正交投影
正交投影中,投影向量和观察平面垂直,物体坐标沿观察坐标系的z轴平行投影到观察平面上,观察点和观察平面间的距离不会影响物体的投影大小。
工程设计中的顶视图、前视图和侧视图就是典型的正交投影。
对于正交投影来说,它的取景范围是一个长方体,只有在这个长方体中的景物才会被绘制出来。
此函数使用以下公式计算返回的矩阵:
2/w 0 0 0
0 2/h 0 0
0 0 1/(zf-zn) 0
0 0 -zn/(zf-zn) 1
OPENGL正交投影
正交投影要做的是把一个长方体线性映射到 NDC 中,以 OpenGL 为例,也就是要映射到三个维度上都是【-1,-1】之间的立方体。
这个长方体的边和坐标轴平行,因此可以用以下几个变量来定义长方体的坐标:
- left, right, top, bottom:定义了长方体上平行于 X-Y 屏幕的面的位置,其中 left 和 right 就是 X 轴上的最小值和最大值,bottom 和 top 就是 Y 轴上的最小值和最大值
- near,far:定义了长方体在 Z 轴上的区间,离原点最近的平面的 Z 值是 near,最远的平面的 Z 值是 far
正交投影矩阵 orgho https://registry.khronos.org/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml
void math_float_ortho(float *m,
float left, float right,
float bottom, float top,
float nearval, float farval)
{
#define M(row,col) m[col*4+row]
M(0,0) = 2.0F / (right-left);
M(0,1) = 0.0F;
M(0,2) = 0.0F;
M(0,3) = -(right+left) / (right-left);
M(1,0) = 0.0F;
M(1,1) = 2.0F / (top-bottom);
M(1,2) = 0.0F;
M(1,3) = -(top+bottom) / (top-bottom);
M(2,0) = 0.0F;
M(2,1) = 0.0F;
M(2,2) = -2.0F / (farval-nearval);
M(2,3) = -(farval+nearval) / (farval-nearval);
M(3,0) = 0.0F;
M(3,1) = 0.0F;
M(3,2) = 0.0F;
M(3,3) = 1.0F;
#undef M
}
透视投影
透视投影实现的是一个缩放、透视的投影。透视投影的特点是,距离摄像机越远的物体在投影平面上的成像越小,透视投影的取景范围是一个截头体(四棱台)。这个截头体称为取景截头体(viewing frustum),摄像机位于四棱锥的顶点。这个四棱锥被截头体的远平面和近平面分割,远近裁剪面中间的部分就是取景截头体,只有这个空间里的对象才是可见的。
xScale 0 0 0
0 yScale 0 0
0 0 zf/(zf-zn) 1
0 0 -zn*zf/(zf-zn) 0