歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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