本文介绍了需要帮助这个opengl程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以理解这个功能,但是无法理解它在这个步骤中是如何工作的。



我是什么尝试过:



i can understand the function but cant understand how it work with this steps in c
++

What I have tried:





#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();
}

推荐答案


这篇关于需要帮助这个opengl程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-21 00:55