OPenGL笔记--创建一个多边形

本文介绍了如何在OpenGL环境中绘制多边形,包括三角形和正方形。首先讲解了OpenGL坐标系,然后阐述了视点转换的重要函数gluLookAt,以及如何通过glTranslatef改变坐标系位置。接着,详细说明了使用glBegin和glEnd定义图形,以及各种绘制模式如GL_TRIANGLES和GL_QUADS的用法。最后,给出了绘制三角形和正方形的示例代码,演示了如何实际操作这些概念。

一、前置知识

通过上一节的学习:OPenGL笔记–创建一个OPenGL窗口,我们已经知道了怎么创建一个OPenGL窗口了,接下来学习如果在OPenGL窗口中绘制多边形。

首先我们先了解一下OPenGL中的坐标系:
请添加图片描述

  • OPenGL中的坐标系如上图所示,X坐标轴从左至右、Y坐标轴从下至上、Z坐标轴从里至外;
  • OPenGL屏幕中心的坐标值是X和Y轴上的0.0点,一般调用glLoadIdentity()就会将当前点移到屏幕中心;
  • 使用glTranslatef(x, y, z)沿着X,Y和Z轴移动,并不是相对于屏幕中心移动,而是相对于当前所在的屏幕位置移动;
  • 使用GL_TRIANGLES参数绘制三角形、GL_QUADS参数绘制正方形、GL_POLYGON参数绘制多边形;

视点转换
OpenGL窗口可以理解为模拟我们的眼镜看到的事物,所以你看的位置,看的角度都是可以自己设置的,通过如下函数:

void gluLookAt(
				GLdouble eyex, GLdouble eyey, GLdouble eyez, 				//脑袋的位置,眼睛(相机)在世界坐标系中的位置
				GLdouble centerx, GLdouble centery, GLdouble centerz, 		//眼睛看的物体的位置
				GLdouble upx, GLdouble upy, GLdouble upz					//头顶朝向的方向,(1.0, 0.0, 0.0)代表头顶朝向X轴正半轴,(-1.0, 0.0, 0.0)代表头顶朝向X轴负半轴,依此类推
			  )

如果没有设置,默认为glutLootAt(
							0, 0, 0,
							0, 0, -n,
							0, 1,0
						   )

默认参数表示:眼睛处于原点(0, 0, 0),看向Z轴负半轴方向,头顶朝向Y轴正半轴,如下图所示:

在这里插入图片描述
所以为什么我们直接在X-Y平面上或者Z轴正半轴上绘图,绘制的图形看不到,因为默认视点设置在原点,看向Z轴负半轴;

要么设置视点;要么平移坐标系,往Z轴负半轴推;这样绘图就可以看到了

OPenGL中绘图:使用glBeginglEnd两个函数进行所要绘制图形的描述,绘制的内容要放在这两个函数之间;

glBegin(GLenum mode);

//给出数据点

glEnd();

其中mode表示你所要绘制的是什么?是画点?还是画线?还是画面?mode的可选项有如下:

  • GL_POINTS 画离散的点
  • GL_LINES 画线(每两个点连成一条线)
  • GL_LINE_STRIP 画线(所有点相互相连,首尾不相连)
  • GL_LINE_LOOP 画线(所有点相互相连,首尾相连)
  • GL_POLYGON 填充面(将所有点围成的面进行填充)
  • GL_QUADS 填充面(将每四个点围成的面进行填充,相邻点之间不填充)
  • GL_QUAD_STRIP 填充面(每两个点构成一条线,每两个线构成一个四边形)
  • GL_TRIANGLES 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间不填充)
  • GL_TRIANGLE_STRIP 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间填充)
  • GL_TRIANGLE_FAN 填充三角形(以第一个点为顶点,之后每两个点合起来围成的三角形进行填充,相邻的点之间填充)

在这里插入图片描述


二、运行效果

在这里插入图片描述


三、关键代码

完整代码可参考上一节:OPenGL笔记–创建一个OPenGL窗口

void GL_Test::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存

    glLoadIdentity();   //重置当前的模型观察矩阵

    glTranslatef(-1.5, 0.0, -6.0);

    //开始绘制三角形
    //-----------------------------------------
    glBegin(GL_TRIANGLES);	//开始绘制三角形

    glVertex3f(0.0, 1.0, 0.0);      //上顶点

    glVertex3f(-1.0, -1.0, 0.0);    //左下顶点

    glVertex3f(1.0, -1.0, 0.0);     //右下顶点

    glEnd();	//告诉OPenGL三角形已经创建好了
    //-----------------------------------------
    //绘制三角形结束


    //开始绘制正方形
    //-----------------------------------------
    glTranslatef(3.0, 0.0, 0.0);

    glBegin(GL_QUADS);	//开始绘制正方形

    glVertex3f(-1.0, 1.0, 0.0);     //左上顶点

    glVertex3f(1.0, 1.0, 0.0);      //右上顶点

    glVertex3f(1.0, -1.0, 0.0);     //右下顶点

    glVertex3f(-1.0, -1.0, 0.0);    //左下顶点

    glEnd();	//告诉OPenGL正方形已经创建好了
    //-----------------------------------------
    //绘制正方形结束
}
  • 使用glLoadIdentity()之后,当前点就移动到了屏幕中心;
  • 使用glTranslatef(-1.5, 0.0, -6.0),X轴左移了1.5个单位,Y轴不动,Z轴内移6.0个单位
  • 使用glBegin(GL_TRIANGLES)标志着开始绘制三角形、使用glEnd()标志着绘制结束;
  • 绘制三角形,开始-结束内部可以放置三个坐标点;
  • 绘制正方形,开始-结束内部可以放置四个坐标点;
  • 绘制多边形(GL_POLYGON),不在乎开始-结束内部有多少个点;
  • 使用glVertex3f(x, y, z)提供坐标点,内部的x、y和z是相对于当前点的偏移点;
  • 顺时针绘制的正方形意味着我们所看见的,是四边形的背面;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贝勒里恩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值