学习OpenGL(四)绘制直线

绘制直线跟上一节绘制点差不多,毕竟直线是由点组成的。但这里需要注意的是,我们说的直线是有端点的,不是射线和构造线(两端无线延伸的)。

下面上代码,看看如何绘制直线。

void myDisplay(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT);
	glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

	glBegin(GL_LINES);

	glColor3f(1.0,0.0,0.0);
	glVertex3f(0.25,0.25,0);
	glVertex3f(0.75,0.25,0);
	glEnd();

	glFlush();
}
效果如下:

与绘制点的区别就是使用了GL_LINES,还记得点用的是什么吗?喔,对了,用的是GL_POINTS
上节我们绘制点时,第一次比较小,然后通过glPointSize为点设置了大小,然后就看得到了。

下面我们也给直线设个大小就是线宽,使用glLineWidth(GLFloat size);


OK,到此我们就学会如何绘制直线了,可是这只是绘制一段直线。如果要绘制多段线的话,是不是就在后面一直补充端点坐标呢?

我们到是可以试试,看看结果。

glBegin(GL_LINES);
glColor3f(1.0,0.0,0.0);
glVertex3f(0.25,0.25,0);
glVertex3f(0.75,0.25,0);
glVertex3f(0.75,0.75,0);
glVertex3f(0.25,0.75,0);
glEnd();


喔,好可以,中间两个端点没有连上。我们猜猜为什么呢?

opengl把第一个点作为起点,把第二个点作为终点,然后绘制了一条直线。然后再把第三个点作为起点,把第四个点作为终点,又绘制了第二条直线。

所以第二个点和第三个点之间是没有连线的。这就相当于GL_LINES等价于MoveTo,LineTo,MoveTo,LineTo......

那怎么将中间断的地方连上呢,难道要写冗余的坐标点吗?这大可不必,Opengl给我们准备了GL_LINE_STRIP,用它替换调GL_LINES就可以了。

这里就不上截图了,大家脑补一下吧。

如果想让第四点与第一点也连上,可以使用GL_LINE_LOOP替换调GL_LINE_STRIP,这样就构成封闭的多段线啦。

下面我们学习如何绘制点划线,也就是平时常见的虚线等。

先上代码看看有什么变化:

void myDisplay(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT);
	glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

	glEnable(GL_LINE_STIPPLE);
	glLineStipple(2, 0xAAAA);
	glLineWidth(5.0);
	glBegin(GL_LINE_LOOP);

	glColor3f(1.0,0.0,0.0);
	glVertex3f(0.25,0.25,0);
	glVertex3f(0.75,0.25,0);
	glVertex3f(0.75,0.75,0);
	glVertex3f(0.25,0.75,0);
	glEnd();

	glDisable(GL_LINE_STIPPLE);
	glFlush();
}
是的,这里需要用glEnable函数开启GL_LINE_STIPPLE这个标志。然后在glEnd后再关闭。
开启后,使用glLineStipple (GLint factor, GLushort pattern)设置样式。

我在代码中只用了0xAAAA这个样式,其实有很多的,下面给大家个列表:


好了,今天就学习到这里。

下次学习绘制面。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL是一个图形库,它提供了一些简单的函数来绘制基本的图形,包括直线和圆。 绘制直线可以使用glBegin和glEnd函数,其中glBegin指定绘制的图形类型,glEnd表示完成绘制。在这两个函数之间,使用glVertex2f指定每个点的坐标。 绘制圆可以使用glBegin和glEnd函数,其中glBegin指定绘制的图形类型。在这两个函数之间,使用glVertex2f指定每个点的坐标,这些点组成了一个圆的近似多边形。为了使圆更圆滑,可以增加多边形的边数。 下面是一个使用OpenGL绘制直线和圆的示例程序: ```c++ #include <GL/glut.h> #include <math.h> void init() { glClearColor(1.0, 1.0, 1.0, 1.0); // 设置背景颜色为白色 glMatrixMode(GL_PROJECTION); gluOrtho2D(0, 640, 0, 480); // 设置投影模式为正交投影 } void drawLine() { glBegin(GL_LINES); // 指定绘制类型为直线 glVertex2f(100, 100); // 第一个点的坐标 glVertex2f(200, 200); // 第二个点的坐标 glEnd(); // 完成绘制 } void drawCircle() { const float PI = 3.1415926; const int sides = 32; // 圆的边数 const float radius = 50; // 圆的半径 glBegin(GL_POLYGON); // 指定绘制类型为多边形 for (int i = 0; i < sides; i++) { float angle = 2 * PI * i / sides; float x = radius * cos(angle) + 100; // 圆心坐标为(100, 100) float y = radius * sin(angle) + 100; glVertex2f(x, y); } glEnd(); // 完成绘制 } void display() { glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓存区 glColor3f(0.0, 0.0, 0.0); // 设置绘制颜色为黑色 drawLine(); // 绘制直线 drawCircle(); // 绘制圆 glFlush(); // 刷新缓存区 } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(640, 480); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGL Example"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 在上面的程序中,使用glut库创建了一个窗口,并设置了绘制函数为display。在display函数中,先使用glClear函数清除颜色缓存区,然后设置绘制颜色为黑色,调用drawLine和drawCircle函数绘制直线和圆,最后使用glFlush函数刷新缓存区。在主函数中,使用glutMainLoop函数进入事件循环,等待窗口事件的发生。 注意,在编译时需要链接glut库和OpenGL库。例如,在Linux系统中,可以使用以下命令编译程序: ``` g++ -o example example.cpp -lglut -lGL ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值