【C++】OpenGL:创建线段和多边形示例

安装nupengl程序包

在上一节中,已经说明白怎么安装nupengl程序包了,不会的可以去翻一下。

安装nupengl程序包

后面每次我们新建项目的话都需要重新安装程序包,程序包是跟着项目走的。

创建基本窗体

首先,引入头文件:

#include <GL/glut.h>

创建主函数:

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(300, 100);
	glutInitWindowSize(600, 500);
	glutCreateWindow("Lines | Triangle");

	init();
	//glutDisplayFunc(lines);	//传递需要勾画的函数
	glutMainLoop();
	return 0;
}

创建init()-窗口初始化函数:

void init()
{
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-10, 20, -10, 20);	//可视的范围,类似鼠标滚轮的远近
}

Ctrl+F5运行,会生成窗体如下:

在这里插入图片描述

创建线段

接下来要在这个空的窗体上画我们的线段。

首先,将main函数中的//glutDisplayFunc(lines); //传递需要勾画的函数取消注释,这是调用线段的操作;

然后,创建lines-线段函数:

void lines()
{
	int p1[] = { 0,4 };
	int p2[] = { 6,4 };
	int p3[] = { 1,0 };
	int p4[] = { 3,7 };
	int p5[] = { 5,0 };
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.3, 0.1, 0.8);
	glPointSize(3);
	//glBegin(GL_POINTS);	//画点
	//glBegin(GL_LINES);	//画线段
	//glBegin(GL_LINE_STRIP);	//画连续线段
	glBegin(GL_LINE_LOOP);	//画封闭线段,你的第一个五角星
	glVertex2iv(p1);	//glVertex2i后加v可直接调用向量,向量可提前写到前面
	glVertex2iv(p2);
	glVertex2iv(p3);
	glVertex2iv(p4);
	glVertex2iv(p5);
	glEnd();
	glFlush();
}

画点还是画线段由glBegin后面的参数决定,上面我试了几种。

线段的渲染效果如下:

在这里插入图片描述

创建多边形

上面我们已经用线段勾勒出一个五角星了,不过还都是点和线的操作,这部分我们来绘制一个多边形(包括三角形、四边形)。

首先将main函数glutDisplayFunc()中的参数改为polgonTriangle,表示我们现在要画多边形了;

然后创建polgonTriangle函数:

void polgonTriangle()
{
	int p1[] = { 1,3 };
	int p2[] = { 3,0 };
	int p3[] = { 6,0 };
	int p4[] = { 7,3 };
	int p5[] = { 6,6 };
	int p6[] = { 3,6 };
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.6,0.5,0.2);
	glPointSize(3);
	//glBegin(GL_POINTS);
	//glBegin(GL_POLYGON);	//画多边形
	glBegin(GL_TRIANGLES);	//画三角形(3个顶点)
	//glBegin(GL_QUADS);		//画四边形
	glVertex2iv(p1);
	glVertex2iv(p2);
	glVertex2iv(p3);
	glVertex2iv(p4);
	glVertex2iv(p5);
	glVertex2iv(p6);
	glEnd();
	glFlush();
}

因为我这个函数中创建了6个顶点,所以会创建2个三角形,绘制效果如下:

在这里插入图片描述

完整程序

main.cpp

/*
** 绘制线段、多边形和三角形(理解点、线、面,会绘制各种图元)
*/

#include <GL/glut.h>

void lines()
{
	int p1[] = { 0,4 };
	int p2[] = { 6,4 };
	int p3[] = { 1,0 };
	int p4[] = { 3,7 };
	int p5[] = { 5,0 };
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.3, 0.1, 0.8);
	glPointSize(3);
	//glBegin(GL_POINTS);	//画点
	//glBegin(GL_LINES);	//画线段
	//glBegin(GL_LINE_STRIP);	//画连续线段
	glBegin(GL_LINE_LOOP);	//画封闭线段,你的第一个五角星
	glVertex2iv(p1);	//glVertex2i后加v可直接调用向量,向量可提前写到前面
	glVertex2iv(p2);
	glVertex2iv(p3);
	glVertex2iv(p4);
	glVertex2iv(p5);
	glEnd();
	glFlush();
}

void polgonTriangle()
{
	int p1[] = { 1,3 };
	int p2[] = { 3,0 };
	int p3[] = { 6,0 };
	int p4[] = { 7,3 };
	int p5[] = { 6,6 };
	int p6[] = { 3,6 };
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.6,0.5,0.2);
	glPointSize(3);
	//glBegin(GL_POINTS);
	//glBegin(GL_POLYGON);	//画多边形
	glBegin(GL_TRIANGLES);	//画三角形(3个顶点)
	//glBegin(GL_QUADS);		//画四边形
	glVertex2iv(p1);
	glVertex2iv(p2);
	glVertex2iv(p3);
	glVertex2iv(p4);
	glVertex2iv(p5);
	glVertex2iv(p6);
	glEnd();
	glFlush();
}

