歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenGL超級寶典學習筆記——畫直線

OpenGL超級寶典學習筆記——畫直線

日期:2017/3/1 9:32:29   编辑:Linux編程

3D中畫直線

在3D中畫直線需要指定兩個頂點。如下代碼:會在兩點之間畫一條直線

glBegin(GL_LINES);

glVertex3f(0.0f, 0.0f, 0.0f);

glVertex3f(50.0f, 25.0f, 0.0f);

glEnd();

這裡用兩個頂點指定了一個圖元。注意如果為GL_LINES指定奇數個頂點,那麼最後一個頂點將被忽略。

static void RenderScene()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0f, 1.0f, 0.0f);

GLfloat x, y, z, angle;

z = -50.0f;

//畫線

glBegin(GL_LINES);

for (angle = 0.0f; angle <= 2*GL_PI*3; angle +=0.5f)

{

x = 50.0f * cos(angle);

y = 50.0f * sin(angle);

//設置兩個頂點

glVertex3f(0.0f, 0.0f, 0.0f);

glVertex3f(x, y, z);

z += 0.5f;

}

glEnd();

glutSwapBuffers();

}

效果如下圖:


連續的線以及線環

繪制一條連續的線,使用GL_LINE_STRIP,會繪制一條經過所有這些頂點的連續的線。實例如下:

glBegin(GL_LINE_STRIP);

glVertex3f(0.0f, 0.0f, 0.0f);

glVertex3f(50.0f, 50.0f, 0.0f);

glVertex3f(50.0f, 100.0f, 0.0f);

glEnd();

GL_LINE_LOOP,與GL_LINE_STRIP相似。只是最後一個頂點和第一個頂點之間也會繪制一條直線,形成閉合的線。

用直線繪制近似的曲線

繪制近似曲線可以使用GL_LINE_STRIP來鏈接所有的點。當點之間的距離越來越近時,就可以形成一條平滑的曲線。示例如下:

//繪制場景

static void RenderSences()

{

GLfloat z = -50.0f;

//清空畫布

glClear(GL_COLOR_BUFFER_BIT);

//設置畫圖使用的顏色

glColor3f(1.0f, 0.0f, 0.0f);

//保存矩陣

glPushMatrix();

//旋轉, 如果不旋轉,那些不同層次的點都重疊在一起,看不出3D效果了。

glRotatef(200.0f, 1.0f, 0.0f, 0.0f);

glRotatef(120.5f, 0.0f, 1.0f, 0.0f);

glBegin(GL_LINE_STRIP);

for (GLfloat a = 0.0; a < GL_PI * 3.0f; a += 0.1f)

{

GLfloat x = 50.0f * cos(a);

GLfloat y = 50.0f * sin(a);

//設置點的大小

//設置頂點

glVertex3f(x, y, z);

//調整z值

z += 0.5f;

}

glEnd();

glPopMatrix();

glFlush();

}


設置直線的寬度

與設置點的寬度類似,我們也可以設置直線的寬度。但直線的寬度設置也是有限制的。我們可以取得直線寬度的范圍,以及其寬度增長的最小間隔。

代碼如下

GLfloat width[2]; //存儲直線的寬度范圍
GLfloat step; //存儲受支持的直線寬度增量

//獲取受支持的直線寬度范圍和增量
glGetFloatv(GL_LINE_WIDTH_RANGE, width);
glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step);

示例:

static void RenderScene()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0f, 1.0f, 0.0f);

//獲取直線的寬度

GLfloat width[2];

GLfloat step;

glGetFloatv(GL_LINE_WIDTH_RANGE, width);

glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step);

GLfloat y, curWidht;

curWidht = width[0];

curWidht += step;

//畫線

for (y = 80.0f; y > -80.0f; y -= 10.0f)

{

glLineWidth(curWidht);

curWidht += step;

glBegin(GL_LINES);

glVertex2f(-50.0f, y);

glVertex2f(50.0f, y);

glEnd();

}

glutSwapBuffers();

}


直線點畫

使用點線或虛線模式來繪制直線,稱為點畫。啟用點畫模式glEnable(GL_LINE_STIPPLE);

然後可以使用glLineStipple函數創建這種模式。

C Specification

void glLineStipple(
GLint
factor,

GLushort
pattern);

其中pattern參數是一個16位的值, 它指定了一個模式,供繪直線所用。它的每個位都表示線段的一部分是畫還是不畫。在默認情況下,每個位對應一個像素,但factor參數可以作為乘法因子增加模式的寬度。例如把factor設置為5會導致模式中的每個位代表一行中的連續5個像素。模式的第0位(最低有效位)首先被用於指定直線。

注意:模式的順序是反過來的,這樣的原因是OpenGL左移一位獲得下一個掩碼值的速度更快。

例子:

static void RenderScene()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0f, 1.0f, 0.0f);

//開啟stipple模式

glEnable(GL_LINE_STIPPLE);

GLfloat y;

GLint factor = 1;

GLushort patter = 0x5555;

//畫線

for (y = 80.0f; y > -80.0f; y -= 10.0f)

{

//設置因子和模式

glLineStipple(factor, patter);

glBegin(GL_LINES);

glVertex2f(-50.0f, y);

glVertex2f(50.0f, y);

glEnd();

factor++;

}

glutSwapBuffers();

}

示例代碼地址:https://github.com/sweetdark/openglex/tree/master/drawline

OpenGL超級寶典 第4版 中文版PDF+英文版+源代碼 見 http://www.linuxidc.com/Linux/2013-10/91413.htm

OpenGL編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm

OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm

Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm

OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm

Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm

如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm

更多《OpenGL超級寶典學習筆記》相關知識 見 http://www.linuxidc.com/search.aspx?where=nkey&keyword=34581

Copyright © Linux教程網 All Rights Reserved