Нужно ли повторять вызов glOrtho после всего кода рисования? - PullRequest
1 голос
/ 06 января 2012

Я создаю 2D игру с OpenGL.Каждый раз, когда я перемещаю свой объект, я должен вызывать glLoadIdentity, потому что в противном случае все объекты будут перемещены, но glLoadIdentity также сбрасывает вызов glOrtho, поэтому в основном я заканчиваю что-то вроде этого:

#include <GL/glfw.h>

int main()
{
glfwInit();

glfwOpenWindowHint( GLFW_WINDOW_NO_RESIZE, GL_TRUE );
glfwOpenWindowHint( GLFW_FSAA_SAMPLES, 8 );
glfwOpenWindow( 800, 600, 0, 0, 255, 0, 32, 0, GLFW_WINDOW );

glfwSetWindowTitle( "title" );

glfwSwapInterval( 1 ); // also known as 'vsync'

glfwEnable( GLFW_KEY_REPEAT );
//glfwDisable( GLFW_MOUSE_CURSOR );

glOrtho(0.0, 1024, 768, 0, -1.0, 1.0); 
glMatrixMode( GL_MODELVIEW );

while( !glfwGetKey( GLFW_KEY_ESC ) )
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glLoadIdentity();
    glOrtho(0.0, 1024, 768, 0, -1.0, 1.0); 

    glTranslatef( 100, 0, 0 );

    glColor3f(0.5f,0.5f,1.0f);
    glBegin(GL_POLYGON);
      glVertex2f(100, 100);
      glVertex2f(100, 250);
      glVertex2f(250, 250);
      glVertex2f(250, 100);
    glEnd();

    glLoadIdentity();
    glOrtho(0.0, 1024, 768, 0, -1.0, 1.0); 

    glRotatef( 25,0,0,1);

    glBegin(GL_POLYGON);
      glVertex2f(300, 300);
      glVertex2f(300, 450);
      glVertex2f(450, 450);
      glVertex2f(450, 300);
    glEnd();

    glFlush();

    glfwSwapBuffers();
}

glfwTerminate();
}

Как это сделать правильно, чтобы отображать, перемещать и вращать объекты с включенной glOrtho?

Ответы [ 2 ]

5 голосов
/ 06 января 2012

но glLoadIdentity также сбрасывает вызов glOrtho, так что в основном я заканчиваю что-то вроде этого

glOrtho относится к матрице проекции, а не к матрице вида модели. Ответ, который вы приняли, не является концептуально неправильным, но он пропустил эту часть. Эта часть вашего кода должна выглядеть как

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1024, 768, 0, -1.0, 1.0); 

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef( 100, 0, 0 );

glColor3f(0.5f,0.5f,1.0f);
glBegin(GL_POLYGON);
  glVertex2f(100, 100);
  glVertex2f(100, 250);
  glVertex2f(250, 250);
  glVertex2f(250, 100);
glEnd();

glLoadIdentity();

glRotatef( 25,0,0,1);

glBegin(GL_POLYGON);
  glVertex2f(300, 300);
  glVertex2f(300, 450);
  glVertex2f(450, 450);
  glVertex2f(450, 300);
glEnd();

glFlush();

glfwSwapBuffers();
4 голосов
/ 06 января 2012

Вам нужны glPushMatrix () и glPopMatrix (). Оформить заказ:

http://www.swiftless.com/tutorials/opengl/pop_and_push_matrices.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...