void init()
{
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-10, 20, -10, 20);	//可视的范围,类似鼠标滚轮的远近
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(300, 100);
	glutInitWindowSize(600, 500);
	glutCreateWindow("Lines | Triangle");

	init();
	glutDisplayFunc(polgonTriangle);	//传递需要的函数
	glutMainLoop();
	return 0;
}

Ubuntu端创建多面体

# 安装opengl
sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev g++

创建多面体程序:

#include <GL/glut.h>
 
#define ColoredVertex(c, v) do{ glColor3fv(c); glVertex3fv(v); }while(0)
static int angle = 0;
static int rotateMode = 0;
 
void myDisplay(void)
{
	static int list = 0;
	if (list == 0)
	{
		GLfloat
			PointA[] = { 0.5f, 0.5f, -0.5f },
			PointB[] = { 0.5f, -0.5f, -0.5f },
			PointC[] = { -0.5f, -0.5f, -0.5f },
			PointD[] = { -0.5f, 0.5f, -0.5f },
			PointE[] = { 0.5f, 0.5f, 0.5f },
			PointF[] = { 0.5f, -0.5f, 0.5f },
			PointG[] = { -0.5f, -0.5f, 0.5f },
			PointH[] = { -0.5f, 0.5f, 0.5f };
		GLfloat
			ColorA[] = { 1, 0, 0 },
			ColorB[] = { 0, 1, 0 },
			ColorC[] = { 0, 0, 1 },
			ColorD[] = { 1, 1, 0 },
			ColorE[] = { 1, 0, 1 },
			ColorF[] = { 0, 1, 1 },
			ColorG[] = { 1, 1, 1 },
			ColorH[] = { 0, 0, 0 };
 
		list = glGenLists(1);
		glNewList(list, GL_COMPILE);
		
		// 面1
		glBegin(GL_POLYGON);
		ColoredVertex(ColorA, PointA);
		ColoredVertex(ColorE, PointE);
		ColoredVertex(ColorH, PointH);
		ColoredVertex(ColorD, PointD);
		glEnd();
		
		// 面2
		glBegin(GL_POLYGON);
		ColoredVertex(ColorD, PointD);
		ColoredVertex(ColorC, PointC);
		ColoredVertex(ColorB, PointB);
		ColoredVertex(ColorA, PointA);
		glEnd();
		
		// 面3
		glBegin(GL_POLYGON);
		ColoredVertex(ColorA, PointA);
		ColoredVertex(ColorB, PointB);
		ColoredVertex(ColorF, PointF);
		ColoredVertex(ColorE, PointE);
		glEnd();
		
		// 面4
		glBegin(GL_POLYGON);
		ColoredVertex(ColorE, PointE);
		ColoredVertex(ColorH, PointH);
		ColoredVertex(ColorG, PointG);
		ColoredVertex(ColorF, PointF);
		glEnd();
		
		// 面5
		glBegin(GL_POLYGON);
		ColoredVertex(ColorF, PointF);
		ColoredVertex(ColorB, PointB);
		ColoredVertex(ColorC, PointC);
		ColoredVertex(ColorG, PointG);
		glEnd();
		
		// 面6
		glBegin(GL_POLYGON);
		ColoredVertex(ColorG, PointG);
		ColoredVertex(ColorH, PointH);
		ColoredVertex(ColorD, PointD);
		ColoredVertex(ColorC, PointC);
		glEnd();
		glEndList();
 
		glEnable(GL_DEPTH_TEST);
	}
	
	// 已经创建了显示列表,在每次绘制正四面体时将调用它
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glPushMatrix();
	glRotatef(angle / 10, 1, 0.5, 0.0);
	glCallList(list);
	glPopMatrix();
	glutSwapBuffers();
}
 
void myIdle(void)
{
	++angle;
	if (angle >= 3600.0f)
	{
		angle = 0.0f;
	}
	myDisplay();
}
 
int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(700, 700);
	glutCreateWindow("First OpenGL Program");
	
	glutDisplayFunc(&myDisplay);
	glutIdleFunc(&myIdle);     //空闲调用
 
	glutMainLoop();
 
	return 0;
}

编译运行:

g++ -o main main.cpp -lglut -lGLU -lGL && ./main

结果如下:

在这里插入图片描述

在这里插入图片描述

以上。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DevFrank

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值