opengl教程 linux,绘制基本的几何图形 - OpenGL编程学习实战教程_Linux编程_Linux公社-Linux系统门户网站...
第2章.編寫一個的鐘表程序
第一節(jié).繪制基本的幾何圖形
矩形、三角形、圓形等這些都是經(jīng)典的幾何圖形,他們都由線構(gòu)成的(圓形看成是有很多根短線收尾相連圍成的),而線都是點構(gòu)成的。想起了某一年狗血的高考題=。=....而在OpenGL中畫線很簡單,你指定線兩端的頂點即可。
指定頂點的函數(shù)如下:
glVertex2d
glVertex2f
glVertex3f
glVertex3v
每個函數(shù)用法各有不同,我們目前的需求是在二維空間中畫線,所以重點關(guān)注glVertex2f函數(shù)。GlVertex2f函數(shù)有兩個參數(shù)x,y,分別表示你所指定的頂點的橫縱坐標(biāo)。
x,y坐標(biāo)的位置如同笛卡爾坐標(biāo)系一樣。
接下來,我們就要開始畫線了。OpenGL規(guī)定:在你指定頂點之前,你必須調(diào)用glBegin()函數(shù),指定頂點之后,必須調(diào)用glEnd()。而其中g(shù)lBegin函數(shù)的參數(shù)與我們希望它繪制的圖形有關(guān)。
比如:
glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(0.5f,0.5f);
glEnd();
此時,這兩個點會被描繪出來。如果將GL_POINTS改為GL_LINES,一條以這兩個點為端點的直線將被畫出來。大家可以把上一章中Draw函數(shù)改成
voidDraw()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(0.5f,0.5f);
glEnd();
glFlush();
}
運行后就可以看到兩個很小的白點。
除此之外,你glBegin()的參數(shù)還有很多種,如圖:
(聲明:該圖片來自互聯(lián)網(wǎng)傳播,我希望沒有涉及到任何的版權(quán)問題。如有,我可以馬上換掉。)
好的,了解了基本的圖形繪制,下面我們就開始著手鐘表的繪制。
經(jīng)過分析,可以發(fā)現(xiàn),鐘表其實是由1個大圓(作為表的框架),12個短粗線(作為12個鐘點的刻度),3個形狀不同的矩陣(分針,時針,秒針)1個點(軸)組成的。
如同,上面說道,圓形看成是有很多根短線收尾相連圍成的,那我們現(xiàn)在就先把圓畫出來。
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));
//覺得數(shù)學(xué)有壓力就多練練
}
glEnd();
glLineWidth(1);
這樣一個圓就畫好了,實際上,是100根線段連接而成。其中,glLineWidth函數(shù),如同名字一樣,他是用于調(diào)節(jié)接下來OpenGL畫出的線的寬度。參數(shù)越大,線越粗。使用了過后,記得調(diào)用一下glLineWidth(1);不然,以后畫出來的線的寬度會一直都是5(這其實和OpenGL的狀態(tài)機模式有關(guān),如有興趣就多查查資料)。與此類似的函數(shù)還有g(shù)lPointSize。
接下來,我們就來繪制12個小矩形。
好的,最后,我們再把3根指針畫出來就完成了!
指針的位置是和當(dāng)前的時間有關(guān)系,我們這里為了方便,就先把定義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()!
大功告成!
附本節(jié)全代碼:
#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;
}
總結(jié)
以上是生活随笔為你收集整理的opengl教程 linux,绘制基本的几何图形 - OpenGL编程学习实战教程_Linux编程_Linux公社-Linux系统门户网站...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 配置文件解析,任何可以在Li
- 下一篇: linux写一个脚本杀进程,linux下