如何在opengl中在平面上移动三角形

时间:2011-04-04 08:04:07

标签: opengl

我想在飞机上移动三角形。我将如何做。我使用opengl“过剩”并且我想保持三角形的坐标位置。第一次它将从点开始(0,0, - 6)然后当我按下“a”时,它将向左移动,当我按下“d”时,这将“向右”移动。我知道“w”和“s”的opengl中的关键操作定义。但我主要关注的是是与协调点的运动和结合。

Thankie

1 个答案:

答案 0 :(得分:4)

使用全局变量存储程序状态。其中一个状态是三角形位置。在键盘处理程序中修改此变量,然后调用glutPostRedisplay。在显示功能中,根据程序的状态绘制场景。

重要提示:OpenGL“仅仅”是一个复杂的光栅化器API,这意味着它“暂时生活”,即您只是用它绘制三角形,并且在您发送渲染命令后它们已经被处理过OpenGL没有关于发送的几何体的“持久性”和唯一留下的痕迹是帧缓冲区中的变化。

如果您正在寻找的更多的是“我想描述一个由几何对象组成的场景,那些将通过一些黑盒机制进行交互”,那么您正在寻找一个所谓的场景图,OpenGL不是(但许多场景图使用OpenGL作为后端)。

编辑:完整示例源代码

#include <GL/gl.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();
}