日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發(fā)布時間:2024/4/18 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opengl教程 linux,绘制基本的几何图形 - OpenGL编程学习实战教程_Linux编程_Linux公社-Linux系统门户网站... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。