美文网首页
OpenGL键位控制方块移动

OpenGL键位控制方块移动

作者: 郝程序猿 | 来源:发表于2020-07-05 18:54 被阅读0次

    使用到的类库

    1.GLShaderManager

    2.GLTools

    3.GLUT

    一.针对方块的控制,我们首先可以先绘制一个正方形

     GLfloat blockSize = 0.1f;

     GLfloat vVerts[] = {        

        -blockSize,-blockSize,0.0f,       

        blockSize,-blockSize,0.0f,       

        blockSize,blockSize,0.0f,       

        -blockSize,blockSize,0.0f,

    };

    正方形坐标示意图

    对于绘制一个正方形来说,需要我们在设置图元方式的时候设置为GL_TRIANGLE_FAN

    triangleBatch.Begin(GL_TRIANGLE_FAN, 4);

    当然,还有很多的图元连接方式 :

    对应的图元连接方式

    二.在main函数中注册相应的回调函数

    int main(int argc,char *argv[]) {        

        gltSetWorkingDirectory(argv[0]);                 

        glutInit(&argc, argv);               

        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);      

        glutInitWindowSize(500, 500);      

        glutCreateWindow("Triangle");             

        glutReshapeFunc(changeSize);         

        glutDisplayFunc(RenderScene);         

        glutSpecialFunc(SpecialKeys);                       

        GLenum status = glewInit();       

         if (GLEW_OK != status) {                         

            printf("GLEW Error:%s\n",glewGetErrorString(status));                

            return 1;                

         }                  

        setupRC();             

        glutMainLoop();                  

        return  0;   

    }

    main函数中:

    gltSetWorkingDirectory(argv[0]) 设置当前工作目录

    glutInit(&argc, argv);初始化GLUT库

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);:初始化双缓冲窗口

     glutInitWindowSize(500, 500); GLUT窗口大小设置

    glutCreateWindow("Triangle");窗口设置标题为Triangle

    glutReshapeFunc(changeSize); 注册窗口大小更改时候的函数回调

     glutDisplayFunc(RenderScene);注册显示函数回调

    glutSpecialFunc(SpecialKeys);注册特殊键位函数回调

    setupRC();//设置渲染环境

    其中,我们设置的所有回调函数都可以自己定义名称,这里我定义的分别为changeSize、RenderScene、SpecialKeys

    其它函数我们不再赘述,主要说下自己注册的这几个回调

    changeSize:顾名思义,就是窗口大小更改的时候会自动回调这个函数,在此函数中,需要设置视口大小

    glViewport(0,0, w, h);

    RenderScene :显示的时候调用该函数,需要在此函数中清除特定的缓存区

    RenderScene流程图

    SpecialKeys:接收到键值回调函数,

    这里有两种计算形式:1.根据顶点进行计算 2. 根据矩阵方式进行计算

    但是这两种方式的核心为下图:

     以矩阵为例:设定xPos 与yPos stepSize 后即可进行方块移动的操作

    GLfloat xPos = 0.0f;

    GLfloat yPos = 0.0f;

    voidSpecialKeys(intkey,intx,inty){

         GLfloat stepSize =0.025f;

        if(key ==GLUT_KEY_UP) {

            yPos+= stepSize;

        }

        if(key ==GLUT_KEY_DOWN) {

            yPos-= stepSize;

        }

        if(key ==GLUT_KEY_LEFT) {

            xPos-= stepSize;

        }

        if(key ==GLUT_KEY_RIGHT) {

            xPos+= stepSize;

        }

        //碰撞检测

        if(xPos< (-1.0f+blockSize)) {

          xPos= -1.0f+blockSize;

        }

        if(xPos> (1.0f-blockSize)) {

            xPos=1.0f-blockSize;

        }

      if(yPos< (-1.0f+blockSize)) {

            yPos= -1.0f+blockSize;

        }

        if(yPos> (1.0f-blockSize)) {

            yPos=1.0f-blockSize;

        }

        glutPostRedisplay();

    }

    相关文章

      网友评论

          本文标题:OpenGL键位控制方块移动

          本文链接:https://www.haomeiwen.com/subject/ugwvqktx.html