图形学实验一 OpenGL初识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQQZSJ/article/details/83589397

实验一  OpenGL初识

实验类型:验证型 实验学时:2实验要求:必修

一、实验目的

熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘图的特点;利用VC+OpenGL作为开发平台设计程序,以能够在屏幕上生成任意一个像素点为本实验的结束。

二、实验内容:

了解和使用VC的开发环境,理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点的函数;编写图1所示图形的应用程序并调试运行。

图1   基本图形

升级版本1:

升级版本2:

 
   

 

 

 

三、实验原理

绘图程序基本结构可分为3部分:

1 初始化部分。主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或Alpha)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检测,裁剪等等。这些状态一般都用函数glEnable(...), glDisable(…)来设置,…表示特定的状态。

2 设置观察坐标系下的取景模式和取景框位置大小。

3 OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等等。

四、实验示范代码(略)

五、实验步骤

1 在Windows xp/win7操作环境下,启动VC;

2 建立W32 Console Application 的应用工程;

3 建立源程序编辑环境,进行编辑源程序。

4 调试运行程序,完成实验。

六、实验结果处理

演示结果并保存相关文件。

七、实验注意事项

注意编程环境的配置,即在Windows环境下,OpenGL扩展库相关文件的配置,把头文件“GL.H”、库文件“OPENGL32.LIB”和动态链接库“OPENGL32.DLL”配置到相应的目录下。

八、预习与思考题

预习:阅读课本相关内容,仔细阅读示范代码。

思考题:如何实现内部提问和外部提问。

九、实验报告要求

1、实验报告中应包括相关操作步骤和程序代码和运行效果截图。

2.书写实验报告时要结构合理,层次分明,在分析描述的时候,需要注意语言的流畅。

代码:

1.基础实验代码:

//基础实验 运行环境Visual Studio 2017
//在Visual C++ 6.0 上运行时,在环境配置好的情况下,把#include"pch.h"删除即可
#include "pch.h"
#include <iostream>
#include <GL/glut.h>  //需要正确安装Glut


void myDisplay(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);//将清空颜色设置为黑色
	glClear(GL_COLOR_BUFFER_BIT);//将窗口颜色设置为当前清空颜色;


	glColor3f(1.0f, 1.0f, 0.0f);
	glRectf(-0.5f, -0.5f, 0.5f, 0.5f);//画一个矩形,参数指的是:对角线上两点的横纵坐标;


	glBegin(GL_TRIANGLES);//画出三角形
	glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
	glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.8f, -0.5f);
	glColor3f/*品红色*/(1.0f, 0.0f, 1.0f); glVertex2f(-0.8f, -0.5f);
	glEnd();

	glPointSize(2);//数字3指示:点的大小
	glBegin(GL_POINTS);
	glColor3f/*红色*/(1.0f, 0.0f, 0.0f); glVertex2f(-0.4f, -0.4f);
	glColor3f/*绿色*/(0.0f, 1.0f, 0.0f); glVertex2f/*指示中心点*/(0.0f, 0.0f);
	glColor3f/*蓝色*/(0.0f, 0.0f, 1.0f); glVertex2f(0.4f, 0.4f);
	glEnd();

	glFlush();//保证前面的OPengl命令立即执行,而不缓冲等待

}
int main(int argc,char *argv[])//带命令行参数的main函数
{
	glutInit(&argc, argv);//对GLUT进行初始化;              glut开头的函数,全部是由GLUT工具包所提供的函数;
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,前者指:使用REG颜色,后者指:使用单缓冲;
	glutInitWindowPosition(100, 100);//设置窗口在屏幕中的位置;
	glutInitWindowSize(800, 800);
	glutCreateWindow("hello World!");//提供窗口标题
	glutDisplayFunc(&myDisplay);//画图函数的调用
	glutMainLoop();//显示窗口
	return 0;
}

 

2.升级版本1

