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

OpenGL超級寶典學習筆記——空間繪圖畫點

3D概念

  1. 像素,計算機顯示器中的最小元素。
  2. 3D畫布,把可視區域看成一個3維的畫布,可以用OpenGL命令在上面進行繪圖。例如:glOrtho可以設置一個長方體的可視區域。謹記第二章說的:glOrtho是對之前的矩陣進行運算,所以一般都會在此函數之前調用glMatrixMode(GL_PROJECTION); glLoadIdentity();

3D空間中的頂點

我們可以通過glVertex這個函數來設置多個參數多個類型的點。例如:glVertex2f(0.0f, 1.0f); glVertex3f(1.0f, 0.5f, 0.0f);

在圖形學中點不僅僅是一個點, OpenGL如何解釋一個點,決定了根據這個點畫出的幾何圖元。這裡的點一般是圖元中的頂點,比如矩形的頂點,曲線的頂點,線段的端點等。我們可以通過glBegin(GLenum mode); glEnd(); 來說明這兩個函數之間頂點應當如何被解釋。glBegin,glEnd像似{} 在此區域內的點將被解釋。例如:

 

//畫點
glBegin(GL_POINTS);
glVertex2f(3.0f, 4.0f);
glVertex2f(5.0f, 8.0f);
glEnd()
//畫線,偶數2n個點畫成 n條直線 2n+1奇數個的話,最後一個將被忽略
glBegin(GL_LINES);
glVertex2f(3.0f, 4.0f);
glVertex2f(5.0f, 8.0f);
glVertex2f(7.0f, 12.0f);//此點將被忽略
glEnd();
注意glBegin()和glEnd()之間的縮進,這樣是為了更容易尋找頂點源。是不成文的約定。
 

繪制圖形

我們知道如何在OpenGL中指定一個點,並且告訴OpenGL如何對它進行操作。頂點的幾何定義不僅僅是空間中的一個點,而是兩條直線或曲線的交點。這就是圖元的本質。

圖元是頂點的集合,它們構成了在屏幕上所繪制的形狀。

例子:

用簡單的三角方法繪制一些點,使它們繞著z軸呈現螺旋狀。

#include 

  

  
 
   
 
   
#include
#include

static GLfloat GL_PI = 3.14159f;

//繪制場景
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);
//獲取點的大小的范圍,以及增長的步長
GLfloat size[2];
GLfloat sizeStep;
glGetFloatv(GL_POINT_SIZE_RANGE, size);
glGetFloatv(GL_POINT_SIZE_GRANULARITY, &sizeStep);
GLfloat curStep = size[0];
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);
//設置點的大小
glPointSize(curStep);
curStep += sizeStep;
//設置頂點
glBegin(GL_POINTS);
glVertex3f(x, y, z);
glEnd();
//調整z值
z += 0.5f;
}
glPopMatrix();
glFlush();
}

void ChangeSize(GLsizei w, GLsizei h)
{
GLfloat nRange = 100.0f;
if (h == 0)
{
h = 1;
}
//設置視口
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

//設置可視區域
GLfloat aspect = (GLfloat)w / (GLfloat)h;
if (w <= h)
{
glOrtho(-nRange, nRange, -nRange/aspect, nRange/aspect, -nRange, nRange);
}
else
{
glOrtho(-nRange*aspect, nRange*aspect, -nRange, nRange, -nRange, nRange);
}

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//初始化工作
static void SetupRC()
{
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
}
//創建窗口
static void CreateWindow() {
glutInitWindowSize(200, 200);
glutCreateWindow( "3d Points");
}

int main( int args, char **argv)
{
glutInit(&args, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(200, 200);
glutCreateWindow( "draw points");
SetupRC();
glutDisplayFunc(RenderSences);
glutReshapeFunc(ChangeSize);
glutMainLoop();
return 0;
}

點的大小如果不指定的畫,默認是1。點的大小的設置是存在限制的,不同的實現限制不同。可以通過

glGetFloatv(GL_POINT_SIZE_RANGE, size);

獲得點的大小的范圍,size[0]為最小值,size[1]為最大值。

通過  glGetFloatv(GL_POINT_SIZE_GRANULARITY, &sizeStep); 獲得點大小之間的最小間隔。

PS:點和其他的幾何圖元不同,點不受透視除法的影響,即點離觀察點近或遠並不影響點最終投影到2d屏幕上的大小。另外點總是正方形的元素。為了獲得圓點,必須在抗鋸齒模式下繪制點。

另外需要注意的是glPointSize必須在glBegin和glEnd之外調用,並不是所有的函數在glBegin和glEnd之間調用都是合法的。 glPointSize所指定的點的大小並不是以像素為單位的,而是一個圓的近似直徑,這個圓包含了這個點所使用的像素。

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