這節開始前我們先了解一下圖元的概念。圖形軟件包中用來描述各種圖形元素的函數稱為圖形輸出原語,也稱圖元(primitive)。而描述對象幾何要素的輸出圖元一般稱為幾何圖元。點和線是最簡單的幾何圖元,本節就會簡單介紹點和線段的繪制方法。
一、坐標系統。
坐標系統一般分為屏幕坐標和OpenGL中的繪圖坐標。
在上一節中我們簡單的寫了個示例程序,程序中介紹了gluOrtho2D命令。我們可以利用該命令設定一個二維笛卡爾坐標系。該函數的四個變量制定的是顯示圖形x和y坐標范圍。所以我們可以使用下面代碼制定一個正交投影的二維坐標系:
glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 800.0, 0.0, 600.0);
在建立圖形的幾何描述時,所有OpenGL圖元的位置必須用gluOrtho2D函數定義的坐標系統中的絕對坐標給出。
二、OpenGL畫點函數
使用下面的函數可以指定一個點的位置和坐標:
glVertex* ();這里*號表示該函數需要有后綴碼,這些后綴碼用來指明空間的尺寸、坐標值的數據類型和可能的向量形式坐標描述。
在上一節我們看到繪制圖形時使用如下代碼:
glBegin(GL_POINTS); glVertex2i(700, 15); glVertex2i(100, 555); glEnd();glBegin();函數用來指定要顯示的圖元類型,在繪制點的時候,圖元類型常量是:GL_POINTS,begin和end之間必須有glVertex*();函數。用於指定數值的數據類型的后綴是:i(整數)、s(短整數)、f(浮點數)、d(雙精度浮點數)。下面例子中我們繪制了三個點:
glBegin(GL_POINTS); glVertex2i(25, 25); glVertex2i(50, 50); glVertex2i(100, 100); glEnd();換一種方法,我們可以用矩陣來描述點:
int p1[]{25, 25}; int p2[]{50, 50}; int p3[]{100, 100}; glBegin(GL_POINTS); glVertex2iv(p1); glVertex2iv(p2); glVertex2iv(p3); glEnd();最后,繪制點的完整代碼為:
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <string> #include <windows.h> #include <GL\glut.h> using namespace std; void piontSegment(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); //通過點繪制 glBegin(GL_POINTS); glVertex2i(25, 25); glVertex2i(50, 50); glVertex2i(100, 100); glEnd(); //通過矩陣繪制 /*int p1[]{25, 25}; int p2[]{50, 50}; int p3[]{100, 100}; glBegin(GL_POINTS); glVertex2iv(p1); glVertex2iv(p2); glVertex2iv(p3); glEnd();*/ glFlush(); } int _tmain(int argc, char **argv) { glutInit(&argc, argv); //設置窗口的緩存和顏色模型 //下面指定的是:窗口使用單個緩存並且使用RGB顏色模型來設定顏色值。 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //設置窗口左上角的位置 glutInitWindowPosition(400, 200); //設置窗口的寬高 glutInitWindowSize(800, 600); glutCreateWindow("Test OpenGL Program"); //設置顯示窗口的背景為白色。參數順序為:紅、綠、藍、透明度。 glClearColor(1.0, 1.0, 1.0, 0.0); //設置投影類型:正投影 glMatrixMode(GL_PROJECTION); glLoadIdentity(); //觀察參數:x坐標值從0到200,y是從0到150 gluOrtho2D(0.0, 800.0, 0.0, 600.0); glutDisplayFunc(piontSegment); glutMainLoop(); system("pause"); return 0; }三、畫線函數
上節我們就寫了個簡單的畫線函數GL_LINES,使用GL_LINES可以連接一對相鄰端點完成一條直線段,如果描述端點的坐標只有一個則社么都不會顯示,如果端點數為奇數那么最后一個點將被舍棄。如下代碼:
glBegin(GL_LINES); glVertex2i(700, 15); glVertex2i(100, 555); glVertex2i(50, 150); glVertex2i(400, 500); glVertex2i(10, 400); glEnd();最后一個點(80,400)將會被舍棄,輸出的圖形將會如下:
使用OpenGL的圖元常量GL_LINE_STRIP時,我們可以獲得折線,即會按照端點順序進行連接,直到最后一個端點,代碼如下:
glBegin(GL_LINE_STRIP); glVertex2i(700, 15); glVertex2i(100, 555); glVertex2i(50, 150); glVertex2i(400, 500); glVertex2i(10, 400); glEnd();繪制的圖形如下:
接着是最后一個常量參數:GL_LINE_LOOP和上一個不同點就是它會把最后一個點和第一個點相連,組成一個循環,代碼:
glBegin(GL_LINE_LOOP); glVertex2i(700, 15); glVertex2i(100, 555); glVertex2i(50, 150); glVertex2i(400, 500); glVertex2i(10, 400); glEnd();生成的圖形如下:
這樣點和線我們都能繪制了,下節我們將會介紹一下畫線算法。
參考內容:《計算機圖形學(第三版)》 電子工業出版社
轉載請標明出處:http://blog.csdn.net/letthinking/article/details/39161019