#include "pch.h"
#include <iostream>
#include <GL/glut.h>
void myDisplay(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);//清空为黑色
	glClear(GL_COLOR_BUFFER_BIT);//将当前清空色设置为窗口颜色

	glColor3f(1.0f,1.0f,1.0f);
	glRectf(-0.8f,-0.8f,0.8f,0.8f);//画一个矩形

	//画一个大三角形
	glBegin(GL_TRIANGLES);
	glColor3f(0.0f,1.0f,0.0f); glVertex2f(-0.8f,0.8f);
	glColor3f(1.0f,0.0f,0.0f); glVertex2f(0.0f,-0.8f);
	glColor3f(1.0f,1.0f,0.0f); glVertex2f(0.8f,0.8f);
	glEnd();


	//左下角三角形
	glBegin(GL_TRIANGLES);
	glColor3f/*品红*/(1.0f, 0.0f, 1.0f); glVertex2f(-0.6f, -0.6f);
	glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(-0.55f, -0.5f);
	glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.5f, -0.6f);
	glEnd();
	//右下角三角形
	glBegin(GL_TRIANGLES);
	glColor3f/*黄*/(1.0f, 1.0f, 0.0f); glVertex2f(0.5f, -0.6f);
	glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.55f, -0.5f);
	glColor3f(1.0f, 0.0f, 1.0f); glVertex2f(0.6f, -0.6f);
	glEnd();

	//画圆形(此部分代码来自csdn博客)
	int i = 0;
	int n = 1000;
	float R = 0.52f;
	float PI = 3.1415926f;
	//glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0f, 0.0f,1.0f);//设置圆形的颜色
	glBegin(GL_POLYGON);
	for (i = 0; i < n; i++)
	{
		glVertex2f(R*cos(2 * PI*i / n), R*sin(2 * PI*i / n));//通过数学计算定义顶点
	}
	glEnd();

	//绘制五角星
	float r = 0.7f;//定义中心点到顶点的距离为r
	glColor3f(0.0f, 0.0f, 1.0f);//蓝色
	glBegin(GL_LINE_LOOP);//顺序连线
	glVertex2f(-1*r*cos(PI*0.1), r*sin(PI*0.1));//这五个点是有顺序的,不能乱序
	glVertex2f(r*cos(PI*0.1), r*sin(PI*0.1));
	glVertex2f(-1*r*cos(PI*0.3), -1*r*sin(PI*0.3));
	glVertex2f(0, r);
	glVertex2f(r*cos(PI*0.3),-1* r*sin(PI*0.3));
	glEnd();

	glFlush();
}
int main(int argc,char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(800, 800);
	glutCreateWindow("Hello World!");
	glutDisplayFunc(&myDisplay);
	glutMainLoop();
	return 0;
}

3 升级版本-1

#include "pch.h"
#include <iostream>
#include <GL/glut.h>
void myDisplay(void)
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glClear(GL_COLOR_BUFFER_BIT);

	//绘制外侧大矩形
	glColor3f(1.0f, 1.0f, 1.0f);
	glRectf(-0.8f, -0.8f, 0.8f, 0.8f);

	//绘制内左侧圆形
	glColor3f(1.0f, 0.0f, 1.0f);//品红色
	glBegin(GL_TRIANGLES);
	glVertex2f(-0.8f,0);
	glVertex2f(-0.4f,0.4f); 
	glVertex2f(-0.4f,-0.4f);
	glEnd();

	//绘制内右侧圆形
	glColor3f(1.0f, 1.0f, 0.0f);//黄色
	glBegin(GL_TRIANGLES);
	glVertex2f(0.8f, 0);
	glVertex2f(0.4f, 0.4f);
	glVertex2f(0.4f, -0.4f);
	glEnd();

	//绘制内上侧圆形
	glColor3f(0.0f, 0.0f, 1.0f);//蓝色
	glBegin(GL_TRIANGLES);
	glVertex2f(0, 0.8f);
	glVertex2f(-0.4f, 0.4f);
	glVertex2f(0.4f, 0.4f);
	glEnd();

	//绘制内下侧圆形
	glColor3f(0.0f, 1.0f, 0.0f);//绿色
	glBegin(GL_TRIANGLES);
	glVertex2f(0, -0.8f);
	glVertex2f(-0.4f, -0.4f);
	glVertex2f(0.4f, -0.4f);
	glEnd();

