图形处理WIKI
+ -

正交投影和透视投影

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

17533268312
175343629668

正交投影矩阵 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
}

https://github.com/Mesa3D/mesa/blob/957009978ef6d7121fc0d710d03bc20097d4d46b/src/mesa/math/m_matrix.c

透视投影

透视投影实现的是一个缩放、透视的投影。透视投影的特点是,距离摄像机越远的物体在投影平面上的成像越小,透视投影的取景范围是一个截头体(四棱台)。这个截头体称为取景截头体(viewing frustum),摄像机位于四棱锥的顶点。这个四棱锥被截头体的远平面和近平面分割,远近裁剪面中间的部分就是取景截头体,只有这个空间里的对象才是可见的。

xScale     0          0               0
0        yScale       0               0
0          0       zf/(zf-zn)         1
0          0       -zn*zf/(zf-zn)     0

0 篇笔记 写笔记

作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!