您的位置:首页 > 运维架构

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(); glScaled(); glRotatef();函数是OpenGL图形开发包自带的函数
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图形
如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm 应用 opengl