【问题标题】:Orthographic projection with origin at screen bottom left原点在屏幕左下角的正交投影
【发布时间】:2012-11-04 20:13:38
【问题描述】:

我正在使用 python OpenGL 绑定,并尝试只使用现代 opengl 调用。我有一个带有顶点的 VBO,我正在尝试使用传递给顶点着色器的正交投影矩阵进行渲染。

目前我正在使用以下值计算我的投影矩阵:

from numpy import array

w = float(width)
h = float(height)
n = 0.5
f = 3.0

matrix = array([
                   [2/w,        0,        0,        0],
                   [  0,      2/h,        0,        0],
                   [  0,        0,  1/(f-n), -n/(f-n)],
                   [  0,        0,        0,        1],
               ], 'f')


#later
projectionUniform = glGetUniformLocation(shader, 'projectionMatrix')
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

我从这里得到的代码:

Formula for a orthogonal projection matrix?

这似乎工作正常,但我希望我的 Origin 位于屏幕的左下角。这是一个我可以在我的矩阵上应用的函数,所以一切都“正常工作”,还是我必须手动翻译每个对象 w/2 h/2?

旁注:坐标是否会与像素位置匹配并正常工作?

因为我使用的是现代 OpenGL 技术,所以我认为我不应该使用 gluOrtho2d 或 GL_PROJECTION 调用。

【问题讨论】:

    标签: math opengl matrix orthographic projection-matrix


    【解决方案1】:

    我对投影还不完全熟悉,因为我最近才开始 OpenGL 编程,但是您当前的矩阵没有转换任何点。对角线将应用缩放,但最右边的列将应用平移。 Dirk 提供的链接为您提供了一个投影矩阵,它将使您的原点(0,0 是您想要的,是吗?)屏幕的左下角。

    我用来做这个的矩阵(每一行实际上是 OpenGL 的一列):

    OrthoMat = mat4(
            vec4(2.0/(screenDim.s - left),  0.0,    0.0,    0.0),
            vec4(0.0,   2.0/(screenDim.t - bottom),     0.0,    0.0),
            vec4(0.0,   0.0,    -1 * (2.0/(zFar - zNear)),  0.0),
            vec4(-1.0 * (screenDim.s + left)/(screenDim.s - left), -1.0 * (screenDim.t + bottom)/(screenDim.t - bottom), -1.0 * (zFar + zNear)/(zFar - zNear), 1.0)
     );
    

    screenDim 数学实际上是宽度或高度,因为 left 和 bottom 都设置为 0。zFar 和 zNear 分别为 1 和 -1(因为它是 2D,它们不是非常重要)。

    这个矩阵以像素为单位,顶点位置也需要以像素为单位。当您调整屏幕大小时,点 (0, 32) 也将始终位于同一位置。

    希望这会有所帮助。

    编辑#1:为了清楚起见,我所说的左/下/zfar/znear 值是选择制作它们的值。您可以更改这些您认为合适的方式。

    【讨论】:

    • 非常感谢您的示例 Alex。通过结合这个和我混淆的 GL_FALSE,一切都按预期工作!
    【解决方案2】:

    您可以使用更通用的投影矩阵,该矩阵还使用左右位置。

    有关定义,请参阅Wikipedia

    【讨论】:

      【解决方案3】:
      glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)
      

      您的矩阵以行优先顺序存储。所以你应该传递 GL_TRUE,或者你应该将你的矩阵更改为列优先。

      【讨论】:

      • 感谢您发现 Nicol。关于如何将原点移动到左下角的任何想法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多