OpenGL學習筆記——點、線、面的繪製

3D圖象中最小單位被稱爲圖元,包括點、線和麪。
:點是最基本的圖元,在PyOpenGL中表示方法:

glVertex(x, y, [z], [w])

最多可以使用4個參數,其中2D就是 glVertex2f(x, y), 3D就是 glVertex3f(x, y, z)



繪製圖元

OpenGL的所有指令都必須包含在glBegin()、glEnd()函數之間!比如:

glBegin(MODE)
glVertex2f(x1, y1)
glVertex2f(x2, y2)
...
glEnd()

參數MODE爲繪製對象的類型,包含以下情況

MODE 描述
GL_POINTS 單個頂點集
GL_lines 線段集合
GL_LINE_STRIP 不閉合連續線段
GL_LINE_LOOP 閉合的線段
GL_POLYGON 多邊形
GL_TRIANGLES 獨立三角形集合
GL_TRANGLE_STRIP 三角形串,線性連續
GL_TRIANGLE_FAN 三角形串,扇形連續
GL_QUADS 獨立四邊形集合
GL_QUAD_STRIP 四邊形串

可以參考下面這張圖,注意,glBegin和glEnd之間點的順序爲逆時針排列



繪製實例

實例1:繪製點、線、四邊形和多邊形

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import numpy as np 

def circle(x, y, r, n):
	"""返回一個圓上點的集合"""
	theta = np.linspace(0, 2*np.pi, n)	# 返回一個列表
	x += r*np.cos(theta)				# x, y也爲列表
	y += r*np.sin(theta)
	return x, y

def init():
	glClearColor(0.0, 0.0, 0.0, 1.0)	# 設置背景色
	gluOrtho2D(-1.0, 1.0, -1.0, 1.0)	# 設置座標

def drawFunc():
	glClear(GL_COLOR_BUFFER_BIT)

	glBegin(GL_LINES)
	glVertex2f(-1.0, 0.0)		# 繪製橫線
	glVertex2f(1.0, 0.0)
	glVertex2f(0.0, -1.0)		# 繪製豎線
	glVertex2f(0.0, 1.0)
	glEnd()

	glPointSize(8.0)			# 繪製點
	glBegin(GL_POINTS)
	glColor3f(1.0, 0.0, 0.0)
	glVertex2f(-0.5, 0.7)
	glColor3f(0.0, 1.0, 0.0)
	glVertex2f(-0.7, 0.4)
	glColor3f(0.5, 0.5, 1.0)
	glVertex2f(-0.3, 0.4)
	glEnd()

	glPointSize(3.0)			# 繪製圓
	glColor3f(1.0, 0.5, 0.5)
	glBegin(GL_POINTS)
	#glBegin(GL_LINE_LOOP)
	x, y = circle(0.5, 0.5, 0.4, 100)
	for a, b in zip(x, y):
		glVertex2f(a, b)
	glEnd()

	glColor3f(1.0, 0.8, 0.5)	# 繪製獨立四邊形
	glBegin(GL_QUADS)
	glVertex2f(-0.7, -0.3)
	glVertex2f(-0.3, -0.3)
	glVertex2f(-0.3, -0.7)
	glVertex2f(-0.7, -0.7)
	glEnd()

	glColor3f(0.6, 1.0, 1.0)	# 繪製多邊形
	glPolygonMode(GL_FRONT, GL_FILL)
	glPolygonMode(GL_BACK, GL_LINE)
	glBegin(GL_POLYGON)
	glVertex2f(0.5, -0.1)
	glVertex2f(0.2, -0.3)
	glVertex2f(0.2, -0.6)
	glVertex2f(0.5, -0.8)
	glVertex2f(0.8, -0.6)
	glVertex2f(0.8, -0.3)
	glEnd()
	
	glFlush()


glutInit()
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE)
glutInitWindowSize(600, 600)
glutInitWindowPosition(400, 100)
glutCreateWindow("Draw")
init()
glutDisplayFunc(drawFunc)
glutMainLoop()

繪製結果:(用的都是我喜歡的顏色😁)


代碼說明

初始化
gluOrtho2D(left, right, bottom, top):參數分別代表了窗口的邊界座標,座標範圍越大,我們看到的東西越多,但看到的也就越小

分割線
這裏沒有指定顏色,默認背景色爲黑,前景色爲白色

glBegin(GL_LINES)
	glVertex2f(-1.0, 0.0)		# 繪製橫線
	glVertex2f(1.0, 0.0)
	glVertex2f(0.0, -1.0)		# 繪製豎線
	glVertex2f(0.0, 1.0)
	glEnd()

左上區域
這裏繪製了3個點,每個點大小爲8個像素8px

右上區域
circle()函數:6-11行中circle函數用於採集以(x, y)爲圓心,以r爲半徑的圓上的點,採集n個點,採樣以theta角度爲間隔,返回值x, y爲列表;使用GL_LINE_LOOP模式繪製閉合曲線圓

def circle(x, y, r, n):
	"""返回一個圓上點的集合"""
	theta = np.linspace(0, 2*np.pi, n)	# 返回一個列表
	x += r*np.cos(theta)				# x, y也爲列表
	y += r*np.sin(theta)
	return x, y

	x, y = circle(0.5, 0.5, 0.4, 100)
	for a, b in zip(x, y):
		glVertex2f(a, b)

右下區域
55-56行這裏使用了兩行語句說明是否填充,glPolygonMode()指定了如何繪製面的方式:
GL_LINE爲只畫線
GL_FILL則是默認的填充

glPolygonMode(GL_FRONT, GL_FILL)
glPolygonMode(GL_BACK, GL_LINE)


實例2:繪製二次曲線,修改init()和drawFuc()函數

def init():
	glClearColor(1.0, 1.0, 1.0, 1.0)
	gluOrtho2D(-5.0, 5.0, -5.0, 5.0)

def drawFuc():
	glClear(GL_COLOR_BUFFER_BIT)
	glPointSize(3.0)

	glColor3f(0.5, 0.5, 0.5)
	glBegin(GL_LINES)
	glVertex2f(-5.0, 0.0)
	glVertex2f(5.0, 0.0)
	glVertex2f(0.0, -5.0)
	glVertex2f(0.0, 5.0)
	glEnd()

	glColor3f(0.0, 0.0, 0.0)
	glBegin(GL_POINTS)
	for x in (i*0.1 for i in range(-50, 50)):
		y = x**2
		glVertex2f(x, y)
	glEnd()
	glFlush()

繪製結果:

對圖元的繪製學習到這裏就結束了,可以自行嘗試繪製其他類型的圖元~



完結 cheers 🍻
參考:目光博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章