opengl教程 linux,绘制基本的几何图形 - OpenGL编程学习实战教程_Linux编程_Linux公社-Linux系统门户网站...
第2章.編寫一個的鐘表程序
第一節.繪制基本的幾何圖形
矩形、三角形、圓形等這些都是經典的幾何圖形,他們都由線構成的(圓形看成是有很多根短線收尾相連圍成的),而線都是點構成的。想起了某一年狗血的高考題=。=....而在OpenGL中畫線很簡單,你指定線兩端的頂點即可。
指定頂點的函數如下:
glVertex2d
glVertex2f
glVertex3f
glVertex3v
每個函數用法各有不同,我們目前的需求是在二維空間中畫線,所以重點關注glVertex2f函數。GlVertex2f函數有兩個參數x,y,分別表示你所指定的頂點的橫縱坐標。
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()的參數還有很多種,如圖:
(聲明:該圖片來自互聯網傳播,我希望沒有涉及到任何的版權問題。如有,我可以馬上換掉。)
好的,了解了基本的圖形繪制,下面我們就開始著手鐘表的繪制。
經過分析,可以發現,鐘表其實是由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()!
大功告成!
附本節全代碼:
#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;
}
總結
以上是生活随笔為你收集整理的opengl教程 linux,绘制基本的几何图形 - OpenGL编程学习实战教程_Linux编程_Linux公社-Linux系统门户网站...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 配置文件解析,任何可以在Li
- 下一篇: linux写一个脚本杀进程,linux下