opengl教程 linux,绘制基本的几何图形 - OpenGL编程学习实战教程_Linux编程_Linux公社-Linux系统门户网站...

第2章.编写一个的钟表程序

第一节.绘制基本的几何图形

矩形、三角形、圆形等这些都是经典的几何图形,他们都由线构成的(圆形看成是有很多根短线收尾相连围成的),而线都是点构成的。想起了某一年狗血的高考题=。=....而在OpenGL中画线很简单,你指定线两端的顶点即可。

指定顶点的函数如下:

glVertex2d

glVertex2f

glVertex3f

glVertex3v

每个函数用法各有不同,我们目前的需求是在二维空间中画线,所以重点关注glVertex2f函数。GlVertex2f函数有两个参数x,y,分别表示你所指定的顶点的横纵坐标。

f3b9c72b089fc2e0fdcb6dcd11ad1e1f.png

x,y坐标的位置如同笛卡尔坐标系一样。

接下来,我们就要开始画线了。OpenGL规定:在你指定顶点之前,你必须调用glBegin()函数,指定顶点之后,必须调用glEnd()。而其中glBegin函数的参数与我们希望它绘制的图形有关。

比如:

glBegin(GL_POINTS);

glVertex2f(0.0f,0.0f);

glVertex2f(0.5f,0.5f);

glEnd();

此时,这两个点会被描绘出来。如果将GL_POINTS改为GL_LINES,一条以这两个点为端点的直线将被画出来。大家可以把上一章中Draw函数改成

voidDraw()

{

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POINTS);

glVertex2f(0.0f,0.0f);

glVertex2f(0.5f,0.5f);

glEnd();

glFlush();

}

运行后就可以看到两个很小的白点。

除此之外,你glBegin()的参数还有很多种,如图:

304f8417bcf6ec6f20f73b9fd5c13e88.gif

(声明:该图片来自互联网传播,我希望没有涉及到任何的版权问题。如有,我可以马上换掉。)

好的,了解了基本的图形绘制,下面我们就开始着手钟表的绘制。

经过分析,可以发现,钟表其实是由1个大圆(作为表的框架),12个短粗线(作为12个钟点的刻度),3个形状不同的矩阵(分针,时针,秒针)1个点(轴)组成的。

如同,上面说道,圆形看成是有很多根短线收尾相连围成的,那我们现在就先把圆画出来。

glLineWidth(5);

glBegin(GL_LINE_LOOP);

for(i=0; i<100; i++)

{

glVertex2f(R*cos(2*PI/100*i),R*sin(2*PI/100*i));

//觉得数学有压力就多练练

}

glEnd();

glLineWidth(1);

这样一个圆就画好了,实际上,是100根线段连接而成。其中,glLineWidth函数,如同名字一样,他是用于调节接下来OpenGL画出的线的宽度。参数越大,线越粗。使用了过后,记得调用一下glLineWidth(1);不然,以后画出来的线的宽度会一直都是5(这其实和OpenGL的状态机模式有关,如有兴趣就多查查资料)。与此类似的函数还有glPointSize。

接下来,我们就来绘制12个小矩形。

好的,最后,我们再把3根指针画出来就完成了!

指针的位置是和当前的时间有关系,我们这里为了方便,就先把定义3个float变量h,m,s,表示小时,分钟,秒。

h_Length表示时针的长度,h_Angle表示时针相对于0点的偏移量,m_Length,m_Angle,s_Length,s_Angle同理。

h=10;

m=15;

s=25;

h_Length=0.2;

m_Length=0.3;

s_Length=0.4;

count=60;

s_Angle=s/count;

count*=60;

m_Angle=(m*60+s)/count;

count*=12;

h_Angle=(h*60*60+m*60+s)/count;

glLineWidth(1);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(s_Length*sin(2*PI*s_Angle),s_Length*cos(2*PI*s_Angle));

glEnd();

glLineWidth(5);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(h_Length*sin(2*PI*h_Angle),h_Length*cos(2*PI*h_Angle));

glEnd();

glLineWidth(3);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(m_Length*sin(2*PI*m_Angle),m_Length*cos(2*PI*m_Angle));

glEnd();

glLineWidth(1);

最后,我们再画一个点,作为表的中轴。

glBegin(GL_POLYGON);

for(i=0; i<100; i++)

{

glVertex2f(0.03*cos(2*PI/100*i),0.03*sin(2*PI/100*i));

}

glEnd();

好,glFlush()!

d4f1765fef9284071dc954f2cd7f6b1a.png

大功告成!

附本节全代码:

#include

#include

#include

#include

#define PI 3.1415926

void Draw()

{

int i;

float R,TR,h_Angle,m_Angle,s_Angle,h,m,s,count,h_Length,m_Length,s_Length;

R=0.5;

TR=R-0.05;

glClear(GL_COLOR_BUFFER_BIT);

glLineWidth(5);

glBegin(GL_LINE_LOOP);

for (i=0; i<100; i++)

{

glVertex2f(R*cos(2*PI/100*i),R*sin(2*PI/100*i));

}

glEnd();

glLineWidth(2);

for (i=0; i<12; i++)

{

glBegin(GL_LINES);

glVertex2f(TR*sin(2*PI/12*i),TR*cos(2*PI/12*i));

glVertex2f(R*sin(2*PI/12*i),R*cos(2*PI/12*i));

glEnd();

}

glLineWidth(1);

h=10;

m=15;

s=25;

h_Length=0.2;

m_Length=0.3;

s_Length=0.4;

count=60;

s_Angle=s/count;

count*=60;

m_Angle=(m*60+s)/count;

count*=12;

h_Angle=(h*60*60+m*60+s)/count;

glLineWidth(1);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(s_Length*sin(2*PI*s_Angle),s_Length*cos(2*PI*s_Angle));

glEnd();

glLineWidth(5);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(h_Length*sin(2*PI*h_Angle),h_Length*cos(2*PI*h_Angle));

glEnd();

glLineWidth(3);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(m_Length*sin(2*PI*m_Angle),m_Length*cos(2*PI*m_Angle));

glEnd();

glLineWidth(1);

glBegin(GL_POLYGON);

for (i=0; i<100; i++)

{

glVertex2f(0.03*cos(2*PI/100*i),0.03*sin(2*PI/100*i));

}

glEnd();

glFlush();

}

int main(int argc, char *argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(100, 100);

glutInitWindowSize(400, 400);

glutCreateWindow("HelloOpenGL");

glutDisplayFunc(&Draw);

glutMainLoop();

return 0;

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值