矩形,三角形,三菱锥的绘制
- 首次接触OpenGL,发现它作为一个规格的专业的图形程序接口,学会使用它对自己有很大帮助。
- 前期自学看书,边敲边思考,有一定的c语言基础,发现可以很快理解。
(一)、矩形
#include<windows.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include<gl/glut.h>
#include<gl/gl.h>
#include<gl/glu.h>
void RenderScene()//用于在窗口中绘制需要的图形
{
glClear(GL_COLOR_BUFFER_BIT);//用当前清除色清除颜色缓冲区,即设定窗口的背景色
glColor3f(1.0f,0.0f,0.0f);//设置当前绘图使用的RGB颜色
glRectf(0.0f,40.0f,40.0f,0.0f);//使用当前颜色绘制一个填充的矩形,四个参数表示矩形左上角点和右下角点的坐标
glFlush();//刷新OpenGL命令队列
}
//是窗口大小改变时调用的登记函数
void ChangeSize(int w,int h)
{
if(h==0) h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-100.0f,100.0f,-100.0f*h/w,100.0f*h/w,-100.0f,100.0f);
else
glOrtho(-100.0f*w/h,-100.0f*w/h,-100.0f,100.0f,-100.0f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SetupRC()//用于初始化,常用来设置场景渲染状态
{
glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口的清除色为白色
}
void main()
{
//初始化GLUT库OpenGL窗口的显示模式
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutCreateWindow("GLRect");//创建一个名为GLRect的窗口
//设置当前窗口的显示回调函数和窗口再整形回调函数
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
SetupRC();
//启动主GLUT事件处理循环
glutMainLoop();
}
运行结果如图
(二)、三角形
#include<windows.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include<gl/gl.h>
#include<gl/glut.h>
//旋转参数
static GLfloat xRot=0.0f;
static GLfloat yRot=0.0f;
//确定多边形绕法的方向
BOOL bWinding=TRUE;
//初始化窗口
void SetupRC()
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
}
void ChangeSize(int w,int h)
{
if(h==0) h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-100.0f,100.0f,-100.0f*h/w,100.0f*h/w,-100.0f,100.0f);
else
glOrtho(-100.0f*w/h,-100.0f*w/h,-100.0f,100.0f,-100.0f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
//旋转图形
glPushMatrix();
glRotatef(xRot,1.0f,0.0f,0.0f);
glRotatef(yRot,0.0f,1.0f,0.0f);
//设置点的大小以及线宽
glPointSize(5);
glLineWidth(5);
//设置多边形绕法的方向是顺时针还是逆时针
if(bWinding)
glFrontFace(GL_CW);
else
glFrontFace(GL_CCW);
//绘制三角形
glBegin(GL_TRIANGLES);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(0,60,0);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-60,-60,0);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(60,-60,0);
glEnd();
glPopMatrix();
glutSwapBuffers();//刷新命令缓冲区
}
void SpecialKeys(int key,int x,int y)
{
if(key==GLUT_KEY_UP) xRot-=5.0f;
if(key==GLUT_KEY_DOWN) xRot+=5.0f;
if(key==GLUT_KEY_LEFT) yRot-=5.0f;
if(key==GLUT_KEY_RIGHT) yRot+=5.0f;
if(xRot>356.0f) xRot=0.0f;
if(xRot<-.10f) xRot=355.0f;
if(yRot>356.0f) yRot=0.0f;
if(y<-1.0f) yRot=355.0f;
//刷新窗口
glutPostRedisplay();
}
void ProcessMenu(int value)
{
switch(value)
{
case 1://修改多边形正面为填充模式
glPolygonMode(GL_FRONT,GL_FILL);
break;
case 2:
//修改多边形正面为线模式
glPolygonMode(GL_FRONT,GL_LINE);
break;
case 3:
//修改多边形正面为点充模式
glPolygonMode(GL_FRONT,GL_POINT);
break;
case 4:
//修改多边形反面为点充模式
glPolygonMode(GL_FRONT,GL_FILL);
break;
case 5:
//修改多边形反面为线模式
glPolygonMode(GL_FRONT,GL_LINE);
break;
case 6:
//修改多边形反面为点充模式
glPolygonMode(GL_FRONT,GL_POINT);
break;
case 7://设置多边形的阴影模式为平面明暗模式
glShadeModel(GL_FLAT);
case 8:
//设置多边形的阴影模式为光滑明暗模式
glShadeModel(GL_SMOOTH);
break;
case 9:
bWinding=!bWinding;
break;
default:
break;
}
glutPostRedisplay();
}
int main(int argc,char* argv[])
{
int nModeMenu;
int nMainMenu;
int nColorMenu;
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutCreateWindow("多边形演示");
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
//创建一个子菜单并定义菜单回调函数
nModeMenu=glutCreateMenu(ProcessMenu);
//添加菜单项,1表示选择菜单条目时传递的参数值
glutAddMenuEntry("正面多边形填充模式",1);
glutAddMenuEntry("正面线框模型",2);
glutAddMenuEntry("正面点模式",3);
glutAddMenuEntry("反面多边形填充模式",4);
glutAddMenuEntry("反面线框模型",5);
glutAddMenuEntry("反面点模式",6);
//增加一个子菜单
nColorMenu=glutCreateMenu(ProcessMenu);
glutAddMenuEntry("平面明暗模式",7);
glutAddMenuEntry("光滑明暗模式",8);
//创建主菜单
nMainMenu=glutCreateMenu(ProcessMenu);
glutAddSubMenu("多边形模式",nModeMenu);
glutAddSubMenu("颜色模式",nColorMenu);
glutAddMenuEntry("改变绕法",9);
//将创建的菜单与右键关联,即把菜单设置为右键弹出式菜单
glutAttachMenu(GLUT_RIGHT_BUTTON);
SetupRC();
glutMainLoop();
return 0;
}
运行结果如图* 通过方向键可以让图形旋转*
(三)、三菱锥
#include<windows.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include<gl/gl.h>
#include<gl/glut.h>
//旋转参数
static GLfloat xRot=0.0f;
static GLfloat yRot=0.0f;
BOOL bDepth=TRUE;//深度测试开关
BOOL bCull=TRUE;//剔除开关
void SetupRC()
{
//设置窗口背景颜色为黑色
glClearColor(0.0f,0.0f,0.0f,1.0f);
//指定多边形的阴影模式为平面阴暗模式
glShadeModel(GL_FLAT);
}
void ChangeSize(int w,int h)
{
if(h==0) h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-100.0f,100.0f,-100.0f*h/w,100.0f*h/w,-100.0f,100.0f);
else
glOrtho(-100.0f*w/h,-100.0f*w/h,-100.0f,100.0f,-100.0f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//在窗口中绘制图形
void RenderScene()
{
//清除颜色及深度缓冲区
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//是否开启设度测试
if(bDepth)
glEnable(GL_DEPTH_TEST);
else
glDisable(GL_DEPTH_TEST);
//是否打开剔除
if(bCull)
glEnable(GL_CULL_FACE);
else
glDisable(GL_CULL_FACE);
//旋转图形
glPushMatrix();
glRotatef(xRot,1.0f,0.0f,0.0f);
glRotatef(yRot,0.0f,1.0f,0.0f);
//指定顺时针绕法的多边形为多边形正面
glFrontFace(GL_CW);
//绘制三菱锥的三个棱面,他们的颜色分别为红,绿,蓝
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0,0.0,80.0);
glVertex3f(0.0,50.0,0.0);
glColor3f(1.0,0.0,0.0);
glVertex3f(50.0,-50.0,0.0);
glColor3f(0.0,1.0,0.0);
glVertex3f(-50.0,-50.0,0.0);
glColor3f(0.0,0.0,1.0);
glVertex3f(0.0,50.0,0.0);
glEnd();
glFrontFace(GL_CCW);
//绘制三菱锥的底面,其颜色为黄色
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0,50.0,0.0);
glVertex3f(50.0,-50.0,0.0);
glColor3f(1.0,1.0,0.0);
glVertex3f(-50.0,-50.0,0.0);
glEnd();
glPopMatrix();
//刷新命令缓冲区
glutSwapBuffers();
}
void SpecialKeys(int key,int x,int y)
{
if(key==GLUT_KEY_UP) xRot-=5.0f;
if(key==GLUT_KEY_DOWN) xRot+=5.0f;
if(key==GLUT_KEY_LEFT) yRot-=5.0f;
if(key==GLUT_KEY_RIGHT) yRot+=5.0f;
if(xRot>356.0f) xRot=0.0f;
if(xRot<-1.0f) xRot=355.0f;
if(yRot>356.0f) yRot=0.0f;
if(yRot<-1.0f) yRot=355.0f;
//刷新窗口
glutPostRedisplay();
}
void processMenu(int value)
{
switch(value)
{
case 1:bDepth=!bDepth;
break;
case 2:bCull=!bCull;
break;
default:
break;
}
glutPostRedisplay();
}
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutCreateWindow("三菱锥");
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
//创建右键菜单
glutCreateMenu(processMenu);
glutAddMenuEntry("深度测试",1);
glutAddMenuEntry("剔除背面",2);
glutAttachMenu(GLUT_RIGHT_BUTTON);
SetupRC();
glutMainLoop();
return 0;
}
运行结果如图* 通过方向键可以让图形旋转*