OpenGL 学习笔记(3)绘制几何物体
???????? 幾何物體可以用點來描述,我們可以通過OpenGL的api來了解一下
幾何圖形類型
其中以glBegin開始,glEnd結束
下圖是采用不同類型的圖形效果
為了熟悉上訴圖形,下面來對每種圖形進行測試
建立基礎坐標系
在畫圖之前,首先要先建立坐標系,將以左下角為(0,0)點,如下圖
窗體的大小則作為修剪的范圍
void reshape (int w, int h) {glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h); }int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (400, 150); glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display); glutReshapeFunc(reshape);glutMainLoop();return 0; }GL_POINTS
Draws a point at each of the n vertices.
畫7個點
示例1
點很小,幾乎看不見
可以用glPointSize調整point的大小,如下。現在看起來清晰多了
示例2
GL_LINES
Draws a series of unconnected line segments.Segments are drawn between v0 and v1,between v2 and v3, and so on. If n is odd, the last segment is drawn between vn–3 and vn–2,and vn–1 is ignored.
如果將示例1的GL_POINTS更改為GL_LINES,那么將會有三條線,如下
示例3
注意:直線的繪制必須成對,一個點無法畫一條線,上面第7個點無法畫一條線
用glLineWidth設置線的寬度,如將上面的直線的寬度改為5
畫點線(虛線,破折線)
上面畫的直線可以稱之為實線,除此之外還可以畫虛線,
glLineStipple用于設置直線的點線模式,其有兩個參數
第二個參數PATTERN是一個16進制的數,或者是轉換為二進制的16位序列(若不足16位,以0補完)
如glLineStipple (1, 0x0101);? /*? dotted? */
從低位開始(即右側的1開始),如果是1則繪制像素,0則留空
第一個參數是擴展因子,如上factor設置為2的話,那么將繪制2個像素,14個留空,可以觀察下面效果以了解擴展因子,效果如下
如下示例4
glEnable (GL_LINE_STIPPLE);glColor3f (0.0, 0.0, 0.0);glLineStipple (1, 0x0101); /* dotted */drawOneLine (50.0, 125.0, 150.0, 125.0);glLineStipple (1, 0x00FF); /* dashed */drawOneLine (150.0, 125.0, 250.0, 125.0);glLineStipple (1, 0x1C47); /* dash/dot/dash */drawOneLine (250.0, 125.0, 350.0, 125.0);///* in 2nd row, 3 wide lines, each with different stipple */glLineWidth (5.0);glLineStipple (1, 0x0101); /* dotted */drawOneLine (50.0, 100.0, 150.0, 100.0);glLineStipple (1, 0x00FF); /* dashed */drawOneLine (150.0, 100.0, 250.0, 100.0);glLineStipple (1, 0x1C47); /* dash/dot/dash */drawOneLine (250.0, 100.0, 350.0, 100.0);glLineWidth (1.0); ///* in 4th row, 6 independent lines with same stipple */for (i = 0; i < 6; i++) {drawOneLine (50.0 + ((GLfloat) i * 50.0), 50.0,50.0 + ((GLfloat)(i+1) * 50.0), 50.0);} // ///* in 5th row, 1 line, with dash/dot/dash stipple */ ///* and a stipple repeat factor of 5 */glLineStipple (5, 0x1C47); /* dash/dot/dash */drawOneLine (50.0, 25.0, 350.0, 25.0);glDisable (GL_LINE_STIPPLE);效果如下
狀態管理
在繪制點畫線時,必須先開啟其效果(glEnable),在使用完畢后關閉效果(glDisable )
如上面代碼,在最開始的時候則調用glEnable (GL_LINE_STIPPLE)方法,結束后則調用glDisable (GL_LINE_STIPPLE);
GL_LINE_STRIP和GL_LINE_LOOP
GL_LINE_STRIP用于點之間的連線,GL_LINE_LOOP則在STRIP的基礎上同時將第1個點和最后一個點連起來
示例5
void drawLineStrip() {glColor3f (0.0, 0.0, 0.0);glPointSize(5);glBegin(GL_LINE_STRIP);glVertex2i(20,20);glVertex2i(30,50);glVertex2i(100,80);glVertex2i(120,40);glVertex2i(10,40);glEnd (); }?
如果換成GL_LINE_LOOP則效果如下
這篇將沒講完的幾個類型講完
畫三角形
畫三角形以不同頂點的連接有三種方式,但都是內部填充的方式
這里就不自己畫了,上面的例子已經可以充分表達了
畫四邊形
有兩種方式
其區別與畫三角形相同,只不過STRIP是隔了2個頂點
畫多邊形
GL_POLYGON用于畫多邊形
多邊形無法繪制非凸多邊形,如下圖
但可以用glPolygonMode函數改變多邊形繪制的模式,繪制其輪廓
void drawpolygon() {glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);glColor3f (0.0, 0.0, 0.0);glBegin(GL_POLYGON);glVertex2i(20,20);glVertex2i(30,10);glVertex2i(100,50);glVertex2i(120,100);glVertex2i(50,120);glVertex2i(50,60);glEnd (); }效果如下
轉載于:https://www.cnblogs.com/Clingingboy/archive/2010/10/16/1853219.html
總結
以上是生活随笔為你收集整理的OpenGL 学习笔记(3)绘制几何物体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]ColorMatrixFilter
- 下一篇: web窗体的基本控件