OpenGL初探---正方形键位控制

261 阅读1分钟

前言

上次绘制了一个三角形,今天我们来绘制一个正方形,并用键盘来控制它的移动。 先看一下效果:

基本图元

GL_LINES 点

GL_LINES 独立线段

GL_LINE_STRIP 线段间首尾相连但最终不闭合

GL_LINE_LOOP 线段间首尾相连最终封口闭合

GL_POLYGON 按点的定义顺序依次连接

GL_TRIANGLES 从第1个点开始,每三个点一组画一个三角形,三角形之间是独立的

GL_TRIANGLE_STRIP 从第三个点开始,每点与前面的两个点组合画一个三角形,即线性连续三角形串

GL_TRIANGLE_FAN 从第三个点开始,每点与前一个点和第一个点组合画一个三角形,即扇形连续三角形

绘制正方形

//blockSize 边长
GLfloat blockSize = 0.2f;

//正方形的4个点坐标
GLfloat vVerts[] = {
        -blockSize,-blockSize,0.0f,
        blockSize,-blockSize,0.0f,
        blockSize,blockSize,0.0f,
        -blockSize,blockSize,0.0f
};


void setupRC()
{
    //设置清屏颜色(背景颜色)
    glClearColor(0.3f, 0.3f, 0.3f, 1);
    
    //初始化一个渲染管理器。
    shaderManager.InitializeStockShaders();
    
    //修改为GL_TRIANGLE_FAN ,4个顶点
    triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
    
}

键位控制

在main函数中设置特殊键位触发函数

   glutSpecialFunc(SpecialKeys);

在SpecialKeys函数中记录键位移动的坐标距离,并手动调用渲染。

//记录在x轴上平移的距离
GLfloat xPos = 0.0f;
//记录在y轴上平移的距离
GLfloat yPos = 0.0f;


void SpecialKeys(int key, int x, int y){

    GLfloat stepSize = 0.05f;
    
    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();
}
//使用矩阵渲染
void RenderScene(void)
{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    GLfloat vRed[] = {1.0f,0.0f,0.0f,0.0f};
    M3DMatrix44f mTransfromMatrix;
    //设置平移矩阵
    m3dTranslationMatrix44(mTransfromMatrix, xPos, yPos, 0.0f);
    //将矩阵结果 提交给固定着色器(平面着色器)中绘制
    shaderManager.UseStockShader(GLT_SHADER_FLAT,mTransfromMatrix,vRed);
    triangleBatch.Draw();
    //执行交换缓存区
    glutSwapBuffers();
    
}

代码地址:github.com/czzj0212/Op… (OpenGL --- 02)