Sarah Fares Ответов: 1

Нужна помощь с этой программой opengl


я могу понять эту функцию, но не могу понять, как она работает с этими шагами в c
++

Что я уже пробовал:



#include <windows.h>   // use as needed for your system
#include <gl/Gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#define ORTHO_SCALE 10.

GLfloat triangle_vertices[] = {
    -0.5, 0.0,
     0.5, 0.0,
     0.0, 1.0
};

struct {
    struct {
        struct {
            GLfloat x, y;
        } pos;
        GLfloat rot;
    } triangle;
} sceneinfo;

void display(void);
void keyboard(unsigned char key, int x, int y);
void special(int key, int x, int y);

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

    glutCreateWindow("simple triangle test");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutSpecialFunc(special);

    glutMainLoop();

    return 0;
}

void display(void)
{
    GLuint win_width, win_height;
    GLfloat win_aspect;

    win_width  = glutGet(GLUT_WINDOW_WIDTH);
    win_height = glutGet(GLUT_WINDOW_HEIGHT);
    win_aspect = (float)win_width/(float)win_height;

    glViewport(0, 0, win_width, win_height);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-win_aspect * ORTHO_SCALE, 
             win_aspect * ORTHO_SCALE, 
        -ORTHO_SCALE, 
         ORTHO_SCALE,
         -1., 1.);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();

    glTranslatef(sceneinfo.triangle.pos.x, sceneinfo.triangle.pos.y, 0.);
    glRotatef(sceneinfo.triangle.rot, 0, 0, 1.);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, triangle_vertices);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glPopMatrix();

    glutSwapBuffers();
}

void keyboard(unsigned char key, int x, int y)
{
    switch(key) {
    case '+':
        sceneinfo.triangle.rot += 2.;
        break;
    case '-':
        sceneinfo.triangle.rot -= 2.;
        break;
    }
    glutPostRedisplay();
}

void special(int key, int x, int y)
{
    switch(key) {
    case GLUT_KEY_LEFT:
        sceneinfo.triangle.pos.x -= 0.2;
        break;
    case GLUT_KEY_RIGHT:
        sceneinfo.triangle.pos.x += 0.2;
        break;
    case GLUT_KEY_UP:
        sceneinfo.triangle.pos.y += 0.2;
        break;
    case GLUT_KEY_DOWN:
        sceneinfo.triangle.pos.y -= 0.2;
        break;
    }
    glutPostRedisplay();
}

Dave Kreskowiak

Тааак вы хотите, чтобы кто-то сказал вам, что означает каждая строка кода этого довольно большого дампа? Этого просто не произойдет.

1 Ответов

Рейтинг:
4

Patrice T

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.