【问题标题】:OpenGL coordinates questionOpenGL坐标问题
【发布时间】:2010-03-26 01:13:44
【问题描述】:

我有一个简单的 OpenGL 绘图。当用户更改窗口的大小时,我希望绘图保持其纵横比。我通过在调用 reshape 方法时将 glViewport 设置为具有适当纵横比的最大矩形来实现这一点。

我的问题是我想画一个永远留在窗口右上角的正方形,不管窗口的大小或形状是什么。现在,只要窗口被重新塑造,这个方块就会在屏幕上移动。

谁能解释一下如何做到这一点?

谢谢,

【问题讨论】:

    标签: opengl coordinates


    【解决方案1】:

    在调整屏幕大小时,您需要移动/调整正方形的大小。您可以使用设备坐标将一个正方形固定在左上角,但它不一定是长宽比变化的正方形。因此,您需要调整正方形的大小以使其保持正方形。

    【讨论】:

      【解决方案2】:

      这样做的一种方法是创建一个映射到像素坐标的新正交矩阵(左 = 0,底部 = 0,右 = 窗口宽度,顶部 = 窗口高度)并将 gl-viewport 设置为覆盖每当窗口改变时整个窗口。这样,您可以通过指定像素坐标来绘制正方形,前提是您确保设置了单位模型-视图矩阵。

      不过,这不是唯一的方法。不管你有什么样的非奇异变换,只要 gl-viewport 覆盖这些像素,你应该能够想出一种方法来击中正确的像素,这样会更容易。

      【讨论】:

        【解决方案3】:

        如果我理解正确,您希望在 窗口 的右上角绘制一个正方形,而不管您的场景 viewport 位于何处。

        执行此操作的最简单方法是,在以所需的纵横比渲染正常场景后,将 gl 视口更改为要在顶角绘制的正方形。然后绘制一个“全屏”四边形来填充正方形,在这种情况下,全屏实际上变成了全视口。

        未经测试的半伪代码如下所示:

        // Draw normal scene
        glViewport(x, y, w, h);
        drawScene();
        
        // Draw top-right red square
        glViewport( windowWidth - squareWidth, windowHeight - squareHeight,
                    squareWidth, squareHeight );
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glColor3f(1.f, 0.f, 0.f);
        glRectf(-1.f, -1.f, 1.f, 1.f);
        

        确保 glRectf 的绕组与您当前的 gl 剔除面配置相匹配。或者,只需通过 glDisable(GL_CULL_FACE) / glEnable(GL_CULL_FACE) 暂时禁用剔除。

        【讨论】:

          【解决方案4】:

          要在窗口的右上角绘制一个正方形,您需要视口覆盖该区域。视口小于窗口将不允许在角落绘图。

          您希望您的视口覆盖所有窗口(如通常所做的那样),并且您的方形坐标应映射到以下内容:

          X0 = 1-2*s/width
          X1 = 1
          Y0 = 1-2*s/height
          Y1 = 1
          

          其中s 是正方形的边 (pix),width、height 是窗口的尺寸 (pix)。

          【讨论】:

            猜你喜欢
            • 2012-03-06
            • 1970-01-01
            • 2017-05-28
            • 1970-01-01
            • 1970-01-01
            • 2012-07-18
            • 1970-01-01
            • 2020-12-24
            相关资源
            最近更新 更多