OpenGL学习之绘制立方图
2014-09-11 19:14
661 查看
程序
首先我从网上看到一个程序,现在跟大家分享一下,该程序是实现立方体绘制最简单的程序了#include <gl/glut.h> //引用相关包 #include <gl/glaux.h> void display(void) { glClear(GL_COLOR_BUFFER_BIT); //清空颜色缓冲区 glColor3f(0,1,1); //重置颜色 //glLoadIdentity(); //清空矩阵 glTranslatef(0,0,-10); //将场景中的物体沿z轴负方向移动5个单位长 glRotatef(40,0,1,0); ////gluLookAt(0,0,5,0,0,0,0,2,0); //视点变换 //glScalef(1,2,1); //模型变换 glutWireCube(2); //绘制实心立方体和线框立方体 //auxWireBox(2,2,2); glFlush(); //刷新窗口以显示当前绘制图形 } void init(void) { glClearColor(0,0,0,0); //glShadeModel(GL_FLAT); //选择平面明暗模式或光滑明暗模式 } void reshape(int w,int h) { glViewport(0,0,(GLsizei)w/2,(GLsizei)h/2); //设置机口 glMatrixMode(GL_PROJECTION); //指定哪一个矩阵是当前矩阵 glLoadIdentity(); gluPerspective(30,1,1.5,20); //创建透视投影矩阵(fovy,aspect,zNear,zFar); //glFrustum(-1,1,-1,1,1.5,20.0); //用透视矩阵乘以当前矩阵(left,Right,bottom,top,near,far); glMatrixMode(GL_MODELVIEW); //glViewport(0,0,(GLsizei)w*3/4,(GLsizei)h*3/4); //glMatrixMode(GL_PROJECTION); //指定哪一个矩阵是当前矩阵 //glLoadIdentity(); //glRectf(1,1,2,2); } int main(int argc, char *argv[]) { glutInit(&argc, argv); //固定格式 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //缓存模式 glutInitWindowSize(400, 400); //显示框的大小 glutInitWindowPosition(400,400); //确定显示框左上角的位置 glutCreateWindow("绘制立方体"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); //进人GLUT事件处理循环 return 0; }
效果图是
对程序中的函数进行讲解
glTranslatef主要是用来进行平移操作的,例如下面的例子
glTranslatef(0.0f,-20.0f,-40.0f)表示将当前图形向x轴平移0,向y轴平移-20,向z轴平移-40
glScaled主要是用来对物体进行刚性放缩使用的,具体用法解析参考下面的例子
glScaled(10.0f,10.0f,10.0f)表示将当前图形沿x,y,z轴分别放大为原来的10倍
glRotatef主要是用于对图形进行旋转操作的,具体的用法解析可以参考下面的例子进行
glRotatef(-80.0f,10.0f,1.0f,0.0f)表示将当前图形沿方向向量(-10,1,0)顺时针旋转80度。
glutWireCube(x)中x指的是所画cube的边长
glViewport(GLint x,GLint y,GLsizei width,GLsizei height)为其函数原型。
X,Y————以像素为单位,指定了视口的左下角(在第一象限内,以(0,0)为原点的)位置。
width,height————表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。
glMatrixMode - 指定哪一个矩阵是当前矩阵
glMatrixMode设置当前矩阵模式:
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.
与glLoadIdentity()一同使用
glLoadIdentity():将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
在glLoadIdentity()之后我们为场景设置了透视图。glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。
另外一种方法
上面的程序基本上可以搞定的话,下面的程序基本上都不是问题废话不说直接上代码,为了让渲染的效果变得清晰明白,为立方体的每一面加载一个不同的颜色
#include <gl/glut.h> #include <math.h> GLfloat AngleX; GLfloat AngleY; typedef GLint vert3[3]; vert3 pt[8] = {{0,0,0},{0,20,0},{20,0,0},{20,20,0},{0,0,20},{0,20,20},{20,0,20},{20,20,20}}; 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(); } void display1() { quad(6,2,3,7); glColor3f(1.0,0.0,0.0); quad(5,1,0,4); glColor3f(1.0,1.0,0.0); quad(7,3,1,5); glColor3f(1.0,1.0,0.0); quad(4,0,2,6); glColor3f(1.0,1.0,1.0); quad(2,0,1,3); glColor3f(0.0,1.0,0.0); quad(7,5,4,6); glColor3f(1.0,0.0,1.0); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空颜色缓冲区 //glColor3f(0,1,1); //重置颜色 glMatrixMode(GL_MODELVIEW); //glLoadIdentity(); //清空矩阵 //glTranslatef(0,0,4); //将场景中的物体沿z轴负方向移动5个单位长 //glRotatef(60,1,0,0); //////gluLookAt(0,0,5,0,0,0,0,2,0); //视点变换 //glScalef(3,2,2); //模型变换 glPushMatrix(); { glRotatef(AngleX,1.0f,0.0f,0.0f); glRotatef(AngleY,0.0f,1.0f,0.0f); display1();//绘制实心立方体和线框立方体 //auxWireBox(2,2,2); } glPopMatrix(); glutSwapBuffers(); //刷新窗口以显示当前绘制图形 } void init(void) { AngleX = 45.0f; AngleY = 315.0f; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); glEnable(GL_DITHER); glShadeModel(GL_SMOOTH); } void reshape(int w,int h) { GLfloat aspect = (GLfloat)w / (GLfloat)h; GLfloat nRange = 100.0f; glViewport(0,0,(GLsizei)w,(GLsizei)h); //设置机口 glMatrixMode(GL_PROJECTION); //指定哪一个矩阵是当前矩阵 glLoadIdentity(); //gluPerspective(30,1,1.5,20); //创建透视投影矩阵(fovy,aspect,zNear,zFar); //glFrustum(-1,1,-1,1,1.5,20.0); //用透视矩阵乘以当前矩阵(left,Right,bottom,top,near,far); //glMatrixMode(GL_MODELVIEW); //glViewport(0,0,(GLsizei)w*3/4,(GLsizei)h*3/4); //glMatrixMode(GL_PROJECTION); //指定哪一个矩阵是当前矩阵 //glLoadIdentity(); //glRectf(1,1,2,2); if (w<=h) { glOrtho(-nRange, nRange, -nRange * aspect, nRange * aspect, -nRange, nRange); } else { glOrtho(-nRange, nRange, -nRange / aspect, nRange / aspect, -nRange, nRange); } } void key_board(GLint key,GLint x,GLint y) { if(key == GLUT_KEY_UP) { AngleX -= 5.0f; } if(key == GLUT_KEY_DOWN) { AngleX += 5.0f; } if(key == GLUT_KEY_LEFT) { AngleY -= 5.0f; } if(key == GLUT_KEY_RIGHT) { AngleY += 5.0f; } if(AngleX > 355.0f) { AngleX = 0.0f; } if(AngleX < 0.0f) { AngleX = 355.0f; } if(AngleY > 355.0f) AngleY = 0.0f; if(AngleY < 0.0f) { AngleY = 355.0f; } glutPostRedisplay(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); //固定格式 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); //缓存模式 glutInitWindowSize(400, 400); //显示框的大小 glutInitWindowPosition(0,0); //确定显示框左上角的位置 glutCreateWindow("绘制立方体"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutSpecialFunc(key_board); init(); glutMainLoop(); //进人GLUT事件处理循环 return 0; }
效果是同可以操作的3D图形
如下所示:
相关文章推荐
- 从分析blender轮廓提取技术中学习opengl如何绘制三维模型轮廓
- Android OpenGL学习笔记(二)之----三角形的绘制.
- OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)
- OpenGL学习笔记(一):状态管理与绘制
- OpenGL入门学习[二] 绘制简单的几何图形
- 我的opengl编程学习(一)(简介、绘制图像、三维观察、光照)
- OpenGL学习笔记()多边形绘制-cullface
- 【OpenGL学习代码笔记之二】 三维空间中点的绘制
- 【OpenGL学习代码笔记之一】 基本形状绘制及动画初窥
- opengl学习笔记2-2-矩形绘制
- openGL学习笔记二、状态管理和绘制几何体【editing】
- Android OpenGL学习笔记(二)之----三角形的绘制.
- OpenGL学习笔记 (2) —— 绘制多边形
- OpenGL入门学习——第十五课,从“绘制一个立方体”来看OpenGL的进化过程
- opengl学习笔记(三)-点和线段的绘制
- Android OpenGL学习笔记(二)之----三角形的绘制.
- 黄聪:OpenGl 初级入门学习视频教程, 绘制一个立方体
- OpenGL学习(绘制非凸多边形)
- opengl学习小笔记(2)使用OpenGL绘制嵌套旋转六边形
- opengl学习笔记3-1-在3D中绘制点