1.我提供一个不需要配置环境就可运行的源码。
glut.h放在项目上一层include/gl目录。
glut.lib和glut32.lib放在上一层lib目录。
glut.dll和glut32.dll放exe同目录。
2.不需要配置环境变量。
3.头文件glut.h和库文件glut.lib与glut32.lib
这是include和lib
设计
#include <gl/glut.h>
#include "Shell.h"
#include "Box.h"
#include "Matrix.h"
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
//炮弹发射
Shell(argc,argv);
//方块世界
//Box(argc,argv);
//矩阵变换
//Matrix(argc,argv);
return 0;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
Shell.h
#include "Shell.h"
GLfloat f_Speed = 80.0f;
GLfloat f_X = -70;
GLfloat f_Y = -70;
GLfloat f_Agle = 45;
void Shell_Reshape(GLsizei w,GLsizei h)//重绘回调
{
GLfloat aspectRatio;
//防止被0所除
if (h==0)
{
h=1;
}
//把视口设置为窗口的大小
glViewport(0,0,w,h);
//重置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//建立裁剪区域(左,右,底,顶,近,远)
aspectRatio = (GLfloat)w / (GLfloat)h;
if(w <= h)
glOrtho(-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else
glOrtho(-100.0 * aspectRatio, 100.0*aspectRatio, -100.0, 100.0, 1.0, -1.0);
//
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//设置渲染状态
void Shell_SetupRC(void)
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
}
//绘制场景
void Shell_RenderScene(void)
{
//用当前清除颜色清除窗口
glClear(GL_COLOR_BUFFER_BIT);
//画速度指示条
//绿色
glColor3f(0.0f,1.0f,0.0f);
//平移
glPushMatrix();
glTranslatef(0.0f,80.0f,0.0f);
glTranslatef(-90.0f,0.0f,0.0f);
//指示条
glRectf(0.0f, 0.0f, f_Speed, 10.0f);
//还原
glPopMatrix();
//画炮台
//灰色
glColor3f(1.0f,1.0f,1.0f);
//平移
glPushMatrix();
glTranslatef(-77.0f,-86.0f,0.0f);
//炮台
glBegin(GL_POLYGON);
glVertex2f(0.0f, 0.0f);
glVertex2f(13.0f, 0.0f);
glVertex2f(10.0f, 16.0f);
glVertex2f(3.0f, 16.0f);
glVertex2f(0.0f, 0.0f);
glEnd();
//还原
glPopMatrix();
//画炮管
//灰色
glColor3f(1.0f,0.0f,1.0f);
//平移
glPushMatrix();
glTranslatef(-70.0f,-70.0f,0.0f);
glRotatef(f_Agle,0.0,0.0,1.0);
//炮管
glBegin(GL_POLYGON);
glVertex2f(-5.0f, 5.0f);
glVertex2f(45.0f, 5.0f);
glVertex2f(45.0f, -5.0f);
glVertex2f(-5.0f, -5.0f);
glVertex2f(-5.0f, 5.0f);
glEnd();
//还原
glPopMatrix();
//画炮弹
//红色
glColor3f(1.0f,0.0f,0.0f);
//平移
glPushMatrix();
glTranslatef(f_X,0,0.0f);
glTranslatef(0,f_Y,0.0f);
glRotatef(f_Agle-45,0.0,0.0,1.0);
//炮弹
glBegin(GL_TRIANGLES);
glVertex3f(-5.0f,5.0f, 0.0f);
glVertex3f(5.0f,5.0f, 0.0f);
glVertex3f(5.0f,-5.0f, 0.0f);
glEnd();
//还原
glPopMatrix();
//刷新绘图命令
glFlush();
}
void Shell_SpecialKeys(int key, int x, int y)//特殊按键F1之类
{
GLfloat fOld = f_Speed;
switch(key)
{
case GLUT_KEY_DOWN:
f_Agle -= 5;
break;
case GLUT_KEY_UP:
f_Agle += 5;
break;
case GLUT_KEY_LEFT:
f_Speed -= 10.0f;
break;
case GLUT_KEY_RIGHT:
f_Speed += 10.0f;
break;
}
if (f_Speed < 10.0f || f_Speed > 180.0f)
{
f_Speed = fOld;
return;
}
if (f_Agle < 0)
{
f_Agle = 0;
return;
}
if (f_Agle > 90)
{
f_Agle = 90;
return;
}
glutPostRedisplay();//重绘消息
}
void Shell_timer(int id)//定时器
{
f_X += 5.0f * cos((f_Agle/180)*Pi);
f_Y += 5.0f * sin((f_Agle/180)*Pi);
glutPostRedisplay();
glutTimerFunc((190-f_Speed)*5,Shell_timer,5);//需要在函数中再次调用,才能完成循环。
}
void Shell_key(unsigned char key,int x,int y)//键盘鼠标事件
{
if (key == ' ')
{
f_X = -70;
f_Y = -70;
}
glutPostRedisplay();//重绘消息
}
//main调用
int Shell(int argc, char* argv[])
{
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);//窗体大小
glutInitWindowPosition(500,100);//起始位置
glutCreateWindow("炮弹发射");//创建窗体
glutDisplayFunc(Shell_RenderScene);//类OnDraw()
glutReshapeFunc(Shell_Reshape);//重绘回调
glutKeyboardFunc(Shell_key);//键盘事件
glutSpecialFunc(Shell_SpecialKeys);//特殊按键F1之类
glutTimerFunc((190-f_Speed)*5,Shell_timer,5);
Shell_SetupRC();//类Init()
cout<<"上下键控制角度,左右键控制发射速度。"<<endl;
glutMainLoop();//消息循环
return 0;
}
Box.cpp
#include "Box.h"
double rotatex=0,rotatey=0,rotatez=0;
double movex=0,movey=0,movez=0;
double zoomx=0.5,zoomy=0.5,zoomz=0.5;
vector<structCube> vecCube;
void Box_Init(void)
{
glClearColor(0.0,0.0,0.0,0.0);//黑色清屏
AddCube(1,1,1,0,0,1);
AddCube(0,0,0,1,0,1);
AddCube(-1,-1,0,0,1,1);
}
void AddCube(int x,int y,GLfloat fR,GLfloat fG,GLfloat fB,GLfloat fWidth)
{
structCube cube;
cube.x = x;
cube.y = y;
cube.fR = fR;
cube.fG = fG;
cube.fB = fB;
cube.fWidth = fWidth;
vecCube.push_back(cube);
}
void Box_Display(void)
{
//
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0*64/48.0,2.0*64/48.0,-2.0,2.0,0.1,100);
//
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(2.0,2.0,2.0,0.7,0.7,0.0,0.0,1.0,0.0);//设置相机
glClear(GL_COLOR_BUFFER_BIT);
//变换
glPushMatrix();
//平移
glTranslatef (movex + 2,0.0, 0.0);//x轴平移
glTranslatef (0.0, movey + 2, 0.0);//y轴平移
//旋转
glRotatef (rotatez, 0.0, 0.0, 1.0);//z轴旋转
glRotatef (rotatex, 1.0, 0.0, 0.0);//x轴旋转
glRotatef (rotatey, 0.0, 1.0, 0.0);//y轴旋转
//缩放
glScalef(zoomx,zoomy,zoomz);//缩放
for(vector<structCube>::iterator iter=vecCube.begin();iter!=vecCube.end();iter++)
{
DrawCube(iter->x,iter->y,iter->fR,iter->fG,iter->fB,iter->fWidth);
}
//还原
glPopMatrix();
glFlush();//绘图
}
void DrawCube(int x,int y,GLfloat fR,GLfloat fG,GLfloat fB,GLfloat fWidth)
{
glColor3d(fR,fG,fB);//设置立方体边颜色
GLfloat fX = (GLfloat)x;
GLfloat fY = (GLfloat)y;
fX = (fX - 400) / 400;
fY = (fY - 400) / 400;
//cout<<fX<<","<<fY<<endl;
glTranslatef (fX,0.0, 0.0);//x轴平移
glTranslatef (0.0, fY, 0.0);//y轴平移
glutWireCube(fWidth);//绘制立方体
}
void Box_specialKey(GLint key,GLint x,GLint y)
{
switch(key)
{
case GLUT_KEY_UP:
movey+=0.1;
break;
case GLUT_KEY_DOWN:
movey+=-0.1;
break;
case GLUT_KEY_LEFT:
movex+=-0.1;
movey+=-0.03;
break;
case GLUT_KEY_RIGHT:
movex+=0.1;
movey+=0.03;
break;
case GLUT_KEY_PAGE_UP:
zoomx+=0.2;
zoomy+=0.2;
zoomz+=0.2;
break;
case GLUT_KEY_PAGE_DOWN:
zoomx+=-0.2;
zoomy+=-0.2;
zoomz+=-0.2;
break;
}
glutPostRedisplay();
}
void Box_Keyboard(unsigned char key,GLint x,GLint y)
{
switch(key)
{
case 'w':
movey+=0.1;
break;
case 'a':
movex+=-0.1;
movey+=-0.03;
break;
case 'd':
movex+=0.1;
movey+=0.03;
break;
case 's':
movey+=-0.1;
break;
case 'x':
rotatex+=0.5;
break;
case 'y':
rotatey+=0.5;
break;
case 'z':
rotatez+=0.5;
break;
}
glutPostRedisplay();
}
void Box_Mouse(int button,int state,int x,int y)
{
if(state==GLUT_DOWN)
{
if(button==GLUT_LEFT_BUTTON)
{
AddCube(x,y,0,1,0,1);
}
else if(button==GLUT_RIGHT_BUTTON)
{
AddCube(x,y,0,0,1,0.5);
}
}
glutPostRedisplay();
}
//main调用
void Box(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(800,600);
glutInitWindowPosition(500,150);
glutCreateWindow("鼠标左键放大,右键缩小.");
glutDisplayFunc(Box_Display);
glutKeyboardFunc(Box_Keyboard);
glutSpecialFunc(Box_specialKey);
glutMouseFunc(Box_Mouse);
Box_Init();
cout<<"鼠标点击添加。"<<endl;
cout<<"Page Up放大,Page Down缩小。"<<endl;
cout<<"上下左右键平移。"<<endl;
cout<<"x,y,z键旋转。"<<endl;
glViewport(0,0,640,480);
glutMainLoop();
}
Matrix.cpp
#include "Matrix.h"
void Matrix_Reshape(GLsizei w,GLsizei h)//重绘回调
{
GLfloat aspectRatio;
//防止被0所除
if (h==0)
{
h=1;
}
//把视口设置为窗口的大小
glViewport(0,0,w,h);
//重置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//建立裁剪区域(左,右,底,顶,近,远)
aspectRatio = (GLfloat)w / (GLfloat)h;
if(w <= h)
glOrtho(-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else
glOrtho(-100.0 * aspectRatio, 100.0*aspectRatio, -100.0, 100.0, 1.0, -1.0);
//
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//设置渲染状态
void Matrix_Init(void)
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
}
//绘制场景
void Matrix_Display(void)
{
//用当前清除颜色清除窗口
glClear(GL_COLOR_BUFFER_BIT);
//把当前矩阵设置为模型视力矩阵,并进行重置。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//画球体
glutSolidSphere(10,25,25);
/*
//沿y轴正方向移动10个单位
glTranslatef(0,50,0);
//绘制第一个球体
glutSolidSphere(10,25,25);
//再次重置模型视力矩阵
glLoadIdentity();
//沿x轴正方向移动10个单位
glTranslatef(50,0,0);
//绘制第二个球体
glutSolidSphere(10,25,25);
*/
glPushMatrix();
//沿y轴正方向移动10个单位
glTranslatef(0,50,0);
//绘制第一个球体
glutSolidSphere(10,25,25);
glPopMatrix();
//
glPushMatrix();
//沿x轴正方向移动10个单位
glTranslatef(50,0,0);
//绘制第二个球体
glutSolidSphere(10,25,25);
glPopMatrix();
//刷新绘图命令
glFlush();
}
//main调用
int Matrix(int argc, char* argv[])
{
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);//窗体大小
glutInitWindowPosition(500,100);//起始位置
glutCreateWindow("矩形转换");//创建窗体
glutDisplayFunc(Matrix_Display);//类OnDraw()
glutReshapeFunc(Matrix_Reshape);//重绘回调
Matrix_Init();//类Init()
cout<<"提示信息。"<<endl;
glutMainLoop();//消息循环
return 0;
}
参考
http://www.cnblogs.com/greatverve/archive/2013/01/02/openGL-HelloWorld.html