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

基本图元

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)