計算機圖形學和OpenGL(二)坐標系和繪制點線函數


這節開始前我們先了解一下圖元的概念。圖形軟件包中用來描述各種圖形元素的函數稱為圖形輸出原語,也稱圖元(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM