没有变形的对象 - OpenGL

时间:2014-02-20 16:19:20

标签: opengl

任何人都知道如何保持一个没有变形的三角形,并且总是在窗户的中间,无论他的大小是多少?

我知道我必须使用reshape函数进行一次回调然后定义它,但我不确定resize函数内部的内容:

void resize(int width, int height) {

 viewport(0,0,width,height); 

 ...?

}

我有这个主要帮助。 glutInitWindowSize(600, 600);

2 个答案:

答案 0 :(得分:0)

由于GL调用使用范围从-1到+1的标准化顶点坐标,因此可以通过使用与屏幕像素大小无关的右坐标将任何对象保持在屏幕的中心。

然而,相同的独立性还会带来这样的行为:除非明确考虑,否则取决于屏幕纵横比(或窗口纵横比,视情况而定),对象也将发生变化。请参阅How can i convert an oval to circle openGL ES2.0 Android

中的讨论

答案 1 :(得分:0)

这是一个重要的提示:不要使用resize回调对OpenGL做任何事情。

  

我知道我必须使用reshape函数进行一次回调然后定义它,但我不确定resize函数内部会发生什么:

然后你就错了。

这导致了很多混乱。 OpenGL是一个基于状态的绘图API,与所有状态机一样,它应该在使用之前重置为一个众所周知的状态。这包括投影和视口。考虑到这一点,你的问题变得微不足道

void display()
{
    /* draw some stuff */
    glViewport(...);
    setup_projection();
    setup_modelview();
    draw_stuff();

    /* draw some other stuff with different projection and modelview */
    glViewport(...);
    setup_other_projection();
    setup_other_modelview();
    draw_other_stuff();

    /* ... */

    swapBuffers();
}

如果您正在使用GLUT,则可以使用glutGet(GLUT_WINDOW_WIDTH)glutGet(GLUT_WINDOW_HEIGHT)来检索视口调用的窗口大小。

因此,在您的情况下,您将使用覆盖整个窗口的glViewport以及始终将特定视图空间映射到该视口的投影。例如

void display()
{
    int const win_width = glutGet(GLUT_WINDOW_WIDTH);
    int const win_height = glutGet(GLUT_WINDOW_HEIGHT);
    float const win_aspect = (float)win_width / (float) win_height;

    glViewport(0, 0, win_width, win_height);

    /* Using fixed function pipeline for brevity */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    /* map the vertical range -1…1 to the window height and
       a symmetric range -aspect … 0 … +aspect to the viewport */
    glOrtho(-win_aspect, win_aspect, -1, 1, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    draw_triangle();

    /* ... */

    glutSwapBuffers();
}