//绘制内侧矩形
	glColor3f(1.0f, 0.0f, 0.0f);
	glBegin(GL_POLYGON);
		glVertex2f(-0.4f,0);
		glVertex2f(0, 0.4f);
		glVertex2f(0.4f, 0);
		glVertex2f(0, -0.4f);
		glEnd();



	glFlush();
}
int main(int argc,char *argv[])
{
	glutInit(&argc, argv);//对GLUT进行初始化;              glut开头的函数,全部是由GLUT工具包所提供的函数;
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,前者指:使用REG颜色,后者指:使用单缓冲;
	glutInitWindowPosition(100, 100);//设置窗口在屏幕中的位置;
	glutInitWindowSize(800, 800);
	glutCreateWindow("hello World!");//提供窗口标题
	glutDisplayFunc(&myDisplay);//画图函数的调用
	glutMainLoop();//显示窗口
	return 0;
}

4.升级版本2-2


#include "pch.h"
#include <iostream>
#include <GL/glut.h>  //需要正确安装Glut


void myDisplay(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);//将清空颜色设置为黑色
	glClear(GL_COLOR_BUFFER_BIT);//将窗口颜色设置为当前清空颜色;

	glColor3f(1.0f, 1.0f, 1.0f);
	glRectf(-0.8f, -0.8f, 0.8f,0.8f);

	//绘制红色菱形的上部
	glColor3f(1.0f, 0.0f, 0.0f);
	glBegin(GL_POLYGON);
		glVertex2f(0,0.7f);
		glVertex2f(0.2f, 0.35f);
		glVertex2f(0, 0);
		glVertex2f(-0.2f, 0.35f);
		glEnd();


	//红色下部
		glBegin(GL_POLYGON);
		glVertex2f(0, -0.7f);
		glVertex2f(0.2f, -0.35f);
		glVertex2f(0, 0);
		glVertex2f(-0.2f, -0.35f);
		glEnd();
		//红左侧
		glBegin(GL_POLYGON);
		glVertex2f(-0.7f, 0);
		glVertex2f(-0.35f, 0.2f);
		glVertex2f(0, 0);
		glVertex2f(-0.35f, -0.2f);
		glEnd();
		//红右侧
		glBegin(GL_POLYGON);
		glVertex2f(0.7f, 0);
		glVertex2f(0.35f, 0.2f);
		glVertex2f(0, 0);
		glVertex2f(0.35f, -0.2f);
		glEnd();
	
		//绿色右上部分
		glColor3f(0.0f, 1.0f, 0.0f);
		glBegin(GL_POLYGON);
		glVertex2f(0.35*sqrt(2),0.35*sqrt(2));
		glVertex2f(0.2f, 0.35f);
		glVertex2f(0, 0);
		glVertex2f(0.35f, 0.2f);
		glEnd();

		//右下角
		glColor3f(0.0f, 1.0f, 0.0f);
		glBegin(GL_POLYGON);
		glVertex2f(0.35*sqrt(2),-1* 0.35*sqrt(2));
		glVertex2f(0.2f, -0.35f);
		glVertex2f(0, 0);
		glVertex2f(0.35f, -0.2f);
		glEnd();

		//左下角
		glColor3f(0.0f, 1.0f, 0.0f);
		glBegin(GL_POLYGON);
		glVertex2f(-1*0.35*sqrt(2), -1*0.35*sqrt(2));
		glVertex2f(-0.2f, -0.35f);
		glVertex2f(0, 0);
		glVertex2f(-0.35f, -0.2f);
		glEnd();

		//左上角
		glColor3f(0.0f, 1.0f, 0.0f);
		glBegin(GL_POLYGON);
		glVertex2f(-1*0.35*sqrt(2), 0.35*sqrt(2));
		glVertex2f(-0.2f, 0.35f);
		glVertex2f(0, 0);
		glVertex2f(-0.35f, 0.2f);
		glEnd();
	glFlush();//保证前面的OPengl命令立即执行,而不缓冲等待

}
int main(int argc, char *argv[])//带命令行参数的main函数
{
	glutInit(&argc, argv);//对GLUT进行初始化;              glut开头的函数,全部是由GLUT工具包所提供的函数;
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,前者指:使用REG颜色,后者指:使用单缓冲;
	glutInitWindowPosition(100, 100);//设置窗口在屏幕中的位置;
	glutInitWindowSize(800, 800);
	glutCreateWindow("hello World!");//提供窗口标题
	glutDisplayFunc(&myDisplay);//画图函数的调用
	glutMainLoop();//显示窗口
	return 0;
}

实验结果展示部分就是实验报告所要求的,不再重复上图!

猜你喜欢

转载自blog.csdn.net/QQQZSJ/article/details/83589397