opengl 的投影和正交矩阵

Posted

技术标签:

【中文标题】opengl 的投影和正交矩阵【英文标题】:projection and orthographic matrices for opengl 【发布时间】:2015-08-05 17:29:56 【问题描述】:

我正在编写这段代码来设置 opengl 投影矩阵,但我得到了奇怪的结果并希望得到一些帮助。

void mat4Projection(mat4* out, double r, double l, double t, double b, double n, double f);
void mat4OrthoProjection(mat4* out, double r, double l, double t, double b, double n, double f);

void mat4Projection(mat4* out, double r, double l, double t, double b, double n, double f)

    double data[] =  (2*n)/(r-l),  0,           (r+l)/(r-l),        0,
                       0,          (2*n)/(t-b),  (t+b)/(t-b),        0,
                       0,           0,           (-(f+n))/(f-n),     (-2*(f*n))/(f-n),
                       0,           0,           -1,                 1                ;
    copyMatrix(out, data);


void mat4OrthoProjection(mat4* out, double r, double l, double t, double b, double n, double f)

    double data[] =  (2)/(r-l),  0,          0,           -((r+l)/(r-l)),
                       0,         (2)/(t-b),  0,           -((t+b)/(t-b)),
                       0,         0,          (-2)/(f-n),  -((f+n)/(f-n)),
                       0,         0,          0,           1              ;
    copyMatrix(out, data);

我从这个链接http://www.songho.ca/opengl/gl_projectionmatrix.html得到这个代码

【问题讨论】:

奇怪的结果?你能详细说明一下吗? 出乎意料,我猜问题出在内存布局上。经典 GL 在列主要布局中使用期望矩阵,而您将它们作为行主要提供。 【参考方案1】:

与我的比较。这是一个标准代码,运行良好,但您应该知道的一件事是它基于行向量。

void Matrix_OrthoProjection( Matrix& out_M, const __VERTEX__TYPE__ width, const __VERTEX__TYPE__ height, const __VERTEX__TYPE__ nZ, const __VERTEX__TYPE__ fZ)

    // asumed r-l = width , t-b = height
    out_M.s[_0x0_] = 2./width; out_M.s[_0x1_] = 0;              out_M.s[_0x2_] = 0;                    out_M.s[_0x3_] = 0;
    out_M.s[_1x0_] = 0;        out_M.s[_1x1_] = 2./height;      out_M.s[_1x2_] = 0;                    out_M.s[_1x3_] = 0;
    out_M.s[_2x0_] = 0;        out_M.s[_2x1_] = 0;              out_M.s[_2x2_] = -2./(fZ-nZ);          out_M.s[_2x3_] = 0;
    out_M.s[_3x0_] = 0;        out_M.s[_3x1_] = 0;              out_M.s[_3x2_] = -(fZ+nZ)/(fZ-nZ);     out_M.s[_3x3_] = 1.;


void Matrix_PerspectiveProjection
(Matrix& out_M,
 const __VERTEX__TYPE__ FOV,
 const __VERTEX__TYPE__ ASPECT,
 const __VERTEX__TYPE__ NEAR,
 const __VERTEX__TYPE__ FAR)


    float fov = 1.0f / (float)tan(FOV * 0.5f); 
    float nf = 1.0f / (NEAR - FAR);

    out_M.s[_0x0_] = fov/ASPECT;
    out_M.s[_1x0_] = 0;
    out_M.s[_2x0_] = 0;
    out_M.s[_3x0_] = 0;

    out_M.s[_0x1_] = 0.0;
    out_M.s[_1x1_] = fov;
    out_M.s[_2x1_] = 0.0;
    out_M.s[_3x1_] = 0.0;

    out_M.s[_0x2_] = 0.0;
    out_M.s[_1x2_] = 0.0;
    out_M.s[_2x2_] = (NEAR+FAR) * nf;
    out_M.s[_3x2_] = (2.f*NEAR*FAR) * nf;

    out_M.s[_0x3_] = 0.0;
    out_M.s[_1x3_] = 0.0;
    out_M.s[_2x3_] = -1.0;
    out_M.s[_3x3_] = 0.0;


也参考这张图片。

正交

观点

【讨论】:

以上是关于opengl 的投影和正交矩阵的主要内容,如果未能解决你的问题,请参考以下文章

openGL - 正交投影矩阵

OpenGL中的正交投影矩阵问题

OpenGL 3+,具有定向光的正交投影

OpenGL ES 学习 -- 正交投影

使用 GLM 正交投影矩阵将三角形顶点放在错误的位置

如何在缩放投影矩阵Opengl的同时平移光标位置