【openGL基础系列】之画一个正方体玩玩吧
大家好,我是Lampard~~
欢迎来到openGL基础系列的博客
今天讲的是如何在openGL中画一个正方体
前言:大家都知道,一个正方体包括六个面 ,十二条线。所以我们创造一个正方体的时候既可以使用线的组合,也可以用面的组合来表示。为了让我们更加直观的看到这个正方体,我还在博客上参考了别人的算法,让整个正方体转起来。话不多说我们来看看代码和成品图吧:
1. 构建正方体的坐标
typedef GLint vertex3[3];
vertex3 pt[8] = {
{0, 0, 0},
{0, 1, 0},
{1, 0, 0},
{1, 1, 0},
{0, 0, 1},
{0, 1, 1},
{1, 0, 1},
{1, 1, 1}
};
2. 构建一个正方形
void quad(GLint n1, GLint n2, GLint n3, GLint n4){
// 构建一个正方形
glBegin(GL_QUADS);
glVertex3iv(pt[n1]);
glVertex3iv(pt[n2]);
glVertex3iv(pt[n3]);
glVertex3iv(pt[n4]);
glEnd();
}
3. 构建一个正方体
void cube(void) {
// 构建六个面
quad(6, 2, 3, 7);
quad(5, 1, 0, 4);
quad(7, 3, 1, 5);
quad(4, 0, 2, 6);
quad(2, 0, 1, 3);
quad(7, 5, 4, 6);
}
4. 让整个正方体旋转起来
static float rotate = 0;
static int times = 0;
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); // 对模型视景进行操作
glLoadIdentity(); // 将当前矩阵设置为单位矩阵
glPushMatrix(); // 保存当前的位置
times++;
if (times > 100)
{
times = 0;
}
if (times % 100 == 0)
{
rotate += 0.3;
}
glRotatef(rotate, 0, 1, 0);
glRotatef(rotate, 1, 0, 0);
glColor3f(255, 255, 255);
cube();
glPopMatrix(); // 返回之前的位置
glutSwapBuffers(); // 使用双缓冲模式存储
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); // 使用双缓冲
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500);
glutCreateWindow("GLDemo");
glutDisplayFunc(renderScene);
glutIdleFunc(renderScene); // 不断的执行回调直至下一个窗口事件的发生
glutMainLoop();
}
以上已经加上了我对代码的备注,对于旋转的算法我暂时也了解得不太清楚,我们就先知道他怎么用,之后再慢慢理解其原理。现在我们来看看我们的成品:
OK,本章内容到此结束,更多内容,敬请关注!!!
各位大佬记得点赞关注支持........