`
haoningabc
  • 浏览: 1477734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

opengl的helloworld

阅读更多

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
  • 大小: 103.6 KB
分享到:
评论

相关推荐

    openGL hello world

    "OpenGL Hello World"通常是指使用OpenGL库编写的一个简单的示例程序,它标志着开发者开始接触并理解OpenGL的基本概念和操作。这个"OpenGL红宝书"指的是经典的《OpenGL Programming Guide》,这本书是学习OpenGL的...

    openGL helloworld xcode版本

    "OpenGL HelloWorld"通常是初学者接触这个图形库时编写的第一个程序,它旨在展示如何设置基本的OpenGL环境并绘制出简单的图形。在这个Xcode版本的OpenGL HelloWorld中,我们将深入探讨如何在苹果的开发环境中配置和...

    openGL helloworld

    根据提供的信息,我们可以总结出以下关于“OpenGL HelloWorld”程序的关键知识点: ### 1. OpenGL简介 OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。...

    OpenGL = Hello World

    "OpenGL = Hello World" 这个标题暗示我们将探讨如何使用OpenGL进行基础的图形渲染,这通常是从一个简单的“Hello World”程序开始的。 在计算机编程中,“Hello World”程序是一个传统的起点,用于展示语言的基本...

    opengl.rar_codeblocks_codeblocks open_codeblocks opengl_opengl

    glutCreateWindow("OpenGL Hello World"); glEnable(GL_DEPTH_TEST); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 这个程序会创建一个640x480像素的窗口,并清空颜色和深度缓冲。`...

    VS2005最简单的OpenGL例子

    glutCreateWindow("OpenGL Hello World"); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 编译和运行: 1. 确保项目的配置属性正确设置,链接器的输入部分应包含`glut32.lib`。 2. 按F7或点击...

    webgl-3d-helloworld

    "webgl-3d-helloworld"项目是一个基础教程或示例,教你如何使用JavaScript和WebGL创建一个简单的3D“Hello, World!”程序。 在描述中提到的"javascript 实现的 3d helloworld",意味着这个项目将通过JavaScript代码...

    Hello Window OpenGL 第一个窗口

    在这个"Hello Window OpenGL 第一个窗口"的教程中,我们将探讨如何创建并显示一个基本的OpenGL窗口。 首先,你需要了解的是OpenGL并不直接处理窗口系统。在Windows系统中,我们通常使用GLUT(OpenGL Utility ...

    Opengl环境配置文件

    下面是一个基础的OpenGL HelloWorld示例: ```cpp #include #include int main() { if (!glfwInit()) return -1; GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL Test", NULL, NULL); if (!window...

    安卓 OpenGL ES 2.0 完全入门(一):基本概念和 hello world.docx

    本文将详细介绍安卓 OpenGL ES 2.0 的基本概念和 hello world 项目,帮助读者快速入门 OpenGL ES 2.0 的世界。 基本概念 OpenGL ES 2.0 是一种用于移动设备的图形处理 API,能够提供高性能的图形处理能力。OpenGL ...

    android游戏引擎libGDX 实例和源码gdx-helloworld-0.9.1,很不错的,强烈推荐

    在本实例中,"gdx-helloworld-0.9.1"是一个基于LibGDX的游戏入门项目,非常适合初学者学习和理解LibGDX的基本用法。 LibGDX的核心组件包括以下几个部分: 1. **Backend**:LibGDX提供了不同平台的后端支持,如...

    glsl_HelloWorld.rar_C# glsl_GLSL_glsl openGL_glsl_HelloWorld_op

    一个用opengl着色语言(glsl)编写的犹他壶,并且可以通过鼠标点动沿三个坐标轴转动

    vulkan hello world伪代码

    "Vulkan Hello World"是学习Vulkan API的基础教程,通过一个简单的程序来展示Vulkan的基本用法和3D渲染流程。下面我们将详细讨论Vulkan API的使用以及"Vulkan Hello World"中的关键概念。 1. **Vulkan API基础**:...

    OpenGL写的hello窗体

    在本例中,可能是简单的"hello, world"文本,或者是一个几何形状,如三角形。 5. **顶点坐标和投影**:在OpenGL中,我们需要定义顶点坐标,并可能使用视口变换和投影矩阵来将3D坐标转换为2D屏幕坐标。 6. **帧缓冲...

    vvvv的演示程序:HELLO WORLD

    【vvvv的演示程序:HELLO WORLD】 vvvv是一款基于节点图界面的视觉编程语言,主要应用于实时图像处理、互动艺术以及多媒体应用开发。在这个"HELLO WORLD"演示程序中,我们将深入探讨vvvv的基本概念、工作流程以及...

    IOS入门之HelloWorld源代码

    // Hello World_Code // #import #import "AppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }...

    Hello-GLUT:一个非常简单的“ Hello World!” GLUT应用程序演示了如何使用MinGW和MSVC用C编写OpenGL应用程序

    Hello-GLUT:一个非常简单的“ Hello World!” GLUT应用程序演示了如何使用MinGW和MSVC用C编写OpenGL应用程序

    opengl.rar_world

    "opengl.rar_world"这个标题暗示我们讨论的是如何在QT环境下用C++实现一个基础的OpenGL“Hello, World!”程序。 首先,要开始使用OpenGL,我们需要在QT项目中包含必要的库。这通常通过在.pro文件中添加`QT += ...

Global site tag (gtag.js) - Google Analytics